From d4c70107674c59f602874a7a997e1215ae04a414 Mon Sep 17 00:00:00 2001 From: jason Date: Tue, 30 Jun 2020 20:25:52 +0800 Subject: [PATCH] not hold mutex when destruct big object Signed-off-by: jason --- src/db_impl_gc.cc | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/db_impl_gc.cc b/src/db_impl_gc.cc index 36c566c30..07bb80272 100644 --- a/src/db_impl_gc.cc +++ b/src/db_impl_gc.cc @@ -202,21 +202,26 @@ Status TitanDBImpl::BackgroundGC(LogBuffer* log_buffer, ROCKS_LOG_BUFFER(log_buffer, "Titan GC nothing to do"); } else { StopWatch gc_sw(env_, statistics(stats_.get()), TITAN_GC_MICROS); - BlobGCJob blob_gc_job(blob_gc.get(), db_, &mutex_, db_options_, - gc_merge_rewrite, env_, env_options_, - blob_manager_.get(), blob_file_set_.get(), log_buffer, - &shuting_down_, stats_.get()); - s = blob_gc_job.Prepare(); + BlobGCJob *blob_gc_job = new BlobGCJob(blob_gc.get(), db_, &mutex_, db_options_, + gc_merge_rewrite, env_, env_options_, + blob_manager_.get(), blob_file_set_.get(), log_buffer, + &shuting_down_, stats_.get()); + s = blob_gc_job->Prepare(); if (s.ok()) { mutex_.Unlock(); TEST_SYNC_POINT("TitanDBImpl::BackgroundGC::BeforeRunGCJob"); - s = blob_gc_job.Run(); + s = blob_gc_job->Run(); TEST_SYNC_POINT("TitanDBImpl::BackgroundGC::AfterRunGCJob"); mutex_.Lock(); } if (s.ok()) { - s = blob_gc_job.Finish(); + s = blob_gc_job->Finish(); } + + mutex_.Unlock(); + delete blob_gc_job; + mutex_.Lock(); + blob_gc->ReleaseGcFiles(); if (blob_gc->trigger_next() &&