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]


Reply via email to