@@ -299,6 +299,13 @@ bool DiskTable::Delete(const std::string& pk, uint32_t idx) {
299299 return false ;
300300 }
301301 auto inner_index = table_index_.GetInnerIndex (index_def->GetInnerPos ());
302+ rocksdb::ReadOptions ro = rocksdb::ReadOptions ();
303+ const rocksdb::Snapshot* snapshot = db_->GetSnapshot ();
304+ ro.snapshot = snapshot;
305+ ro.pin_data = true ;
306+ rocksdb::Iterator* it = db_->NewIterator (ro, cf_hs_[index_def->GetInnerPos () + 1 ]);
307+ std::map<uint32_t , uint64_t > delete_idx_cnt;
308+
302309 if (inner_index && inner_index->GetIndex ().size () > 1 ) {
303310 const auto & indexs = inner_index->GetIndex ();
304311 for (const auto & index : indexs) {
@@ -308,16 +315,41 @@ bool DiskTable::Delete(const std::string& pk, uint32_t idx) {
308315 }
309316 std::string combine_key1 = CombineKeyTs (pk, UINT64_MAX, ts_col->GetId ());
310317 std::string combine_key2 = CombineKeyTs (pk, 0 , ts_col->GetId ());
318+ it->Seek (rocksdb::Slice (combine_key1));
319+ while (it->Valid () && it->key ().compare (rocksdb::Slice (combine_key2)) != 0 ) {
320+ if (delete_idx_cnt.find (index->GetId ()) != delete_idx_cnt.end ()) {
321+ delete_idx_cnt[index->GetId ()]++;
322+ } else {
323+ delete_idx_cnt.emplace (index->GetId (), 1 );
324+ }
325+ it->Next ();
326+ }
311327 batch.DeleteRange (cf_hs_[idx + 1 ], rocksdb::Slice (combine_key1), rocksdb::Slice (combine_key2));
312328 }
313329 } else {
314330 std::string combine_key1 = CombineKeyTs (pk, UINT64_MAX);
315331 std::string combine_key2 = CombineKeyTs (pk, 0 );
332+ it->Seek (rocksdb::Slice (combine_key1));
333+ const auto & index = inner_index->GetIndex ().front ();
334+ while (it->Valid () && it->key ().compare (rocksdb::Slice (combine_key2)) != 0 ) {
335+ if (delete_idx_cnt.find (index->GetId ()) != delete_idx_cnt.end ()) {
336+ delete_idx_cnt[index->GetId ()]++;
337+ } else {
338+ delete_idx_cnt.emplace (index->GetId (), 1 );
339+ }
340+ it->Next ();
341+ }
316342 batch.DeleteRange (cf_hs_[idx + 1 ], rocksdb::Slice (combine_key1), rocksdb::Slice (combine_key2));
317343 }
318344 rocksdb::Status s = db_->Write (write_opts_, &batch);
319345 if (s.ok ()) {
320346 offset_.fetch_add (1 , std::memory_order_relaxed);
347+ for (auto ts_idx_iter = delete_idx_cnt.begin (); ts_idx_iter != delete_idx_cnt.end (); ts_idx_iter++) {
348+ idx_cnt_vec_[ts_idx_iter->first ]->fetch_sub (ts_idx_iter->second , std::memory_order_relaxed);
349+ }
350+ if (delete_idx_cnt.size () > 0 ) {
351+ pk_cnt_vec_[index_def->GetInnerPos ()]->fetch_sub (1 );
352+ }
321353 return true ;
322354 } else {
323355 DEBUGLOG (" Delete failed. tid %u pid %u msg %s" , id_, pid_, s.ToString ().c_str ());
0 commit comments