diff --git a/src/storage/backup/ob_backup_task.cpp b/src/storage/backup/ob_backup_task.cpp index 2813eae0b4..b2ac221696 100644 --- a/src/storage/backup/ob_backup_task.cpp +++ b/src/storage/backup/ob_backup_task.cpp @@ -73,6 +73,8 @@ static int advance_checkpoint_by_flush(const uint64_t tenant_id, const share::Ob const SCN &start_scn, storage::ObLS *ls) { int ret = OB_SUCCESS; + static const int64_t CHECK_TIME_INTERVAL = 1_s; + static const int64_t MAX_ADVANCE_TIME_INTERVAL = 60_s; const int64_t advance_checkpoint_timeout = GCONF._advance_checkpoint_timeout; LOG_INFO("backup advance checkpoint timeout", K(tenant_id), K(advance_checkpoint_timeout)); if (start_scn < SCN::min_scn()) { @@ -83,19 +85,30 @@ static int advance_checkpoint_by_flush(const uint64_t tenant_id, const share::Ob int64_t i = 0; const bool check_archive = false; const int64_t start_ts = ObTimeUtility::current_time(); + int64_t last_advance_checkpoint_ts = ObTimeUtility::current_time(); do { const int64_t cur_ts = ObTimeUtility::current_time(); + const int64_t advance_checkpoint_interval = MIN(std::pow(2, (2 * i + 1)) * 1000 * 1000, MAX_ADVANCE_TIME_INTERVAL); + const bool need_advance_checkpoint = (0 == i) || (cur_ts - last_advance_checkpoint_ts >= advance_checkpoint_interval); if (cur_ts - start_ts > advance_checkpoint_timeout) { ret = OB_BACKUP_ADVANCE_CHECKPOINT_TIMEOUT; LOG_WARN("backup advance checkpoint by flush timeout", K(ret), K(tenant_id), K(ls_id), K(start_scn)); - } else if (OB_FAIL(ls->advance_checkpoint_by_flush(start_scn))) { - if (OB_NO_NEED_UPDATE == ret) { - // clog checkpoint ts has passed start log ts - ret = OB_SUCCESS; - break; + } else if (need_advance_checkpoint) { + if (OB_FAIL(ls->advance_checkpoint_by_flush(start_scn))) { + if (OB_NO_NEED_UPDATE == ret) { + // clog checkpoint ts has passed start log ts + ret = OB_SUCCESS; + break; + } else { + LOG_WARN("failed to advance checkpoint by flush", K(ret), K(tenant_id), K(ls_id)); + } } else { - LOG_WARN("failed to advance checkpoint by flush", K(ret), K(tenant_id), K(ls_id)); + last_advance_checkpoint_ts = ObTimeUtility::current_time(); + i++; } + } + if (OB_FAIL(ret)) { + // do nothing } else if (OB_FAIL(ls->get_ls_meta(ls_meta))) { LOG_WARN("failed to get ls meta", K(ret), K(tenant_id), K(ls_id)); } else if (OB_FAIL(ls_meta.check_valid_for_backup())) { @@ -116,10 +129,14 @@ static int advance_checkpoint_by_flush(const uint64_t tenant_id, const share::Ob K(tenant_id), K(ls_id), K(clog_checkpoint_scn), - K(start_scn)); - sleep(1); + K(start_scn), + K(need_advance_checkpoint), + K(advance_checkpoint_interval), + K(cur_ts), + K(last_advance_checkpoint_ts)); } - i++; + ob_usleep(CHECK_TIME_INTERVAL); + share::dag_yield(); } } while (OB_SUCC(ret)); }