3333#include " db/range_del_aggregator.h"
3434#include " db/version_edit.h"
3535#include " db/version_set.h"
36+ #include " file/file_util.h"
3637#include " file/filename.h"
3738#include " file/read_write_util.h"
3839#include " file/sst_file_manager_impl.h"
@@ -903,17 +904,17 @@ Status CompactionJob::VerifyOutputFiles() {
903904 // use_direct_io_for_flush_and_compaction is true, we will regard this
904905 // verification as user reads since the goal is to cache it here for
905906 // further user reads
906- ReadOptions verify_table_read_options (Env::IOActivity::kCompaction );
907- verify_table_read_options .verify_checksums = true ;
908- verify_table_read_options .readahead_size =
907+ ReadOptions verification_read_options (Env::IOActivity::kCompaction );
908+ verification_read_options .verify_checksums = true ;
909+ verification_read_options .readahead_size =
909910 file_options_for_read_.compaction_readahead_size ;
910911
911912 std::unique_ptr<TableReader> table_reader_guard;
912913 TableReader* table_reader_ptr = table_reader_guard.get ();
913- verify_table_read_options .rate_limiter_priority =
914+ verification_read_options .rate_limiter_priority =
914915 GetRateLimiterPriority ();
915916 InternalIterator* iter = cfd->table_cache ()->NewIterator (
916- verify_table_read_options , file_options_, cfd->internal_comparator (),
917+ verification_read_options , file_options_, cfd->internal_comparator (),
917918 output_file.meta ,
918919 /* range_del_agg=*/ nullptr , compact_->compaction ->mutable_cf_options (),
919920 /* table_reader_ptr=*/ &table_reader_ptr,
@@ -941,12 +942,17 @@ Status CompactionJob::VerifyOutputFiles() {
941942 !!(verify_output_flags & VerifyOutputFlags::kVerifyBlockChecksum );
942943 const bool should_verify_iteration =
943944 !!(verify_output_flags & VerifyOutputFlags::kVerifyIteration );
945+ const bool should_verify_file_checksum =
946+ !!(verify_output_flags &
947+ VerifyOutputFlags::kVerifyFileChecksum ) &&
948+ db_options_.file_checksum_gen_factory != nullptr &&
949+ output_file.meta .file_checksum != kUnknownFileChecksum ;
944950 if (should_verify_block_checksum) {
945951 assert (table_reader_ptr != nullptr );
946952 // If verifying iteration as well, verify meta blocks here only to
947953 // avoid redundant checks on data blocks
948954 s = table_reader_ptr->VerifyChecksum (
949- verify_table_read_options , TableReaderCaller::kCompaction ,
955+ verification_read_options , TableReaderCaller::kCompaction ,
950956 /* meta_blocks_only=*/ should_verify_iteration);
951957 }
952958 if (s.ok () && should_verify_iteration) {
@@ -967,6 +973,24 @@ Status CompactionJob::VerifyOutputFiles() {
967973 " was computed when written" );
968974 }
969975 }
976+ if (s.ok () && should_verify_file_checksum) {
977+ std::string file_checksum;
978+ std::string file_checksum_func_name;
979+ std::string fname =
980+ GetTableFileName (output_file.meta .fd .GetNumber ());
981+ s = GenerateOneFileChecksum (
982+ fs_.get (), fname, db_options_.file_checksum_gen_factory .get (),
983+ output_file.meta .file_checksum_func_name , &file_checksum,
984+ &file_checksum_func_name,
985+ verification_read_options.readahead_size ,
986+ db_options_.allow_mmap_reads , io_tracer_,
987+ db_options_.rate_limiter .get (), verification_read_options,
988+ stats_, db_options_.clock , file_options_for_read_);
989+ if (s.ok () && file_checksum != output_file.meta .file_checksum ) {
990+ s = Status::Corruption (
991+ " File checksum mismatch for compaction output file " + fname);
992+ }
993+ }
970994 }
971995 }
972996
0 commit comments