#include "util/file_checksum_helper.h"
+#include <unordered_set>
+
+#include "db/log_reader.h"
+#include "db/version_edit.h"
+#include "db/version_edit_handler.h"
+#include "file/sequence_file_reader.h"
+
namespace ROCKSDB_NAMESPACE {
void FileChecksumListImpl::reset() { checksum_map_.clear(); }
return checksum_list;
}
-FileChecksumFunc* CreateFileChecksumFuncCrc32c() {
- FileChecksumFunc* file_checksum_crc32c = new FileChecksumFuncCrc32c();
- return file_checksum_crc32c;
+std::shared_ptr<FileChecksumGenFactory> GetFileChecksumGenCrc32cFactory() {
+ static std::shared_ptr<FileChecksumGenFactory> default_crc32c_gen_factory(
+ new FileChecksumGenCrc32cFactory());
+ return default_crc32c_gen_factory;
+}
+
+Status GetFileChecksumsFromManifest(Env* src_env, const std::string& abs_path,
+ uint64_t manifest_file_size,
+ FileChecksumList* checksum_list) {
+ if (checksum_list == nullptr) {
+ return Status::InvalidArgument("checksum_list is nullptr");
+ }
+ assert(checksum_list);
+ checksum_list->reset();
+ Status s;
+
+ std::unique_ptr<SequentialFileReader> file_reader;
+ {
+ std::unique_ptr<FSSequentialFile> file;
+ const std::shared_ptr<FileSystem>& fs = src_env->GetFileSystem();
+ s = fs->NewSequentialFile(abs_path,
+ fs->OptimizeForManifestRead(FileOptions()), &file,
+ nullptr /* dbg */);
+ if (!s.ok()) {
+ return s;
+ }
+ file_reader.reset(new SequentialFileReader(std::move(file), abs_path));
+ }
+
+ struct LogReporter : public log::Reader::Reporter {
+ Status* status_ptr;
+ virtual void Corruption(size_t /*bytes*/, const Status& st) override {
+ if (status_ptr->ok()) {
+ *status_ptr = st;
+ }
+ }
+ } reporter;
+ reporter.status_ptr = &s;
+ log::Reader reader(nullptr, std::move(file_reader), &reporter,
+ true /* checksum */, 0 /* log_number */);
+ FileChecksumRetriever retriever(manifest_file_size, *checksum_list);
+ retriever.Iterate(reader, &s);
+ assert(!retriever.status().ok() ||
+ manifest_file_size == std::numeric_limits<uint64_t>::max() ||
+ reader.LastRecordEnd() == manifest_file_size);
+
+ return retriever.status();
}
} // namespace ROCKSDB_NAMESPACE