]> git-server-git.apps.pok.os.sepia.ceph.com Git - rocksdb.git/commitdiff
Add a simple example of backup and restore (#10054)
authoryite.gu <ess_gyt@qq.com>
Sat, 4 Jun 2022 06:25:31 +0000 (23:25 -0700)
committerFacebook GitHub Bot <facebook-github-bot@users.noreply.github.com>
Sat, 4 Jun 2022 06:25:31 +0000 (23:25 -0700)
Summary:
Add a simple example of backup and restore

Signed-off-by: YiteGu <ess_gyt@qq.com>
Pull Request resolved: https://github.com/facebook/rocksdb/pull/10054

Reviewed By: jay-zhuang

Differential Revision: D36678141

Pulled By: ajkr

fbshipit-source-id: 43545356baddb4c2c76c62cd63d7a3238d1f8a00

examples/Makefile
examples/rocksdb_backup_restore_example.cc [new file with mode: 0644]

index 2fd162136c3ff8ba680a0e6b51c676e6ece039ea..b056508a6c3f25c8c5f2b893d2d114309f240c5e 100644 (file)
@@ -16,7 +16,7 @@ CFLAGS += -Wstrict-prototypes
 
 .PHONY: clean librocksdb
 
-all: simple_example column_families_example compact_files_example c_simple_example optimistic_transaction_example transaction_example compaction_filter_example options_file_example
+all: simple_example column_families_example compact_files_example c_simple_example optimistic_transaction_example transaction_example compaction_filter_example options_file_example rocksdb_backup_restore_example
 
 simple_example: librocksdb simple_example.cc
        $(CXX) $(CXXFLAGS) $@.cc -o$@ ../librocksdb.a -I../include -O2 -std=c++17 $(PLATFORM_LDFLAGS) $(PLATFORM_CXXFLAGS) $(EXEC_LDFLAGS)
@@ -48,8 +48,11 @@ options_file_example: librocksdb options_file_example.cc
 multi_processes_example: librocksdb multi_processes_example.cc
        $(CXX) $(CXXFLAGS) $@.cc -o$@ ../librocksdb.a -I../include -O2 -std=c++17 $(PLATFORM_LDFLAGS) $(PLATFORM_CXXFLAGS) $(EXEC_LDFLAGS)
 
+rocksdb_backup_restore_example: librocksdb rocksdb_backup_restore_example.cc
+       $(CXX) $(CXXFLAGS) $@.cc -o$@ ../librocksdb.a -I../include -O2 -std=c++17 $(PLATFORM_LDFLAGS) $(PLATFORM_CXXFLAGS) $(EXEC_LDFLAGS)
+
 clean:
-       rm -rf ./simple_example ./column_families_example ./compact_files_example ./compaction_filter_example ./c_simple_example c_simple_example.o ./optimistic_transaction_example ./transaction_example ./options_file_example ./multi_processes_example
+       rm -rf ./simple_example ./column_families_example ./compact_files_example ./compaction_filter_example ./c_simple_example c_simple_example.o ./optimistic_transaction_example ./transaction_example ./options_file_example ./multi_processes_example ./rocksdb_backup_restore_example
 
 librocksdb:
        cd .. && $(MAKE) static_lib
diff --git a/examples/rocksdb_backup_restore_example.cc b/examples/rocksdb_backup_restore_example.cc
new file mode 100644 (file)
index 0000000..c833ed1
--- /dev/null
@@ -0,0 +1,99 @@
+// Copyright (c) 2011-present, Facebook, Inc.  All rights reserved.
+//  This source code is licensed under both the GPLv2 (found in the
+//  COPYING file in the root directory) and Apache 2.0 License
+//  (found in the LICENSE.Apache file in the root directory).
+
+#include <cstdio>
+#include <string>
+#include <vector>
+
+#include "rocksdb/db.h"
+#include "rocksdb/options.h"
+#include "rocksdb/utilities/backup_engine.h"
+
+using ROCKSDB_NAMESPACE::BackupEngine;
+using ROCKSDB_NAMESPACE::BackupEngineOptions;
+using ROCKSDB_NAMESPACE::BackupEngineReadOnly;
+using ROCKSDB_NAMESPACE::BackupInfo;
+using ROCKSDB_NAMESPACE::DB;
+using ROCKSDB_NAMESPACE::Env;
+using ROCKSDB_NAMESPACE::Options;
+using ROCKSDB_NAMESPACE::ReadOptions;
+using ROCKSDB_NAMESPACE::Status;
+using ROCKSDB_NAMESPACE::WriteOptions;
+
+#if defined(OS_WIN)
+std::string kDBPath = "C:\\Windows\\TEMP\\rocksdb_example";
+#else
+std::string kDBPath = "/tmp/rocksdb_example";
+#endif
+
+int main() {
+  DB* db;
+  Options options;
+  // Optimize RocksDB. This is the easiest way to get RocksDB to perform well
+  options.IncreaseParallelism();
+  options.OptimizeLevelStyleCompaction();
+  // create the DB if it's not already present
+  options.create_if_missing = true;
+
+  // open DB
+  Status s = DB::Open(options, kDBPath, &db);
+  assert(s.ok());
+
+  // Put key-value
+  db->Put(WriteOptions(), "key1", "value1");
+  assert(s.ok());
+
+  // create backup
+  BackupEngine* backup_engine;
+  s = BackupEngine::Open(Env::Default(),
+                         BackupEngineOptions("/tmp/rocksdb_example_backup"),
+                         &backup_engine);
+  assert(s.ok());
+
+  backup_engine->CreateNewBackup(db);
+  assert(s.ok());
+
+  std::vector<BackupInfo> backup_info;
+  backup_engine->GetBackupInfo(&backup_info);
+
+  s = backup_engine->VerifyBackup(1);
+  assert(s.ok());
+
+  // Put key-value
+  db->Put(WriteOptions(), "key2", "value2");
+  assert(s.ok());
+
+  db->Close();
+  delete db;
+  db = nullptr;
+
+  // restore db to backup 1
+  BackupEngineReadOnly* backup_engine_ro;
+  s = BackupEngineReadOnly::Open(
+      Env::Default(), BackupEngineOptions("/tmp/rocksdb_example_backup"),
+      &backup_engine_ro);
+  assert(s.ok());
+
+  s = backup_engine_ro->RestoreDBFromBackup(1, "/tmp/rocksdb_example",
+                                            "/tmp/rocksdb_example");
+  assert(s.ok());
+
+  // open db again
+  s = DB::Open(options, kDBPath, &db);
+  assert(s.ok());
+
+  std::string value;
+  s = db->Get(ReadOptions(), "key1", &value);
+  assert(!s.IsNotFound());
+
+  s = db->Get(ReadOptions(), "key2", &value);
+  assert(s.IsNotFound());
+
+  delete backup_engine;
+  delete backup_engine_ro;
+  delete db;
+
+  return 0;
+}