From 51b73b3aed81ee2d1140d3a27e06c1f044cc662b Mon Sep 17 00:00:00 2001 From: obdev Date: Mon, 20 Feb 2023 12:14:27 +0000 Subject: [PATCH] decide freeze_clock in ObDataCheckpoint --- src/storage/checkpoint/ob_data_checkpoint.cpp | 30 +++++++++++++++++++ src/storage/checkpoint/ob_data_checkpoint.h | 1 + .../checkpoint/ob_freeze_checkpoint.cpp | 2 +- 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/storage/checkpoint/ob_data_checkpoint.cpp b/src/storage/checkpoint/ob_data_checkpoint.cpp index b91e4639fb..e18f8993f2 100644 --- a/src/storage/checkpoint/ob_data_checkpoint.cpp +++ b/src/storage/checkpoint/ob_data_checkpoint.cpp @@ -13,6 +13,8 @@ #include "storage/checkpoint/ob_data_checkpoint.h" #include "storage/tx_storage/ob_checkpoint_service.h" #include "storage/ls/ob_ls.h" +#include "storage/memtable/ob_memtable.h" +#include "storage/ls/ob_freezer.h" namespace oceanbase { @@ -524,11 +526,39 @@ int ObDataCheckpoint::add_to_new_create(ObFreezeCheckpoint *ob_freeze_checkpoint { ObSpinLockGuard guard(lock_); int ret = OB_SUCCESS; + if (OB_FAIL(insert_(ob_freeze_checkpoint, new_create_list_, false))) { STORAGE_LOG(ERROR, "Add To Active Failed"); + } else if (OB_FAIL(decide_freeze_clock_(ob_freeze_checkpoint))) { + STORAGE_LOG(WARN, "fail to decide freeze_clock", K(ret)); } else { ob_freeze_checkpoint->location_ = NEW_CREATE; } + + return ret; +} + +int ObDataCheckpoint::decide_freeze_clock_(ObFreezeCheckpoint *ob_freeze_checkpoint) +{ + int ret = OB_SUCCESS; + ObFreezer *freezer = nullptr; + memtable::ObMemtable *memtable = nullptr; + + if (OB_ISNULL(ls_) || OB_ISNULL(ob_freeze_checkpoint)) { + ret = OB_ERR_UNEXPECTED; + STORAGE_LOG(WARN, "ls or ob_freeze_checkpoint cannot be null", K(ret), K(ls_), K(ob_freeze_checkpoint)); + } else if (FALSE_IT(freezer = ls_->get_freezer())) { + } else if (OB_ISNULL(freezer)) { + ret = OB_ERR_UNEXPECTED; + STORAGE_LOG(WARN, "freezer cannot be null", K(ret)); + } else if (FALSE_IT(memtable = static_cast(ob_freeze_checkpoint))) { + } else { + // freeze_snapshot_version requires that two memtables of a tablet + // cannot join in the same logstream_freeze task + // otherwise freeze_snapshot_version of the old memtable will be too large + (void)memtable->set_freeze_clock(freezer->get_freeze_clock()); + } + return ret; } diff --git a/src/storage/checkpoint/ob_data_checkpoint.h b/src/storage/checkpoint/ob_data_checkpoint.h index d965bea725..0dd73a1ebc 100644 --- a/src/storage/checkpoint/ob_data_checkpoint.h +++ b/src/storage/checkpoint/ob_data_checkpoint.h @@ -149,6 +149,7 @@ private: int get_need_flush_tablets_(const share::SCN recycle_scn, common::ObIArray &flush_tablets); int freeze_base_on_needs_(share::SCN recycle_scn); + int decide_freeze_clock_(ObFreezeCheckpoint *ob_freeze_checkpoint); static const int64_t LOOP_TRAVERSAL_INTERVAL_US = 1000L * 50; // 50ms // when freeze memtable base on needs less than TABLET_FREEZE_PERCENT, diff --git a/src/storage/checkpoint/ob_freeze_checkpoint.cpp b/src/storage/checkpoint/ob_freeze_checkpoint.cpp index b2dd717f42..01bcb68f61 100644 --- a/src/storage/checkpoint/ob_freeze_checkpoint.cpp +++ b/src/storage/checkpoint/ob_freeze_checkpoint.cpp @@ -141,4 +141,4 @@ int ObFreezeCheckpoint::finish_freeze() } // namespace checkpoint } // namespace storage -} // namespace oceanbase \ No newline at end of file +} // namespace oceanbase