This is an automated email from the ASF dual-hosted git repository.

zeroshade pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/iceberg-go.git


The following commit(s) were added to refs/heads/main by this push:
     new de373a56 fix(table): removeSnaphosts postCommit now takes effect (#783)
de373a56 is described below

commit de373a56ec8dae21860d868193799ac43cadf828
Author: starpact <[email protected]>
AuthorDate: Tue Mar 17 06:16:36 2026 +0800

    fix(table): removeSnaphosts postCommit now takes effect (#783)
    
    `postCommit` of `removeSnapshotsUpdate` is ignored when applied to
    `MetadataBuilder`, so it actually never takes effect.
    
    
https://github.com/apache/iceberg-go/blob/a012a1770d70e0df6babcb63e42058f484390602/table/metadata.go#L508
    
    I made postCommit part of the constructor, as otherwise we have to:
    
    
https://github.com/apache/iceberg-go/blob/a012a1770d70e0df6babcb63e42058f484390602/table/transaction.go#L300-L301
    which seems pretty error-prone. Though this is technically a breaking
    change for a somewhat internal API.
---
 table/metadata.go                       | 4 ++--
 table/metadata_builder_internal_test.go | 2 +-
 table/transaction.go                    | 4 +---
 table/updates.go                        | 5 +++--
 table/updates_test.go                   | 5 ++---
 5 files changed, 9 insertions(+), 11 deletions(-)

diff --git a/table/metadata.go b/table/metadata.go
index 5d303c45..09db1481 100644
--- a/table/metadata.go
+++ b/table/metadata.go
@@ -485,7 +485,7 @@ func (b *MetadataBuilder) NextRowID() int64 {
        return b.currentNextRowID()
 }
 
-func (b *MetadataBuilder) RemoveSnapshots(snapshotIds []int64) error {
+func (b *MetadataBuilder) RemoveSnapshots(snapshotIds []int64, postCommit 
bool) error {
        if b.currentSnapshotID != nil && slices.Contains(snapshotIds, 
*b.currentSnapshotID) {
                return errors.New("current snapshot cannot be removed")
        }
@@ -505,7 +505,7 @@ func (b *MetadataBuilder) RemoveSnapshots(snapshotIds 
[]int64) error {
        }
        b.refs = newRefs
 
-       b.updates = append(b.updates, NewRemoveSnapshotsUpdate(snapshotIds))
+       b.updates = append(b.updates, NewRemoveSnapshotsUpdate(snapshotIds, 
postCommit))
 
        return nil
 }
diff --git a/table/metadata_builder_internal_test.go 
b/table/metadata_builder_internal_test.go
index 6c9fed32..79cca000 100644
--- a/table/metadata_builder_internal_test.go
+++ b/table/metadata_builder_internal_test.go
@@ -609,7 +609,7 @@ func TestRemoveSnapshotRemovesBranch(t *testing.T) {
 
        newBuilder, err := MetadataBuilderFromBase(meta, "")
        require.NoError(t, err)
-       require.NoError(t, 
newBuilder.RemoveSnapshots([]int64{snapshot.SnapshotID}))
+       require.NoError(t, 
newBuilder.RemoveSnapshots([]int64{snapshot.SnapshotID}, false))
        newMeta, err := newBuilder.Build()
        require.NoError(t, err)
        require.NotNil(t, newMeta)
diff --git a/table/transaction.go b/table/transaction.go
index c946c17b..860b70e2 100644
--- a/table/transaction.go
+++ b/table/transaction.go
@@ -297,9 +297,7 @@ func (t *Transaction) ExpireSnapshots(opts 
...ExpireSnapshotsOpt) error {
 
        // Only add the update if there are actually snapshots to delete
        if len(snapsToDelete) > 0 {
-               update := NewRemoveSnapshotsUpdate(snapsToDelete)
-               update.postCommit = cfg.postCommit
-               updates = append(updates, update)
+               updates = append(updates, 
NewRemoveSnapshotsUpdate(snapsToDelete, cfg.postCommit))
        }
 
        return t.apply(updates, reqs)
diff --git a/table/updates.go b/table/updates.go
index ad302a29..f79fe00e 100644
--- a/table/updates.go
+++ b/table/updates.go
@@ -417,15 +417,16 @@ type removeSnapshotsUpdate struct {
 
 // NewRemoveSnapshotsUpdate creates a new update that removes all snapshots 
from
 // the table metadata with the given snapshot IDs.
-func NewRemoveSnapshotsUpdate(ids []int64) *removeSnapshotsUpdate {
+func NewRemoveSnapshotsUpdate(ids []int64, postCommit bool) 
*removeSnapshotsUpdate {
        return &removeSnapshotsUpdate{
                baseUpdate:  baseUpdate{ActionName: UpdateRemoveSnapshots},
                SnapshotIDs: ids,
+               postCommit:  postCommit,
        }
 }
 
 func (u *removeSnapshotsUpdate) Apply(builder *MetadataBuilder) error {
-       return builder.RemoveSnapshots(u.SnapshotIDs)
+       return builder.RemoveSnapshots(u.SnapshotIDs, u.postCommit)
 }
 
 func (u *removeSnapshotsUpdate) PostCommit(ctx context.Context, preTable 
*Table, postTable *Table) error {
diff --git a/table/updates_test.go b/table/updates_test.go
index 831abb4b..c7d5c961 100644
--- a/table/updates_test.go
+++ b/table/updates_test.go
@@ -29,8 +29,7 @@ import (
 )
 
 func TestRemoveSnapshotsPostCommitSkipped(t *testing.T) {
-       update := NewRemoveSnapshotsUpdate([]int64{1, 2, 3})
-       update.postCommit = false
+       update := NewRemoveSnapshotsUpdate([]int64{1, 2, 3}, false)
 
        // PostCommit should return nil immediately when postCommit is false,
        // without accessing the table arguments (which are nil here)
@@ -90,7 +89,7 @@ func TestUnmarshalUpdates(t *testing.T) {
                                NewRemovePropertiesUpdate([]string{"key2"}),
                                NewRemoveSchemasUpdate([]int{1, 2, 3, 4}),
                                NewRemoveSpecUpdate([]int{1, 2, 3}),
-                               NewRemoveSnapshotsUpdate([]int64{1, 2}),
+                               NewRemoveSnapshotsUpdate([]int64{1, 2}, false),
                                NewRemoveSnapshotRefUpdate("main"),
                                NewSetDefaultSortOrderUpdate(1),
                                NewSetDefaultSpecUpdate(1),

Reply via email to