This is an automated email from the ASF dual-hosted git repository.
laiyingchun 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 5eb33cc75 refactor(local_service): minor refactor on file_metadata
(#1769)
5eb33cc75 is described below
commit 5eb33cc75686d1fd637d10783f013de34fd75987
Author: Yingchun Lai <[email protected]>
AuthorDate: Thu Dec 14 17:45:29 2023 +0800
refactor(local_service): minor refactor on file_metadata (#1769)
Add function `dump_to_file` and `load_from_file` to class `file_metadata` to
dump the object to a file in JSON format and load the object from a file in
JSON format.
---
src/block_service/local/local_service.cpp | 89 +++++++++++++--------------
src/block_service/local/local_service.h | 9 ++-
src/block_service/test/local_service_test.cpp | 40 ++++--------
3 files changed, 63 insertions(+), 75 deletions(-)
diff --git a/src/block_service/local/local_service.cpp
b/src/block_service/local/local_service.cpp
index ad71e2a61..9977fbe94 100644
--- a/src/block_service/local/local_service.cpp
+++ b/src/block_service/local/local_service.cpp
@@ -53,14 +53,38 @@ namespace block_service {
DEFINE_TASK_CODE(LPC_LOCAL_SERVICE_CALL, TASK_PRIORITY_COMMON,
THREAD_POOL_BLOCK_SERVICE)
-bool file_metadata_from_json(const std::string &data, file_metadata &fmeta)
noexcept
+error_code file_metadata::dump_to_file(const std::string &file_path) const
{
+ std::string data = nlohmann::json(*this).dump();
+ auto s =
+
rocksdb::WriteStringToFile(dsn::utils::PegasusEnv(dsn::utils::FileDataType::kSensitive),
+ rocksdb::Slice(data),
+ file_path,
+ /* should_sync */ true);
+ if (!s.ok()) {
+ LOG_WARNING("write to metadata file '{}' failed, err = {}", file_path,
s.ToString());
+ return ERR_FS_INTERNAL;
+ }
+
+ return ERR_OK;
+}
+
+error_code file_metadata::load_from_file(const std::string &file_path)
+{
+ std::string data;
+ auto s = rocksdb::ReadFileToString(
+ dsn::utils::PegasusEnv(dsn::utils::FileDataType::kSensitive),
file_path, &data);
+ if (!s.ok()) {
+ LOG_WARNING("load from metadata file '{}' failed, err = {}",
file_path, s.ToString());
+ return ERR_FS_INTERNAL;
+ }
+
try {
- nlohmann::json::parse(data).get_to(fmeta);
- return true;
+ nlohmann::json::parse(data).get_to(*this);
+ return ERR_OK;
} catch (nlohmann::json::exception &exp) {
- LOG_WARNING("decode metadata from json failed: {} [{}]", exp.what(),
data);
- return false;
+ LOG_WARNING("decode metadata from json failed: {}, data = [{}]",
exp.what(), data);
+ return ERR_FS_INTERNAL;
}
}
@@ -264,50 +288,23 @@ uint64_t local_file_object::get_size() { return _size; }
error_code local_file_object::load_metadata()
{
- if (_has_meta_synced)
+ if (_has_meta_synced) {
return ERR_OK;
-
- std::string metadata_path = local_service::get_metafile(file_name());
- std::string data;
- auto s = rocksdb::ReadFileToString(
- dsn::utils::PegasusEnv(dsn::utils::FileDataType::kSensitive),
metadata_path, &data);
- if (!s.ok()) {
- LOG_WARNING("read file '{}' failed, err = {}", metadata_path,
s.ToString());
- return ERR_FS_INTERNAL;
}
- file_metadata meta;
- bool ans = file_metadata_from_json(data, meta);
- if (!ans) {
- LOG_WARNING("decode metadata '{}' file content failed", metadata_path);
+ file_metadata fmd;
+ std::string filepath = local_service::get_metafile(file_name());
+ auto ec = fmd.load_from_file(filepath);
+ if (ec != ERR_OK) {
+ LOG_WARNING("load metadata file '{}' failed", filepath);
return ERR_FS_INTERNAL;
}
- _size = meta.size;
- _md5_value = meta.md5;
+ _size = fmd.size;
+ _md5_value = fmd.md5;
_has_meta_synced = true;
return ERR_OK;
}
-error_code local_file_object::store_metadata()
-{
- file_metadata meta;
- meta.md5 = _md5_value;
- meta.size = _size;
- std::string data = nlohmann::json(meta).dump();
- std::string metadata_path = local_service::get_metafile(file_name());
- auto s =
-
rocksdb::WriteStringToFile(dsn::utils::PegasusEnv(dsn::utils::FileDataType::kSensitive),
- rocksdb::Slice(data),
- metadata_path,
- /* should_sync */ true);
- if (!s.ok()) {
- LOG_WARNING("store to metadata file {} failed, err={}", metadata_path,
s.ToString());
- return ERR_FS_INTERNAL;
- }
-
- return ERR_OK;
-}
-
dsn::task_ptr local_file_object::write(const write_request &req,
dsn::task_code code,
const write_callback &cb,
@@ -359,11 +356,10 @@ dsn::task_ptr local_file_object::write(const
write_request &req,
// a lot, but it is somewhat not correct.
_size = resp.written_size;
_md5_value = utils::string_md5(req.buffer.data(),
req.buffer.length());
- // TODO(yingchun): make store_metadata as a local function, do
not depend on the
- // member variables (i.e. _size and _md5_value).
- auto err = store_metadata();
+ auto err = file_metadata(_size, _md5_value)
+
.dump_to_file(local_service::get_metafile(file_name()));
if (err != ERR_OK) {
- LOG_WARNING("store_metadata failed");
+ LOG_ERROR("file_metadata write failed");
resp.err = ERR_FS_INTERNAL;
break;
}
@@ -502,9 +498,10 @@ dsn::task_ptr local_file_object::upload(const
upload_request &req,
break;
}
- auto err = store_metadata();
+ auto err = file_metadata(_size, _md5_value)
+
.dump_to_file(local_service::get_metafile(file_name()));
if (err != ERR_OK) {
- LOG_ERROR("store_metadata failed");
+ LOG_ERROR("file_metadata write failed");
resp.err = ERR_FS_INTERNAL;
break;
}
diff --git a/src/block_service/local/local_service.h
b/src/block_service/local/local_service.h
index 9c944e1d0..0c1a5ee88 100644
--- a/src/block_service/local/local_service.h
+++ b/src/block_service/local/local_service.h
@@ -39,6 +39,14 @@ struct file_metadata
{
int64_t size = 0;
std::string md5;
+
+ file_metadata(int64_t s = 0, const std::string &m = "") : size(s), md5(m)
{}
+
+ // Dump the object to a file in JSON format.
+ error_code dump_to_file(const std::string &file_path) const;
+
+ // Load the object from a file in JSON format.
+ error_code load_from_file(const std::string &file_path);
};
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(file_metadata, size, md5)
@@ -102,7 +110,6 @@ public:
dsn::task_tracker *tracker = nullptr)
override;
error_code load_metadata();
- error_code store_metadata();
private:
std::string compute_md5();
diff --git a/src/block_service/test/local_service_test.cpp
b/src/block_service/test/local_service_test.cpp
index 692a2d2c8..5eeb8dd0f 100644
--- a/src/block_service/test/local_service_test.cpp
+++ b/src/block_service/test/local_service_test.cpp
@@ -24,11 +24,8 @@
#include <rocksdb/env.h>
#include <rocksdb/slice.h>
#include <rocksdb/status.h>
-#include <initializer_list>
-#include <map>
-#include <stdexcept>
+#include <stdint.h>
#include <string>
-#include <vector>
#include "block_service/local/local_service.h"
#include "gtest/gtest.h"
@@ -47,23 +44,18 @@ class local_service_test : public
pegasus::encrypt_data_test_base
INSTANTIATE_TEST_CASE_P(, local_service_test, ::testing::Values(false, true));
-TEST_P(local_service_test, store_metadata)
+TEST_P(local_service_test, file_metadata)
{
- local_file_object file("a.txt");
- error_code ec = file.store_metadata();
- ASSERT_EQ(ERR_OK, ec);
-
- auto meta_file_path = local_service::get_metafile(file.file_name());
+ const int64_t kSize = 12345;
+ const std::string kMD5 = "0123456789abcdef0123456789abcdef";
+ auto meta_file_path = local_service::get_metafile("a.txt");
+ ASSERT_EQ(ERR_OK, file_metadata(kSize, kMD5).dump_to_file(meta_file_path));
ASSERT_TRUE(boost::filesystem::exists(meta_file_path));
- std::string data;
- auto s = rocksdb::ReadFileToString(
- dsn::utils::PegasusEnv(dsn::utils::FileDataType::kSensitive),
meta_file_path, &data);
- ASSERT_TRUE(s.ok()) << s.ToString();
-
- nlohmann::json j = nlohmann::json::parse(data);
- ASSERT_EQ("", j["md5"]);
- ASSERT_EQ(0, j["size"]);
+ file_metadata fm;
+ fm.load_from_file(meta_file_path);
+ ASSERT_EQ(kSize, fm.size);
+ ASSERT_EQ(kMD5, fm.md5);
}
TEST_P(local_service_test, load_metadata)
@@ -72,15 +64,7 @@ TEST_P(local_service_test, load_metadata)
auto meta_file_path = local_service::get_metafile(file.file_name());
{
- nlohmann::json j({{"md5", "abcde"}, {"size", 5}});
- std::string data = j.dump();
- auto s =
-
rocksdb::WriteStringToFile(dsn::utils::PegasusEnv(dsn::utils::FileDataType::kSensitive),
- rocksdb::Slice(data),
- meta_file_path,
- /* should_sync */ true);
- ASSERT_TRUE(s.ok()) << s.ToString();
-
+ ASSERT_EQ(ERR_OK, file_metadata(5,
"abcde").dump_to_file(meta_file_path));
ASSERT_EQ(ERR_OK, file.load_metadata());
ASSERT_EQ("abcde", file.get_md5sum());
ASSERT_EQ(5, file.get_size());
@@ -95,7 +79,7 @@ TEST_P(local_service_test, load_metadata)
ASSERT_TRUE(s.ok()) << s.ToString();
local_file_object file2("a.txt");
- ASSERT_EQ(file2.load_metadata(), ERR_FS_INTERNAL);
+ ASSERT_EQ(ERR_FS_INTERNAL, file2.load_metadata());
}
{
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]