This is an automated email from the ASF dual-hosted git repository.
wangdan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-pegasus.git
The following commit(s) were added to refs/heads/master by this push:
new 916c77414 refactor(simple_kv): use rocksdb API to read/write file
(#1622)
916c77414 is described below
commit 916c7741455fde3c8f1ec8a12a50bd1245bdfe45
Author: Yingchun Lai <[email protected]>
AuthorDate: Tue Sep 26 05:19:54 2023 -0500
refactor(simple_kv): use rocksdb API to read/write file (#1622)
https://github.com/apache/incubator-pegasus/issues/887
There is no functional changes, but only refactor the simple_kv module.
---
src/replica/storage/simple_kv/CMakeLists.txt | 2 +-
.../storage/simple_kv/simple_kv.server.impl.cpp | 127 +++++++++++++-------
src/replica/storage/simple_kv/test/CMakeLists.txt | 3 +-
src/replica/storage/simple_kv/test/case-000.ini | 3 +
src/replica/storage/simple_kv/test/case-001.ini | 3 +
src/replica/storage/simple_kv/test/case-002.ini | 3 +
src/replica/storage/simple_kv/test/case-003.ini | 3 +
src/replica/storage/simple_kv/test/case-004.ini | 3 +
src/replica/storage/simple_kv/test/case-005.ini | 3 +
src/replica/storage/simple_kv/test/case-006.ini | 3 +
src/replica/storage/simple_kv/test/case-100.ini | 3 +
src/replica/storage/simple_kv/test/case-101.ini | 3 +
src/replica/storage/simple_kv/test/case-102.ini | 3 +
src/replica/storage/simple_kv/test/case-103.ini | 3 +
src/replica/storage/simple_kv/test/case-104.ini | 3 +
src/replica/storage/simple_kv/test/case-105.ini | 3 +
src/replica/storage/simple_kv/test/case-106.ini | 3 +
src/replica/storage/simple_kv/test/case-107.ini | 3 +
src/replica/storage/simple_kv/test/case-108.ini | 3 +
src/replica/storage/simple_kv/test/case-109.ini | 3 +
src/replica/storage/simple_kv/test/case-200.ini | 3 +
src/replica/storage/simple_kv/test/case-201.ini | 3 +
src/replica/storage/simple_kv/test/case-202-0.ini | 3 +
src/replica/storage/simple_kv/test/case-202-1.ini | 3 +
src/replica/storage/simple_kv/test/case-203-0.ini | 3 +
src/replica/storage/simple_kv/test/case-204.ini | 3 +
src/replica/storage/simple_kv/test/case-205.ini | 3 +
src/replica/storage/simple_kv/test/case-206.ini | 3 +
src/replica/storage/simple_kv/test/case-207.ini | 3 +
src/replica/storage/simple_kv/test/case-208.ini | 3 +
src/replica/storage/simple_kv/test/case-209.ini | 3 +
src/replica/storage/simple_kv/test/case-210.ini | 3 +
src/replica/storage/simple_kv/test/case-211.ini | 3 +
src/replica/storage/simple_kv/test/case-212.ini | 3 +
src/replica/storage/simple_kv/test/case-213.ini | 3 +
src/replica/storage/simple_kv/test/case-214.ini | 3 +
src/replica/storage/simple_kv/test/case-215.ini | 3 +
src/replica/storage/simple_kv/test/case-216.ini | 3 +
src/replica/storage/simple_kv/test/case-300-0.ini | 3 +
src/replica/storage/simple_kv/test/case-300-1.ini | 3 +
src/replica/storage/simple_kv/test/case-300-2.ini | 3 +
src/replica/storage/simple_kv/test/case-301.ini | 3 +
src/replica/storage/simple_kv/test/case-302.ini | 3 +
src/replica/storage/simple_kv/test/case-303.ini | 3 +
src/replica/storage/simple_kv/test/case-304.ini | 3 +
src/replica/storage/simple_kv/test/case-305.ini | 3 +
src/replica/storage/simple_kv/test/case-306.ini | 3 +
src/replica/storage/simple_kv/test/case-307.ini | 3 +
src/replica/storage/simple_kv/test/case-400.ini | 3 +
src/replica/storage/simple_kv/test/case-401.ini | 3 +
src/replica/storage/simple_kv/test/case-402.ini | 3 +
src/replica/storage/simple_kv/test/case-600.ini | 3 +
src/replica/storage/simple_kv/test/case-601.ini | 3 +
src/replica/storage/simple_kv/test/case-602.ini | 3 +
src/replica/storage/simple_kv/test/case-603.ini | 3 +
src/replica/storage/simple_kv/test/run.sh | 8 ++
.../simple_kv/test/simple_kv.server.impl.cpp | 129 ++++++++++++++-------
57 files changed, 340 insertions(+), 85 deletions(-)
diff --git a/src/replica/storage/simple_kv/CMakeLists.txt
b/src/replica/storage/simple_kv/CMakeLists.txt
index cb7d328fc..667b4ab86 100644
--- a/src/replica/storage/simple_kv/CMakeLists.txt
+++ b/src/replica/storage/simple_kv/CMakeLists.txt
@@ -37,7 +37,7 @@ set(MY_PROJ_SRC ${SIMPLE_KV_THRIFT_SRCS})
# "GLOB" for non-recursive search
set(MY_SRC_SEARCH_MODE "GLOB")
-set(MY_PROJ_LIBS dsn_replica_server dsn_meta_server dsn_client dsn_runtime
hashtable)
+set(MY_PROJ_LIBS dsn_replica_server dsn_meta_server dsn_client dsn_runtime
hashtable rocksdb)
set(MY_BOOST_LIBS Boost::system Boost::filesystem Boost::regex)
diff --git a/src/replica/storage/simple_kv/simple_kv.server.impl.cpp
b/src/replica/storage/simple_kv/simple_kv.server.impl.cpp
index a019c0999..81a718a45 100644
--- a/src/replica/storage/simple_kv/simple_kv.server.impl.cpp
+++ b/src/replica/storage/simple_kv/simple_kv.server.impl.cpp
@@ -35,24 +35,36 @@
#include "simple_kv.server.impl.h"
+#include <fcntl.h>
+#include <fmt/core.h>
#include <inttypes.h>
+#include <rocksdb/slice.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <atomic>
-#include <fstream>
+#include <memory>
#include <utility>
#include <vector>
+#include "aio/aio_task.h"
+#include "aio/file_io.h"
+#include "common/replication.codes.h"
#include "consensus_types.h"
#include "replica/storage/simple_kv/simple_kv.server.h"
+#include "rocksdb/env.h"
+#include "rocksdb/status.h"
#include "runtime/serverlet.h"
#include "simple_kv_types.h"
+#include "utils/autoref_ptr.h"
+#include "utils/binary_reader.h"
+#include "utils/blob.h"
#include "utils/filesystem.h"
#include "utils/fmt_logging.h"
+#include "utils/ports.h"
+#include "utils/utils.h"
namespace dsn {
-class blob;
namespace replication {
class replica;
@@ -175,75 +187,104 @@ void simple_kv_service_impl::recover(const std::string
&name, int64_t version)
{
zauto_lock l(_lock);
- std::ifstream is(name.c_str(), std::ios::binary);
- if (!is.is_open())
- return;
+ std::unique_ptr<rocksdb::SequentialFile> rfile;
+ auto s = rocksdb::Env::Default()->NewSequentialFile(name, &rfile,
rocksdb::EnvOptions());
+ CHECK(s.ok(), "open log file '{}' failed, err = {}", name, s.ToString());
_store.clear();
- uint64_t count;
- int magic;
-
- is.read((char *)&count, sizeof(count));
- is.read((char *)&magic, sizeof(magic));
+ // Read header.
+ uint64_t count = 0;
+ int magic = 0;
+ rocksdb::Slice result;
+ static const uint64_t kHeaderSize = sizeof(count) + sizeof(magic);
+ char buff[kHeaderSize] = {0};
+ s = rfile->Read(kHeaderSize, &result, buff);
+ CHECK(s.ok(), "read header failed, err = {}", s.ToString());
+ CHECK(!result.empty(), "read EOF of file '{}'", name);
+
+ binary_reader reader(blob(buff, 0, kHeaderSize));
+ CHECK_EQ(sizeof(count), reader.read(count));
+ CHECK_EQ(sizeof(magic), reader.read(magic));
CHECK_EQ_MSG(magic, 0xdeadbeef, "invalid checkpoint");
+ // Read kv pairs.
for (uint64_t i = 0; i < count; i++) {
- std::string key;
- std::string value;
-
- uint32_t sz;
- is.read((char *)&sz, (uint32_t)sizeof(sz));
- key.resize(sz);
-
- is.read((char *)&key[0], sz);
-
- is.read((char *)&sz, (uint32_t)sizeof(sz));
- value.resize(sz);
-
- is.read((char *)&value[0], sz);
-
+ // Read key.
+ uint32_t sz = 0;
+ s = rfile->Read(sizeof(sz), &result, (char *)&sz);
+ CHECK(s.ok(), "read key size failed, err = {}", s.ToString());
+ CHECK(!result.empty(), "read EOF of file '{}'", name);
+
+ std::shared_ptr<char>
key_buffer(dsn::utils::make_shared_array<char>(sz));
+ s = rfile->Read(sz, &result, key_buffer.get());
+ CHECK(s.ok(), "read key failed, err = {}", s.ToString());
+ CHECK(!result.empty(), "read EOF of file '{}'", name);
+ std::string key = result.ToString();
+
+ // Read value.
+ s = rfile->Read(sizeof(sz), &result, (char *)&sz);
+ CHECK(s.ok(), "read value size failed, err = {}", s.ToString());
+ CHECK(!result.empty(), "read EOF of file '{}'", name);
+
+ std::shared_ptr<char>
value_buffer(dsn::utils::make_shared_array<char>(sz));
+ s = rfile->Read(sz, &result, value_buffer.get());
+ CHECK(s.ok(), "read value failed, err = {}", s.ToString());
+ CHECK(!result.empty(), "read EOF of file '{}'", name);
+ std::string value = result.ToString();
+
+ // Store the kv pair.
_store[key] = value;
}
- is.close();
}
::dsn::error_code simple_kv_service_impl::sync_checkpoint()
{
- char name[256];
int64_t last_commit = _last_committed_decree.load();
- sprintf(name, "%s/checkpoint.%" PRId64, _dir_data.c_str(), last_commit);
+ std::string fname = fmt::format("{}/checkpoint.{}", data_dir(),
last_commit);
zauto_lock l(_lock);
-
if (last_commit == last_durable_decree()) {
- CHECK(utils::filesystem::file_exists(name), "checkpoint file {} is
missing!", name);
+ CHECK(utils::filesystem::file_exists(fname), "checkpoint file {} is
missing!", fname);
return ERR_OK;
}
- std::ofstream os(name, std::ios::binary);
+ auto wfile = file::open(fname.c_str(), O_RDWR | O_CREAT | O_BINARY, 0666);
+ CHECK_NOTNULL(wfile, "");
+#define WRITE_DATA_SIZE(data, size)
\
+ do {
\
+ auto tsk = ::dsn::file::write(
\
+ wfile, (char *)&data, size, offset, LPC_AIO_IMMEDIATE_CALLBACK,
nullptr, nullptr); \
+ tsk->wait();
\
+ offset += size;
\
+ } while (false)
+
+#define WRITE_DATA(data) WRITE_DATA_SIZE(data, sizeof(data))
+
+ uint64_t offset = 0;
uint64_t count = (uint64_t)_store.size();
- int magic = 0xdeadbeef;
+ WRITE_DATA(count);
- os.write((const char *)&count, (uint32_t)sizeof(count));
- os.write((const char *)&magic, (uint32_t)sizeof(magic));
+ int magic = 0xdeadbeef;
+ WRITE_DATA(magic);
- for (auto it = _store.begin(); it != _store.end(); ++it) {
- const std::string &k = it->first;
+ for (const auto &kv : _store) {
+ const std::string &k = kv.first;
uint32_t sz = (uint32_t)k.length();
+ WRITE_DATA(sz);
+ WRITE_DATA_SIZE(k[0], sz);
- os.write((const char *)&sz, (uint32_t)sizeof(sz));
- os.write((const char *)&k[0], sz);
-
- const std::string &v = it->second;
+ const std::string &v = kv.second;
sz = (uint32_t)v.length();
-
- os.write((const char *)&sz, (uint32_t)sizeof(sz));
- os.write((const char *)&v[0], sz);
+ WRITE_DATA(sz);
+ WRITE_DATA_SIZE(v[0], sz);
}
+#undef WRITE_DATA
+#undef WRITE_DATA_SIZE
- os.close();
+ CHECK_EQ(ERR_OK, file::flush(wfile));
+ CHECK_EQ(ERR_OK, file::close(wfile));
// TODO: gc checkpoints
set_last_durable_decree(last_commit);
diff --git a/src/replica/storage/simple_kv/test/CMakeLists.txt
b/src/replica/storage/simple_kv/test/CMakeLists.txt
index 1d64070fb..de86358d0 100644
--- a/src/replica/storage/simple_kv/test/CMakeLists.txt
+++ b/src/replica/storage/simple_kv/test/CMakeLists.txt
@@ -39,7 +39,8 @@ set(MY_PROJ_LIBS dsn_replica_server
zookeeper
hashtable
gtest
- )
+ dsn_utils
+ rocksdb)
set(MY_BOOST_LIBS Boost::system Boost::filesystem Boost::regex)
diff --git a/src/replica/storage/simple_kv/test/case-000.ini
b/src/replica/storage/simple_kv/test/case-000.ini
index a05a95e53..4cb2b5545 100644
--- a/src/replica/storage/simple_kv/test/case-000.ini
+++ b/src/replica/storage/simple_kv/test/case-000.ini
@@ -148,6 +148,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-001.ini
b/src/replica/storage/simple_kv/test/case-001.ini
index 4f214ef80..08c42f699 100644
--- a/src/replica/storage/simple_kv/test/case-001.ini
+++ b/src/replica/storage/simple_kv/test/case-001.ini
@@ -148,6 +148,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-002.ini
b/src/replica/storage/simple_kv/test/case-002.ini
index d75bbc101..e883afcc0 100644
--- a/src/replica/storage/simple_kv/test/case-002.ini
+++ b/src/replica/storage/simple_kv/test/case-002.ini
@@ -148,6 +148,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-003.ini
b/src/replica/storage/simple_kv/test/case-003.ini
index 8d60d50d6..5ee053ad4 100644
--- a/src/replica/storage/simple_kv/test/case-003.ini
+++ b/src/replica/storage/simple_kv/test/case-003.ini
@@ -148,6 +148,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-004.ini
b/src/replica/storage/simple_kv/test/case-004.ini
index 5c74f7e28..a2eebf4ee 100644
--- a/src/replica/storage/simple_kv/test/case-004.ini
+++ b/src/replica/storage/simple_kv/test/case-004.ini
@@ -148,6 +148,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-005.ini
b/src/replica/storage/simple_kv/test/case-005.ini
index 4c8c84b32..1b7519741 100644
--- a/src/replica/storage/simple_kv/test/case-005.ini
+++ b/src/replica/storage/simple_kv/test/case-005.ini
@@ -148,6 +148,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-006.ini
b/src/replica/storage/simple_kv/test/case-006.ini
index 18e782b77..4a8d09e28 100644
--- a/src/replica/storage/simple_kv/test/case-006.ini
+++ b/src/replica/storage/simple_kv/test/case-006.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-100.ini
b/src/replica/storage/simple_kv/test/case-100.ini
index 0f601799a..69b06e672 100644
--- a/src/replica/storage/simple_kv/test/case-100.ini
+++ b/src/replica/storage/simple_kv/test/case-100.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-101.ini
b/src/replica/storage/simple_kv/test/case-101.ini
index 0f601799a..69b06e672 100644
--- a/src/replica/storage/simple_kv/test/case-101.ini
+++ b/src/replica/storage/simple_kv/test/case-101.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-102.ini
b/src/replica/storage/simple_kv/test/case-102.ini
index 8c3504778..4ac4bcc5f 100644
--- a/src/replica/storage/simple_kv/test/case-102.ini
+++ b/src/replica/storage/simple_kv/test/case-102.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-103.ini
b/src/replica/storage/simple_kv/test/case-103.ini
index 64a643dd0..3d70ea9c5 100644
--- a/src/replica/storage/simple_kv/test/case-103.ini
+++ b/src/replica/storage/simple_kv/test/case-103.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-104.ini
b/src/replica/storage/simple_kv/test/case-104.ini
index 0f601799a..69b06e672 100644
--- a/src/replica/storage/simple_kv/test/case-104.ini
+++ b/src/replica/storage/simple_kv/test/case-104.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-105.ini
b/src/replica/storage/simple_kv/test/case-105.ini
index 0f601799a..69b06e672 100644
--- a/src/replica/storage/simple_kv/test/case-105.ini
+++ b/src/replica/storage/simple_kv/test/case-105.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-106.ini
b/src/replica/storage/simple_kv/test/case-106.ini
index 0f601799a..69b06e672 100644
--- a/src/replica/storage/simple_kv/test/case-106.ini
+++ b/src/replica/storage/simple_kv/test/case-106.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-107.ini
b/src/replica/storage/simple_kv/test/case-107.ini
index 0f601799a..69b06e672 100644
--- a/src/replica/storage/simple_kv/test/case-107.ini
+++ b/src/replica/storage/simple_kv/test/case-107.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-108.ini
b/src/replica/storage/simple_kv/test/case-108.ini
index 0f601799a..69b06e672 100644
--- a/src/replica/storage/simple_kv/test/case-108.ini
+++ b/src/replica/storage/simple_kv/test/case-108.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-109.ini
b/src/replica/storage/simple_kv/test/case-109.ini
index d95415e37..9a1d88c69 100644
--- a/src/replica/storage/simple_kv/test/case-109.ini
+++ b/src/replica/storage/simple_kv/test/case-109.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-200.ini
b/src/replica/storage/simple_kv/test/case-200.ini
index 0f601799a..69b06e672 100644
--- a/src/replica/storage/simple_kv/test/case-200.ini
+++ b/src/replica/storage/simple_kv/test/case-200.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-201.ini
b/src/replica/storage/simple_kv/test/case-201.ini
index 0f601799a..69b06e672 100644
--- a/src/replica/storage/simple_kv/test/case-201.ini
+++ b/src/replica/storage/simple_kv/test/case-201.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-202-0.ini
b/src/replica/storage/simple_kv/test/case-202-0.ini
index a25eb9145..dabdf0154 100644
--- a/src/replica/storage/simple_kv/test/case-202-0.ini
+++ b/src/replica/storage/simple_kv/test/case-202-0.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-202-1.ini
b/src/replica/storage/simple_kv/test/case-202-1.ini
index a25eb9145..dabdf0154 100644
--- a/src/replica/storage/simple_kv/test/case-202-1.ini
+++ b/src/replica/storage/simple_kv/test/case-202-1.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-203-0.ini
b/src/replica/storage/simple_kv/test/case-203-0.ini
index 82d693aa9..42c9c006c 100644
--- a/src/replica/storage/simple_kv/test/case-203-0.ini
+++ b/src/replica/storage/simple_kv/test/case-203-0.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-204.ini
b/src/replica/storage/simple_kv/test/case-204.ini
index 9fde171e6..eb1a97a05 100644
--- a/src/replica/storage/simple_kv/test/case-204.ini
+++ b/src/replica/storage/simple_kv/test/case-204.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-205.ini
b/src/replica/storage/simple_kv/test/case-205.ini
index 9fde171e6..eb1a97a05 100644
--- a/src/replica/storage/simple_kv/test/case-205.ini
+++ b/src/replica/storage/simple_kv/test/case-205.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-206.ini
b/src/replica/storage/simple_kv/test/case-206.ini
index 9fde171e6..eb1a97a05 100644
--- a/src/replica/storage/simple_kv/test/case-206.ini
+++ b/src/replica/storage/simple_kv/test/case-206.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-207.ini
b/src/replica/storage/simple_kv/test/case-207.ini
index 9fde171e6..eb1a97a05 100644
--- a/src/replica/storage/simple_kv/test/case-207.ini
+++ b/src/replica/storage/simple_kv/test/case-207.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-208.ini
b/src/replica/storage/simple_kv/test/case-208.ini
index 9fde171e6..eb1a97a05 100644
--- a/src/replica/storage/simple_kv/test/case-208.ini
+++ b/src/replica/storage/simple_kv/test/case-208.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-209.ini
b/src/replica/storage/simple_kv/test/case-209.ini
index 9fde171e6..eb1a97a05 100644
--- a/src/replica/storage/simple_kv/test/case-209.ini
+++ b/src/replica/storage/simple_kv/test/case-209.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-210.ini
b/src/replica/storage/simple_kv/test/case-210.ini
index 23784c15f..a9dd9383c 100644
--- a/src/replica/storage/simple_kv/test/case-210.ini
+++ b/src/replica/storage/simple_kv/test/case-210.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-211.ini
b/src/replica/storage/simple_kv/test/case-211.ini
index 23784c15f..a9dd9383c 100644
--- a/src/replica/storage/simple_kv/test/case-211.ini
+++ b/src/replica/storage/simple_kv/test/case-211.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-212.ini
b/src/replica/storage/simple_kv/test/case-212.ini
index 4582c0787..a61a428f2 100644
--- a/src/replica/storage/simple_kv/test/case-212.ini
+++ b/src/replica/storage/simple_kv/test/case-212.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-213.ini
b/src/replica/storage/simple_kv/test/case-213.ini
index 103a599a6..660afcfff 100644
--- a/src/replica/storage/simple_kv/test/case-213.ini
+++ b/src/replica/storage/simple_kv/test/case-213.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-214.ini
b/src/replica/storage/simple_kv/test/case-214.ini
index 9fde171e6..eb1a97a05 100644
--- a/src/replica/storage/simple_kv/test/case-214.ini
+++ b/src/replica/storage/simple_kv/test/case-214.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-215.ini
b/src/replica/storage/simple_kv/test/case-215.ini
index 9fde171e6..eb1a97a05 100644
--- a/src/replica/storage/simple_kv/test/case-215.ini
+++ b/src/replica/storage/simple_kv/test/case-215.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-216.ini
b/src/replica/storage/simple_kv/test/case-216.ini
index 9fde171e6..eb1a97a05 100644
--- a/src/replica/storage/simple_kv/test/case-216.ini
+++ b/src/replica/storage/simple_kv/test/case-216.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-300-0.ini
b/src/replica/storage/simple_kv/test/case-300-0.ini
index 0f601799a..69b06e672 100644
--- a/src/replica/storage/simple_kv/test/case-300-0.ini
+++ b/src/replica/storage/simple_kv/test/case-300-0.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-300-1.ini
b/src/replica/storage/simple_kv/test/case-300-1.ini
index 0f601799a..69b06e672 100644
--- a/src/replica/storage/simple_kv/test/case-300-1.ini
+++ b/src/replica/storage/simple_kv/test/case-300-1.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-300-2.ini
b/src/replica/storage/simple_kv/test/case-300-2.ini
index 0f601799a..69b06e672 100644
--- a/src/replica/storage/simple_kv/test/case-300-2.ini
+++ b/src/replica/storage/simple_kv/test/case-300-2.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-301.ini
b/src/replica/storage/simple_kv/test/case-301.ini
index 0f601799a..69b06e672 100644
--- a/src/replica/storage/simple_kv/test/case-301.ini
+++ b/src/replica/storage/simple_kv/test/case-301.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-302.ini
b/src/replica/storage/simple_kv/test/case-302.ini
index 38d3a831f..fdfb94776 100644
--- a/src/replica/storage/simple_kv/test/case-302.ini
+++ b/src/replica/storage/simple_kv/test/case-302.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-303.ini
b/src/replica/storage/simple_kv/test/case-303.ini
index 04932bc94..db032f0a2 100644
--- a/src/replica/storage/simple_kv/test/case-303.ini
+++ b/src/replica/storage/simple_kv/test/case-303.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-304.ini
b/src/replica/storage/simple_kv/test/case-304.ini
index 0f601799a..69b06e672 100644
--- a/src/replica/storage/simple_kv/test/case-304.ini
+++ b/src/replica/storage/simple_kv/test/case-304.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-305.ini
b/src/replica/storage/simple_kv/test/case-305.ini
index 04932bc94..db032f0a2 100644
--- a/src/replica/storage/simple_kv/test/case-305.ini
+++ b/src/replica/storage/simple_kv/test/case-305.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-306.ini
b/src/replica/storage/simple_kv/test/case-306.ini
index 0f601799a..69b06e672 100644
--- a/src/replica/storage/simple_kv/test/case-306.ini
+++ b/src/replica/storage/simple_kv/test/case-306.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-307.ini
b/src/replica/storage/simple_kv/test/case-307.ini
index 0f601799a..69b06e672 100644
--- a/src/replica/storage/simple_kv/test/case-307.ini
+++ b/src/replica/storage/simple_kv/test/case-307.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-400.ini
b/src/replica/storage/simple_kv/test/case-400.ini
index 0f601799a..69b06e672 100644
--- a/src/replica/storage/simple_kv/test/case-400.ini
+++ b/src/replica/storage/simple_kv/test/case-400.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-401.ini
b/src/replica/storage/simple_kv/test/case-401.ini
index 0f601799a..69b06e672 100644
--- a/src/replica/storage/simple_kv/test/case-401.ini
+++ b/src/replica/storage/simple_kv/test/case-401.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-402.ini
b/src/replica/storage/simple_kv/test/case-402.ini
index 0f601799a..69b06e672 100644
--- a/src/replica/storage/simple_kv/test/case-402.ini
+++ b/src/replica/storage/simple_kv/test/case-402.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-600.ini
b/src/replica/storage/simple_kv/test/case-600.ini
index 18e782b77..4a8d09e28 100644
--- a/src/replica/storage/simple_kv/test/case-600.ini
+++ b/src/replica/storage/simple_kv/test/case-600.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-601.ini
b/src/replica/storage/simple_kv/test/case-601.ini
index 9a25f26cc..20ee3c8bf 100644
--- a/src/replica/storage/simple_kv/test/case-601.ini
+++ b/src/replica/storage/simple_kv/test/case-601.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-602.ini
b/src/replica/storage/simple_kv/test/case-602.ini
index 18e782b77..4a8d09e28 100644
--- a/src/replica/storage/simple_kv/test/case-602.ini
+++ b/src/replica/storage/simple_kv/test/case-602.ini
@@ -149,6 +149,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/case-603.ini
b/src/replica/storage/simple_kv/test/case-603.ini
index 1531c037f..563b86adf 100644
--- a/src/replica/storage/simple_kv/test/case-603.ini
+++ b/src/replica/storage/simple_kv/test/case-603.ini
@@ -151,6 +151,9 @@ arguments = localhost:34601
[meta_server]
server_list = localhost:34601
+[pegasus.server]
+encrypt_data_at_rest = false
+
[replication.app]
app_name = simple_kv.instance0
app_type = simple_kv
diff --git a/src/replica/storage/simple_kv/test/run.sh
b/src/replica/storage/simple_kv/test/run.sh
index b3daa127d..e10210fa4 100755
--- a/src/replica/storage/simple_kv/test/run.sh
+++ b/src/replica/storage/simple_kv/test/run.sh
@@ -112,6 +112,14 @@ else
fi
if [ ! -z "${cases}" ]; then
+ OLD_TEST_OPTS=${TEST_OPTS}
+ TEST_OPTS=${OLD_TEST_OPTS},encrypt_data_at_rest=false
+ for id in ${cases}; do
+ run_case ${id}
+ echo
+ done
+ # TODO(yingchun): ENCRYPTION: add enable encryption test.
+ # TEST_OPTS=${OLD_TEST_OPTS},encrypt_data_at_rest=true
for id in ${cases}; do
run_case ${id}
echo
diff --git a/src/replica/storage/simple_kv/test/simple_kv.server.impl.cpp
b/src/replica/storage/simple_kv/test/simple_kv.server.impl.cpp
index cf3f418f7..ae04a7f4e 100644
--- a/src/replica/storage/simple_kv/test/simple_kv.server.impl.cpp
+++ b/src/replica/storage/simple_kv/test/simple_kv.server.impl.cpp
@@ -25,22 +25,37 @@
*/
#include "simple_kv.server.impl.h"
+#include <fcntl.h>
+#include <fmt/core.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <fstream>
+#include <memory>
#include <utility>
#include <vector>
+#include "aio/aio_task.h"
+#include "aio/file_io.h"
#include "consensus_types.h"
+#include "rocksdb/env.h"
+#include "rocksdb/slice.h"
+#include "rocksdb/status.h"
#include "runtime/serverlet.h"
+#include "runtime/task/task_code.h"
#include "simple_kv_types.h"
+#include "utils/autoref_ptr.h"
+#include "utils/binary_reader.h"
+#include "utils/blob.h"
#include "utils/filesystem.h"
#include "utils/fmt_logging.h"
+#include "utils/ports.h"
+#include "utils/threadpool_code.h"
+#include "utils/utils.h"
+// TODO(yingchun): most of the code are the same as
+// src/replica/storage/simple_kv/simple_kv.server.impl.cpp, unify the code!
namespace dsn {
-class blob;
namespace replication {
class replica;
@@ -53,6 +68,8 @@ namespace dsn {
namespace replication {
namespace test {
+DEFINE_TASK_CODE(LPC_AIO_IMMEDIATE_CALLBACK, TASK_PRIORITY_COMMON,
dsn::THREAD_POOL_DEFAULT)
+
bool simple_kv_service_impl::s_simple_kv_open_fail = false;
bool simple_kv_service_impl::s_simple_kv_close_fail = false;
bool simple_kv_service_impl::s_simple_kv_get_checkpoint_fail = false;
@@ -173,34 +190,53 @@ void simple_kv_service_impl::recover(const std::string
&name, int64_t version)
{
dsn::zauto_lock l(_lock);
- std::ifstream is(name.c_str(), std::ios::binary);
- if (!is.is_open())
- return;
+ std::unique_ptr<rocksdb::SequentialFile> rfile;
+ auto s = rocksdb::Env::Default()->NewSequentialFile(name, &rfile,
rocksdb::EnvOptions());
+ CHECK(s.ok(), "open log file '{}' failed, err = {}", name, s.ToString());
_store.clear();
- uint64_t count;
- int magic;
-
- is.read((char *)&count, sizeof(count));
- is.read((char *)&magic, sizeof(magic));
+ // Read header.
+ uint64_t count = 0;
+ int magic = 0;
+ rocksdb::Slice result;
+ static const uint64_t kHeaderSize = sizeof(count) + sizeof(magic);
+ char buff[kHeaderSize] = {0};
+ s = rfile->Read(kHeaderSize, &result, buff);
+ CHECK(s.ok(), "read header failed, err = {}", s.ToString());
+ CHECK(!result.empty(), "read EOF of file '{}'", name);
+
+ binary_reader reader(blob(buff, 0, kHeaderSize));
+ CHECK_EQ(sizeof(count), reader.read(count));
+ CHECK_EQ(sizeof(magic), reader.read(magic));
CHECK_EQ_MSG(magic, 0xdeadbeef, "invalid checkpoint");
+ // Read kv pairs.
for (uint64_t i = 0; i < count; i++) {
- std::string key;
- std::string value;
-
- uint32_t sz;
- is.read((char *)&sz, (uint32_t)sizeof(sz));
- key.resize(sz);
-
- is.read((char *)&key[0], sz);
-
- is.read((char *)&sz, (uint32_t)sizeof(sz));
- value.resize(sz);
-
- is.read((char *)&value[0], sz);
-
+ // Read key.
+ uint32_t sz = 0;
+ s = rfile->Read(sizeof(sz), &result, (char *)&sz);
+ CHECK(s.ok(), "read key size failed, err = {}", s.ToString());
+ CHECK(!result.empty(), "read EOF of file '{}'", name);
+
+ std::shared_ptr<char>
key_buffer(dsn::utils::make_shared_array<char>(sz));
+ s = rfile->Read(sz, &result, key_buffer.get());
+ CHECK(s.ok(), "read key failed, err = {}", s.ToString());
+ CHECK(!result.empty(), "read EOF of file '{}'", name);
+ std::string key = result.ToString();
+
+ // Read value.
+ s = rfile->Read(sizeof(sz), &result, (char *)&sz);
+ CHECK(s.ok(), "read value size failed, err = {}", s.ToString());
+ CHECK(!result.empty(), "read EOF of file '{}'", name);
+
+ std::shared_ptr<char>
value_buffer(dsn::utils::make_shared_array<char>(sz));
+ s = rfile->Read(sz, &result, value_buffer.get());
+ CHECK(s.ok(), "read value failed, err = {}", s.ToString());
+ CHECK(!result.empty(), "read EOF of file '{}'", name);
+ std::string value = result.ToString();
+
+ // Store the kv pair.
_store[key] = value;
}
}
@@ -217,30 +253,43 @@ void simple_kv_service_impl::recover(const std::string
&name, int64_t version)
return ERR_OK;
}
- // TODO: should use async write instead
- char name[256];
- sprintf(name, "%s/checkpoint.%" PRId64, data_dir().c_str(), last_commit);
- std::ofstream os(name, std::ios::binary);
+ std::string fname = fmt::format("{}/checkpoint.{}", data_dir(),
last_commit);
+ auto wfile = file::open(fname.c_str(), O_RDWR | O_CREAT | O_BINARY, 0666);
+ CHECK_NOTNULL(wfile, "");
+#define WRITE_DATA_SIZE(data, size)
\
+ do {
\
+ auto tsk = ::dsn::file::write(
\
+ wfile, (char *)&data, size, offset, LPC_AIO_IMMEDIATE_CALLBACK,
nullptr, nullptr); \
+ tsk->wait();
\
+ offset += size;
\
+ } while (false)
+
+#define WRITE_DATA(data) WRITE_DATA_SIZE(data, sizeof(data))
+
+ uint64_t offset = 0;
uint64_t count = (uint64_t)_store.size();
- int magic = 0xdeadbeef;
+ WRITE_DATA(count);
- os.write((const char *)&count, (uint32_t)sizeof(count));
- os.write((const char *)&magic, (uint32_t)sizeof(magic));
+ int magic = 0xdeadbeef;
+ WRITE_DATA(magic);
- for (auto it = _store.begin(); it != _store.end(); ++it) {
- const std::string &k = it->first;
+ for (const auto &kv : _store) {
+ const std::string &k = kv.first;
uint32_t sz = (uint32_t)k.length();
+ WRITE_DATA(sz);
+ WRITE_DATA_SIZE(k[0], sz);
- os.write((const char *)&sz, (uint32_t)sizeof(sz));
- os.write((const char *)&k[0], sz);
-
- const std::string &v = it->second;
+ const std::string &v = kv.second;
sz = (uint32_t)v.length();
-
- os.write((const char *)&sz, (uint32_t)sizeof(sz));
- os.write((const char *)&v[0], sz);
+ WRITE_DATA(sz);
+ WRITE_DATA_SIZE(v[0], sz);
}
+#undef WRITE_DATA
+#undef WRITE_DATA_SIZE
+
+ CHECK_EQ(ERR_OK, file::flush(wfile));
+ CHECK_EQ(ERR_OK, file::close(wfile));
set_last_durable_decree(last_commit);
LOG_INFO("simple_kv_service_impl create checkpoint succeed, "
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]