diff --git a/src/logservice/archiveservice/ob_archive_fetcher.cpp b/src/logservice/archiveservice/ob_archive_fetcher.cpp index 9b25305021..d9866df4d3 100644 --- a/src/logservice/archiveservice/ob_archive_fetcher.cpp +++ b/src/logservice/archiveservice/ob_archive_fetcher.cpp @@ -367,7 +367,9 @@ int ObArchiveFetcher::handle_log_fetch_task_(ObArchiveLogFetchTask &task) DEBUG_SYNC(BEFORE_ARCHIVE_FETCH_LOG); - if (! in_normal_status_(key)) { + // Only handle task in archive doing status + // Status includes: doing / suspend / interrupt / stop + if (! in_doing_status_(key)) { // skip } else if (OB_UNLIKELY(! task.is_valid())) { ret = OB_INVALID_ARGUMENT; @@ -898,6 +900,11 @@ bool ObArchiveFetcher::is_retry_ret_(const int ret_code) const } bool ObArchiveFetcher::in_normal_status_(const ArchiveKey &key) const +{ + return round_mgr_->is_in_archive_status(key) || round_mgr_->is_in_suspend_status(key); +} + +bool ObArchiveFetcher::in_doing_status_(const ArchiveKey &key) const { return round_mgr_->is_in_archive_status(key); } diff --git a/src/logservice/archiveservice/ob_archive_fetcher.h b/src/logservice/archiveservice/ob_archive_fetcher.h index b5f6855348..741e19ccb5 100644 --- a/src/logservice/archiveservice/ob_archive_fetcher.h +++ b/src/logservice/archiveservice/ob_archive_fetcher.h @@ -224,6 +224,8 @@ private: bool in_normal_status_(const ArchiveKey &key) const; + bool in_doing_status_(const ArchiveKey &key) const; + void statistic(const int64_t log_size, const int64_t ts); private: class TmpMemoryHelper diff --git a/src/logservice/archiveservice/ob_archive_round_mgr.cpp b/src/logservice/archiveservice/ob_archive_round_mgr.cpp index a2300d3ec0..8085658673 100644 --- a/src/logservice/archiveservice/ob_archive_round_mgr.cpp +++ b/src/logservice/archiveservice/ob_archive_round_mgr.cpp @@ -199,6 +199,12 @@ bool ObArchiveRoundMgr::is_in_archive_status(const ArchiveKey &key) const return key == key_ && log_archive_state_.is_doing(); } +bool ObArchiveRoundMgr::is_in_suspend_status(const ArchiveKey &key) const +{ + RLockGuard guard(rwlock_); + return key == key_ && log_archive_state_.is_suspend(); +} + bool ObArchiveRoundMgr::is_in_archive_stopping_status(const ArchiveKey &key) const { RLockGuard guard(rwlock_); diff --git a/src/logservice/archiveservice/ob_archive_round_mgr.h b/src/logservice/archiveservice/ob_archive_round_mgr.h index 4b48c3b3ba..2d40cb3713 100644 --- a/src/logservice/archiveservice/ob_archive_round_mgr.h +++ b/src/logservice/archiveservice/ob_archive_round_mgr.h @@ -59,6 +59,7 @@ public: int get_archive_start_scn(const ArchiveKey &key, share::SCN &scn); void get_archive_round_compatible(ArchiveKey &key, bool &compatible); bool is_in_archive_status(const ArchiveKey &key) const; + bool is_in_suspend_status(const ArchiveKey &key) const; bool is_in_archive_stopping_status(const ArchiveKey &key) const; bool is_in_archive_stop_status(const ArchiveKey &key) const; void update_log_archive_status(const ObArchiveRoundState::Status status); diff --git a/src/logservice/archiveservice/ob_archive_sender.cpp b/src/logservice/archiveservice/ob_archive_sender.cpp index ac3c71eaa7..af146c8a6e 100644 --- a/src/logservice/archiveservice/ob_archive_sender.cpp +++ b/src/logservice/archiveservice/ob_archive_sender.cpp @@ -421,7 +421,7 @@ int ObArchiveSender::do_free_send_task_() bool ObArchiveSender::in_normal_status_(const ArchiveKey &key) const { - return round_mgr_->is_in_archive_status(key); + return round_mgr_->is_in_archive_status(key) || round_mgr_->is_in_suspend_status(key); } // 仅有需要重试的任务返回错误码 @@ -436,6 +436,8 @@ void ObArchiveSender::handle(ObArchiveSendTask &task, TaskConsumeStatus &consume ARCHIVE_LOG(WARN, "invalid argument", K(ret), K(task)); } else if (OB_UNLIKELY(! in_normal_status_(station.get_round()))) { // not in normal status, just skip + // normal status include DOING / SUSPEND + // other status include INTERRUPT / STOP consume_status = TaskConsumeStatus::STALE_TASK; } else if (OB_FAIL(round_mgr_->get_backup_dest(station.get_round(), backup_dest))) { ARCHIVE_LOG(WARN, "get backup dest failed", K(ret), K(task));