@@ -347,32 +347,22 @@ Result<std::shared_ptr<Table>> Transaction::Commit() {
347347 return ctx_->table ;
348348 }
349349
350- Result<std::shared_ptr<Table>> commit_result;
351- if (!CanRetry ()) {
352- std::vector<std::unique_ptr<TableRequirement>> requirements;
353- switch (ctx_->kind ) {
354- case TransactionKind::kCreate : {
355- ICEBERG_ASSIGN_OR_RAISE (requirements, TableRequirements::ForCreateTable (updates));
356- } break ;
357- case TransactionKind::kUpdate : {
358- ICEBERG_ASSIGN_OR_RAISE (
359- requirements,
360- TableRequirements::ForUpdateTable (*ctx_->metadata_builder ->base (), updates));
361- } break ;
362- }
363- commit_result =
364- ctx_->table ->catalog ()->UpdateTable (ctx_->table ->name (), requirements, updates);
365- } else {
366- const auto & props = ctx_->table ->properties ();
367- int32_t num_retries = props.Get (TableProperties::kCommitNumRetries );
368- int32_t min_wait_ms = props.Get (TableProperties::kCommitMinRetryWaitMs );
369- int32_t max_wait_ms = props.Get (TableProperties::kCommitMaxRetryWaitMs );
370- int32_t total_timeout_ms = props.Get (TableProperties::kCommitTotalRetryTimeMs );
371-
372- commit_result =
373- MakeCommitRetryRunner (num_retries, min_wait_ms, max_wait_ms, total_timeout_ms)
374- .Run ([this ]() -> Result<std::shared_ptr<Table>> { return CommitOnce (); });
375- }
350+ const auto & props = ctx_->table ->properties ();
351+ int32_t num_retries =
352+ CanRetry () ? static_cast <int32_t >(props.Get (TableProperties::kCommitNumRetries ))
353+ : 0 ;
354+ int32_t min_wait_ms = props.Get (TableProperties::kCommitMinRetryWaitMs );
355+ int32_t max_wait_ms = props.Get (TableProperties::kCommitMaxRetryWaitMs );
356+ int32_t total_timeout_ms = props.Get (TableProperties::kCommitTotalRetryTimeMs );
357+
358+ bool is_first_attempt = true ;
359+ auto commit_result =
360+ MakeCommitRetryRunner (num_retries, min_wait_ms, max_wait_ms, total_timeout_ms)
361+ .Run ([this , &is_first_attempt]() -> Result<std::shared_ptr<Table>> {
362+ auto result = CommitOnce (is_first_attempt);
363+ is_first_attempt = false ;
364+ return result;
365+ });
376366
377367 for (const auto & update : pending_updates_) {
378368 std::ignore = update->Finalize (commit_result.has_value ()
@@ -389,27 +379,31 @@ Result<std::shared_ptr<Table>> Transaction::Commit() {
389379 return ctx_->table ;
390380}
391381
392- Result<std::shared_ptr<Table>> Transaction::CommitOnce () {
393- auto refresh_result = ctx_->table ->Refresh ();
394- if (!refresh_result.has_value ()) {
395- return std::unexpected (refresh_result.error ());
396- }
382+ Result<std::shared_ptr<Table>> Transaction::CommitOnce (bool is_first_attempt) {
383+ std::vector<std::unique_ptr<TableRequirement>> requirements;
397384
398- if (ctx_->metadata_builder ->base () != ctx_->table ->metadata ().get ()) {
399- ctx_->metadata_builder =
400- TableMetadataBuilder::BuildFrom (ctx_->table ->metadata ().get ());
401- for (const auto & update : pending_updates_) {
402- auto commit_status = update->Commit ();
403- if (!commit_status.has_value ()) {
404- return std::unexpected (commit_status.error ());
385+ switch (ctx_->kind ) {
386+ case TransactionKind::kCreate : {
387+ ICEBERG_ASSIGN_OR_RAISE (requirements, TableRequirements::ForCreateTable (
388+ ctx_->metadata_builder ->changes ()));
389+ } break ;
390+ case TransactionKind::kUpdate : {
391+ if (!is_first_attempt) {
392+ ICEBERG_RETURN_UNEXPECTED (ctx_->table ->Refresh ());
405393 }
406- }
394+ if (ctx_->metadata_builder ->base () != ctx_->table ->metadata ().get ()) {
395+ ctx_->metadata_builder =
396+ TableMetadataBuilder::BuildFrom (ctx_->table ->metadata ().get ());
397+ for (const auto & update : pending_updates_) {
398+ ICEBERG_RETURN_UNEXPECTED (Apply (*update));
399+ }
400+ }
401+ ICEBERG_ASSIGN_OR_RAISE (requirements, TableRequirements::ForUpdateTable (
402+ *ctx_->metadata_builder ->base (),
403+ ctx_->metadata_builder ->changes ()));
404+ } break ;
407405 }
408406
409- ICEBERG_ASSIGN_OR_RAISE (auto requirements, TableRequirements::ForUpdateTable (
410- *ctx_->metadata_builder ->base (),
411- ctx_->metadata_builder ->changes ()));
412-
413407 return ctx_->table ->catalog ()->UpdateTable (ctx_->table ->name (), requirements,
414408 ctx_->metadata_builder ->changes ());
415409}
0 commit comments