Skip to content

Commit

Permalink
Use FileChecksumGenFactory for SST file checksum (#6600)
Browse files Browse the repository at this point in the history
Summary:
In the current implementation, sst file checksum is calculated by a shared checksum function object, which may make some checksum function hard to be applied here such as SHA1. In this implementation, each sst file will have its own checksum generator obejct, created by FileChecksumGenFactory. User needs to implement its own FilechecksumGenerator and Factory to plugin the in checksum calculation method.
Pull Request resolved: facebook/rocksdb#6600

Test Plan: tested with make asan_check

Reviewed By: riversand963

Differential Revision: D20717670

Pulled By: zhichao-cao

fbshipit-source-id: 2a74c1c280ac11a07a1980185b43b671acaa71c6
Signed-off-by: Changlong Chen <levisonchen@live.cn>
  • Loading branch information
zhichao-cao authored and Changlong Chen committed Jun 18, 2021
1 parent 4f88872 commit 87aa84b
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 18 deletions.
27 changes: 17 additions & 10 deletions file/writable_file_writer.cc
Expand Up @@ -155,6 +155,11 @@ IOStatus WritableFileWriter::Close() {
writable_file_.reset();
TEST_KILL_RANDOM("WritableFileWriter::Close:1", rocksdb_kill_odds);

if (s.ok() && checksum_generator_ != nullptr && !checksum_finalized_) {
checksum_generator_->Finalize();
checksum_finalized_ = true;
}

return s;
}

Expand Down Expand Up @@ -216,9 +221,17 @@ IOStatus WritableFileWriter::Flush() {
return s;
}

std::string WritableFileWriter::GetFileChecksum() {
if (checksum_generator_ != nullptr) {
return checksum_generator_->GetChecksum();
} else {
return kUnknownFileChecksum;
}
}

const char* WritableFileWriter::GetFileChecksumFuncName() const {
if (checksum_func_ != nullptr) {
return checksum_func_->Name();
if (checksum_generator_ != nullptr) {
return checksum_generator_->Name();
} else {
return kUnknownFileChecksumFuncName.c_str();
}
Expand Down Expand Up @@ -332,14 +345,8 @@ IOStatus WritableFileWriter::WriteBuffered(const char* data, size_t size) {
}

void WritableFileWriter::CalculateFileChecksum(const Slice& data) {
if (checksum_func_ != nullptr) {
if (is_first_checksum_) {
file_checksum_ = checksum_func_->Value(data.data(), data.size());
is_first_checksum_ = false;
} else {
file_checksum_ =
checksum_func_->Extend(file_checksum_, data.data(), data.size());
}
if (checksum_generator_ != nullptr) {
checksum_generator_->Update(data.data(), data.size());
}
}

Expand Down
24 changes: 16 additions & 8 deletions file/writable_file_writer.h
Expand Up @@ -72,17 +72,16 @@ class WritableFileWriter {
RateLimiter* rate_limiter_;
Statistics* stats_;
std::vector<std::shared_ptr<EventListener>> listeners_;
FileChecksumFunc* checksum_func_;
std::string file_checksum_ = kUnknownFileChecksum;
bool is_first_checksum_ = true;
std::unique_ptr<FileChecksumGenerator> checksum_generator_;
bool checksum_finalized_;

public:
WritableFileWriter(
std::unique_ptr<FSWritableFile>&& file, const std::string& _file_name,
const FileOptions& options, Env* env = nullptr,
Statistics* stats = nullptr,
const std::vector<std::shared_ptr<EventListener>>& listeners = {},
FileChecksumFunc* checksum_func = nullptr)
FileChecksumGenFactory* file_checksum_gen_factory = nullptr)
: writable_file_(std::move(file)),
file_name_(_file_name),
env_(env),
Expand All @@ -98,7 +97,8 @@ class WritableFileWriter {
rate_limiter_(options.rate_limiter),
stats_(stats),
listeners_(),
checksum_func_(checksum_func) {
checksum_generator_(nullptr),
checksum_finalized_(false) {
TEST_SYNC_POINT_CALLBACK("WritableFileWriter::WritableFileWriter:0",
reinterpret_cast<void*>(max_buffer_size_));
buf_.Alignment(writable_file_->GetRequiredBufferAlignment());
Expand All @@ -113,6 +113,13 @@ class WritableFileWriter {
#else // !ROCKSDB_LITE
(void)listeners;
#endif
if (file_checksum_gen_factory != nullptr) {
FileChecksumGenContext checksum_gen_context;
checksum_gen_context.file_name = _file_name;
checksum_generator_ =
file_checksum_gen_factory->CreateFileChecksumGenerator(
checksum_gen_context);
}
}

WritableFileWriter(const WritableFileWriter&) = delete;
Expand Down Expand Up @@ -150,11 +157,12 @@ class WritableFileWriter {

bool TEST_BufferIsEmpty() { return buf_.CurrentSize() == 0; }

void TEST_SetFileChecksumFunc(FileChecksumFunc* checksum_func) {
checksum_func_ = checksum_func;
void TEST_SetFileChecksumGenerator(
FileChecksumGenerator* checksum_generator) {
checksum_generator_.reset(checksum_generator);
}

const std::string& GetFileChecksum() const { return file_checksum_; }
std::string GetFileChecksum();

const char* GetFileChecksumFuncName() const;

Expand Down

0 comments on commit 87aa84b

Please sign in to comment.