diff --git a/src/logservice/restoreservice/ob_log_archive_piece_mgr.cpp b/src/logservice/restoreservice/ob_log_archive_piece_mgr.cpp index 37020ca3a..d2a4c41cc 100644 --- a/src/logservice/restoreservice/ob_log_archive_piece_mgr.cpp +++ b/src/logservice/restoreservice/ob_log_archive_piece_mgr.cpp @@ -603,7 +603,7 @@ bool ObLogArchivePieceContext::need_backward_round_(const palf::LSN &lsn) const if (min_round_id_ > 0 && round_context_.is_valid() && round_context_.round_id_ > min_round_id_ - && (inner_piece_context_.is_frozen_() || inner_piece_context_.is_empty_()) + && (inner_piece_context_.is_frozen_() || inner_piece_context_.is_empty_() || inner_piece_context_.is_gc_()) && round_context_.min_piece_id_ == inner_piece_context_.piece_id_ && inner_piece_context_.min_lsn_in_piece_ > lsn) { bret = true; @@ -1182,6 +1182,13 @@ int ObLogArchivePieceContext::get_(const palf::LSN &lsn, if (inner_piece_context_.min_lsn_in_piece_ <= lsn && inner_piece_context_.max_lsn_in_piece_ > lsn) { done = true; } + } else if (inner_piece_context_.is_gc_()) { + if (inner_piece_context_.max_lsn_in_piece_ <= lsn) { + done = false; + ret = OB_ITER_END; + } else if (inner_piece_context_.min_lsn_in_piece_ <= lsn && file_id <= inner_piece_context_.max_file_id_) { + done = true; + } } else { if (inner_piece_context_.min_lsn_in_piece_ <= lsn && file_id <= inner_piece_context_.max_file_id_) { done = true; @@ -1215,7 +1222,7 @@ int ObLogArchivePieceContext::get_(const palf::LSN &lsn, } // 已消费到最大依然没有定位到该LSN, 并且当前piece包含日志范围小于该LSN, 返回OB_ITER_END - if (! done) { + if (OB_SUCC(ret) && ! done) { if (inner_piece_context_.is_valid() && inner_piece_context_.round_id_ == max_round_id_ && inner_piece_context_.piece_id_ == round_context_.max_piece_id_ @@ -1225,7 +1232,7 @@ int ObLogArchivePieceContext::get_(const palf::LSN &lsn, } // 该日志流在该piece已GC, 并且最大LSN小于等于需要获取的LSN, 返回OB_ITER_END - if (! done) { + if (OB_SUCC(ret) && ! done) { if (inner_piece_context_.is_valid() && inner_piece_context_.is_gc_() && inner_piece_context_.max_lsn_in_piece_ <= lsn) { diff --git a/src/logservice/restoreservice/ob_remote_fetch_log_worker.cpp b/src/logservice/restoreservice/ob_remote_fetch_log_worker.cpp index 0a550dd1b..e1087cb26 100644 --- a/src/logservice/restoreservice/ob_remote_fetch_log_worker.cpp +++ b/src/logservice/restoreservice/ob_remote_fetch_log_worker.cpp @@ -317,9 +317,11 @@ int ObRemoteFetchWorker::handle_fetch_log_task_(ObFetchLogTask *task) } else { LOG_TRACE("pre read data is empty and failed", K(ret), KPC(task)); } + if (! is_fatal_error_(ret)) { + task->iter_.update_source_cb(); + } // not encounter fatal error or push submit array succ, just try retire task int tmp_ret = OB_SUCCESS; - task->iter_.update_source_cb(); if (OB_SUCCESS != (tmp_ret = try_retire_(task))) { LOG_WARN("retire task failed", K(tmp_ret), KP(task)); }