Pass SST file checksum information through OnTableFileCreated (#7108)

Summary:
When SST file is created, application is able to know the file information through OnTableFileCreated callback in LogAndNotifyTableFileCreationFinished. Since file checksum information can be useful for application when the SST file is created, we add file_checksum and file_checksum_func_name information to TableFileCreationInfo, which will be passed through OnTableFileCreated.

Pull Request resolved: https://github.com/facebook/rocksdb/pull/7108

Test Plan: make check, listener_test.

Reviewed By: ajkr

Differential Revision: D22470240

Pulled By: zhichao-cao

fbshipit-source-id: 92c20344d9b986eadfe3480f3769bf4add0dbaae
main
Zhichao Cao 4 years ago committed by Facebook GitHub Bot
parent 416943bf28
commit d51f88c9e4
  1. 2
      HISTORY.md
  2. 10
      db/builder.cc
  3. 10
      db/compaction/compaction_job.cc
  4. 9
      db/event_helpers.cc
  5. 4
      db/event_helpers.h
  6. 4
      db/listener_test.cc
  7. 4
      include/rocksdb/listener.h

@ -18,6 +18,8 @@
### Public API Change ### Public API Change
* Expose kTypeDeleteWithTimestamp in EntryType and update GetEntryType() accordingly. * Expose kTypeDeleteWithTimestamp in EntryType and update GetEntryType() accordingly.
* Added file_checksum and file_checksum_func_name to TableFileCreationInfo, which can pass the table file checksum information through the OnTableFileCreated callback during flush and compaction.
## 6.12 (2020-07-28) ## 6.12 (2020-07-28)
### Public API Change ### Public API Change

@ -106,6 +106,8 @@ Status BuildTable(
std::string fname = TableFileName(ioptions.cf_paths, meta->fd.GetNumber(), std::string fname = TableFileName(ioptions.cf_paths, meta->fd.GetNumber(),
meta->fd.GetPathId()); meta->fd.GetPathId());
std::string file_checksum = kUnknownFileChecksum;
std::string file_checksum_func_name = kUnknownFileChecksumFuncName;
#ifndef ROCKSDB_LITE #ifndef ROCKSDB_LITE
EventHelpers::NotifyTableFileCreationStarted( EventHelpers::NotifyTableFileCreationStarted(
ioptions.listeners, dbname, column_family_name, fname, job_id, reason); ioptions.listeners, dbname, column_family_name, fname, job_id, reason);
@ -133,7 +135,8 @@ Status BuildTable(
if (!s.ok()) { if (!s.ok()) {
EventHelpers::LogAndNotifyTableFileCreationFinished( EventHelpers::LogAndNotifyTableFileCreationFinished(
event_logger, ioptions.listeners, dbname, column_family_name, fname, event_logger, ioptions.listeners, dbname, column_family_name, fname,
job_id, meta->fd, kInvalidBlobFileNumber, tp, reason, s); job_id, meta->fd, kInvalidBlobFileNumber, tp, reason, s,
file_checksum, file_checksum_func_name);
return s; return s;
} }
file->SetIOPriority(io_priority); file->SetIOPriority(io_priority);
@ -232,6 +235,8 @@ Status BuildTable(
// Add the checksum information to file metadata. // Add the checksum information to file metadata.
meta->file_checksum = file_writer->GetFileChecksum(); meta->file_checksum = file_writer->GetFileChecksum();
meta->file_checksum_func_name = file_writer->GetFileChecksumFuncName(); meta->file_checksum_func_name = file_writer->GetFileChecksumFuncName();
file_checksum = meta->file_checksum;
file_checksum_func_name = meta->file_checksum_func_name;
} }
if (s.ok()) { if (s.ok()) {
@ -292,7 +297,8 @@ Status BuildTable(
// Output to event logger and fire events. // Output to event logger and fire events.
EventHelpers::LogAndNotifyTableFileCreationFinished( EventHelpers::LogAndNotifyTableFileCreationFinished(
event_logger, ioptions.listeners, dbname, column_family_name, fname, event_logger, ioptions.listeners, dbname, column_family_name, fname,
job_id, meta->fd, meta->oldest_blob_file_number, tp, reason, s); job_id, meta->fd, meta->oldest_blob_file_number, tp, reason, s,
file_checksum, file_checksum_func_name);
return s; return s;
} }

@ -1198,6 +1198,8 @@ Status CompactionJob::FinishCompactionOutputFile(
ColumnFamilyData* cfd = sub_compact->compaction->column_family_data(); ColumnFamilyData* cfd = sub_compact->compaction->column_family_data();
const Comparator* ucmp = cfd->user_comparator(); const Comparator* ucmp = cfd->user_comparator();
std::string file_checksum = kUnknownFileChecksum;
std::string file_checksum_func_name = kUnknownFileChecksumFuncName;
// Check for iterator errors // Check for iterator errors
Status s = input_status; Status s = input_status;
@ -1397,6 +1399,8 @@ Status CompactionJob::FinishCompactionOutputFile(
meta->file_checksum = sub_compact->outfile->GetFileChecksum(); meta->file_checksum = sub_compact->outfile->GetFileChecksum();
meta->file_checksum_func_name = meta->file_checksum_func_name =
sub_compact->outfile->GetFileChecksumFuncName(); sub_compact->outfile->GetFileChecksumFuncName();
file_checksum = meta->file_checksum;
file_checksum_func_name = meta->file_checksum_func_name;
} }
if (s.ok()) { if (s.ok()) {
s = io_s; s = io_s;
@ -1453,7 +1457,8 @@ Status CompactionJob::FinishCompactionOutputFile(
EventHelpers::LogAndNotifyTableFileCreationFinished( EventHelpers::LogAndNotifyTableFileCreationFinished(
event_logger_, cfd->ioptions()->listeners, dbname_, cfd->GetName(), fname, event_logger_, cfd->ioptions()->listeners, dbname_, cfd->GetName(), fname,
job_id_, output_fd, oldest_blob_file_number, tp, job_id_, output_fd, oldest_blob_file_number, tp,
TableFileCreationReason::kCompaction, s); TableFileCreationReason::kCompaction, s, file_checksum,
file_checksum_func_name);
#ifndef ROCKSDB_LITE #ifndef ROCKSDB_LITE
// Report new file to SstFileManagerImpl // Report new file to SstFileManagerImpl
@ -1582,7 +1587,8 @@ Status CompactionJob::OpenCompactionOutputFile(
EventHelpers::LogAndNotifyTableFileCreationFinished( EventHelpers::LogAndNotifyTableFileCreationFinished(
event_logger_, cfd->ioptions()->listeners, dbname_, cfd->GetName(), event_logger_, cfd->ioptions()->listeners, dbname_, cfd->GetName(),
fname, job_id_, FileDescriptor(), kInvalidBlobFileNumber, fname, job_id_, FileDescriptor(), kInvalidBlobFileNumber,
TableProperties(), TableFileCreationReason::kCompaction, s); TableProperties(), TableFileCreationReason::kCompaction, s,
kUnknownFileChecksum, kUnknownFileChecksumFuncName);
return s; return s;
} }

@ -71,14 +71,17 @@ void EventHelpers::LogAndNotifyTableFileCreationFinished(
const std::string& db_name, const std::string& cf_name, const std::string& db_name, const std::string& cf_name,
const std::string& file_path, int job_id, const FileDescriptor& fd, const std::string& file_path, int job_id, const FileDescriptor& fd,
uint64_t oldest_blob_file_number, const TableProperties& table_properties, uint64_t oldest_blob_file_number, const TableProperties& table_properties,
TableFileCreationReason reason, const Status& s) { TableFileCreationReason reason, const Status& s,
const std::string& file_checksum,
const std::string& file_checksum_func_name) {
if (s.ok() && event_logger) { if (s.ok() && event_logger) {
JSONWriter jwriter; JSONWriter jwriter;
AppendCurrentTime(&jwriter); AppendCurrentTime(&jwriter);
jwriter << "cf_name" << cf_name << "job" << job_id << "event" jwriter << "cf_name" << cf_name << "job" << job_id << "event"
<< "table_file_creation" << "table_file_creation"
<< "file_number" << fd.GetNumber() << "file_size" << "file_number" << fd.GetNumber() << "file_size"
<< fd.GetFileSize(); << fd.GetFileSize() << "file_checksum" << file_checksum
<< "file_checksum_func_name" << file_checksum_func_name;
// table_properties // table_properties
{ {
@ -154,6 +157,8 @@ void EventHelpers::LogAndNotifyTableFileCreationFinished(
info.table_properties = table_properties; info.table_properties = table_properties;
info.reason = reason; info.reason = reason;
info.status = s; info.status = s;
info.file_checksum = file_checksum;
info.file_checksum_func_name = file_checksum_func_name;
for (auto& listener : listeners) { for (auto& listener : listeners) {
listener->OnTableFileCreated(info); listener->OnTableFileCreated(info);
} }

@ -35,7 +35,9 @@ class EventHelpers {
const std::string& db_name, const std::string& cf_name, const std::string& db_name, const std::string& cf_name,
const std::string& file_path, int job_id, const FileDescriptor& fd, const std::string& file_path, int job_id, const FileDescriptor& fd,
uint64_t oldest_blob_file_number, const TableProperties& table_properties, uint64_t oldest_blob_file_number, const TableProperties& table_properties,
TableFileCreationReason reason, const Status& s); TableFileCreationReason reason, const Status& s,
const std::string& file_checksum,
const std::string& file_checksum_func_name);
static void LogAndNotifyTableFileDeletion( static void LogAndNotifyTableFileDeletion(
EventLogger* event_logger, int job_id, EventLogger* event_logger, int job_id,
uint64_t file_number, const std::string& file_path, uint64_t file_number, const std::string& file_path,

@ -227,6 +227,8 @@ class TestFlushListener : public EventListener {
ASSERT_GT(info.table_properties.raw_value_size, 0U); ASSERT_GT(info.table_properties.raw_value_size, 0U);
ASSERT_GT(info.table_properties.num_data_blocks, 0U); ASSERT_GT(info.table_properties.num_data_blocks, 0U);
ASSERT_GT(info.table_properties.num_entries, 0U); ASSERT_GT(info.table_properties.num_entries, 0U);
ASSERT_EQ(info.file_checksum, kUnknownFileChecksum);
ASSERT_EQ(info.file_checksum_func_name, kUnknownFileChecksumFuncName);
#ifdef ROCKSDB_USING_THREAD_STATUS #ifdef ROCKSDB_USING_THREAD_STATUS
// Verify the id of the current thread that created this table // Verify the id of the current thread that created this table
@ -751,6 +753,8 @@ class TableFileCreationListener : public EventListener {
ASSERT_GT(info.cf_name.size(), 0U); ASSERT_GT(info.cf_name.size(), 0U);
ASSERT_GT(info.file_path.size(), 0U); ASSERT_GT(info.file_path.size(), 0U);
ASSERT_GT(info.job_id, 0); ASSERT_GT(info.job_id, 0);
ASSERT_EQ(info.file_checksum, kUnknownFileChecksum);
ASSERT_EQ(info.file_checksum_func_name, kUnknownFileChecksumFuncName);
if (info.status.ok()) { if (info.status.ok()) {
ASSERT_GT(info.table_properties.data_size, 0U); ASSERT_GT(info.table_properties.data_size, 0U);
ASSERT_GT(info.table_properties.raw_key_size, 0U); ASSERT_GT(info.table_properties.raw_key_size, 0U);

@ -58,6 +58,10 @@ struct TableFileCreationInfo : public TableFileCreationBriefInfo {
TableProperties table_properties; TableProperties table_properties;
// The status indicating whether the creation was successful or not. // The status indicating whether the creation was successful or not.
Status status; Status status;
// The checksum of the table file being created
std::string file_checksum;
// The checksum function name of checksum generator used for this table file
std::string file_checksum_func_name;
}; };
enum class CompactionReason : int { enum class CompactionReason : int {

Loading…
Cancel
Save