@@ -82,7 +82,8 @@ int OperationLogRecycleChecker::init() {
8282 snapshots_.clear ();
8383 snapshot_indexes_.clear ();
8484 MetaReader reader (instance_id_);
85- err = reader.get_snapshots (txn.get (), &snapshots_);
85+ std::vector<std::pair<SnapshotPB, Versionstamp>> snapshots;
86+ err = reader.get_snapshots (txn.get (), &snapshots);
8687 if (err != TxnErrorCode::TXN_OK) {
8788 LOG_WARNING (" failed to get snapshots" ).tag (" err" , err);
8889 return -1 ;
@@ -96,16 +97,22 @@ int OperationLogRecycleChecker::init() {
9697 }
9798
9899 max_versionstamp_ = Versionstamp (read_version, 0 );
99- for (size_t i = 0 ; i < snapshots_.size (); ++i) {
100- auto && [snapshot, versionstamp] = snapshots_[i];
101- snapshot_indexes_.insert (std::make_pair (versionstamp, i));
100+ for (size_t i = 0 ; i < snapshots.size (); ++i) {
101+ auto && [snapshot, versionstamp] = snapshots[i];
102+ if (snapshot.status () == SnapshotStatus::SNAPSHOT_ABORTED ||
103+ snapshot.status () == SnapshotStatus::SNAPSHOT_RECYCLED) {
104+ continue ;
105+ }
106+ snapshot_indexes_.insert (std::make_pair (versionstamp, snapshots_.size ()));
107+ snapshots_.push_back (std::make_pair (std::move (snapshot), versionstamp));
102108 }
103109
104110 return 0 ;
105111}
106112
107113bool OperationLogRecycleChecker::can_recycle (const Versionstamp& log_versionstamp,
108- int64_t log_min_timestamp) const {
114+ int64_t log_min_timestamp,
115+ OperationLogReferenceInfo* reference_info) const {
109116 Versionstamp log_min_read_timestamp (log_min_timestamp, 0 );
110117 if (log_versionstamp > max_versionstamp_) {
111118 // Not recycleable.
@@ -114,12 +121,15 @@ bool OperationLogRecycleChecker::can_recycle(const Versionstamp& log_versionstam
114121
115122 // Do not recycle operation logs referenced by active snapshots.
116123 if (log_min_read_timestamp < source_snapshot_versionstamp_) {
124+ reference_info->referenced_by_instance = true ;
117125 return false ;
118126 }
119127
120128 auto it = snapshot_indexes_.lower_bound (log_min_read_timestamp);
121129 if (it != snapshot_indexes_.end () && snapshots_[it->second ].second < log_versionstamp) {
122130 // in [log_min_read_timestmap, log_versionstamp)
131+ reference_info->referenced_by_snapshot = true ;
132+ reference_info->referenced_snapshot_timestamp = snapshots_[it->second ].second ;
123133 return false ;
124134 }
125135
@@ -677,6 +687,8 @@ int InstanceRecycler::recycle_operation_logs() {
677687 LOG_WARNING (" failed to initialize recycle checker" ).tag (" error_code" , init_res);
678688 return init_res;
679689 }
690+ SnapshotDataSizeCalculator calculator (instance_id_, txn_kv_);
691+ calculator.init (recycle_checker.get_snapshots ());
680692
681693 auto scan_and_recycle_operation_log = [&](const std::string_view& key,
682694 const std::vector<std::string>& raw_keys,
@@ -690,7 +702,9 @@ int InstanceRecycler::recycle_operation_logs() {
690702 }
691703
692704 size_t value_size = operation_log.ByteSizeLong ();
693- if (recycle_checker.can_recycle (log_versionstamp, operation_log.min_timestamp ())) {
705+ OperationLogReferenceInfo reference_info;
706+ if (recycle_checker.can_recycle (log_versionstamp, operation_log.min_timestamp (),
707+ &reference_info)) {
694708 AnnotateTag tag (" log_key" , hex (key));
695709 int res = recycle_operation_log (log_versionstamp, raw_keys, std::move (operation_log));
696710 if (res != 0 ) {
@@ -700,6 +714,13 @@ int InstanceRecycler::recycle_operation_logs() {
700714
701715 recycled_operation_logs++;
702716 recycled_operation_log_data_size += value_size;
717+ } else {
718+ int res = calculator.calculate_operation_log_data_size (key, operation_log,
719+ reference_info);
720+ if (res != 0 ) {
721+ LOG_WARNING (" failed to calculate operation log data size" ).tag (" error_code" , res);
722+ return res;
723+ }
703724 }
704725
705726 total_operation_logs++;
@@ -769,6 +790,11 @@ int InstanceRecycler::recycle_operation_logs() {
769790 .tag (" error_code" , iter->error_code ());
770791 return -1 ;
771792 }
793+ int res = calculator.save_snapshot_data_size_with_retry ();
794+ if (res != 0 ) {
795+ LOG_WARNING (" failed to save snapshot data size" ).tag (" error_code" , res);
796+ return res;
797+ }
772798 return 0 ;
773799}
774800
0 commit comments