You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iceberg.apache.org by ze...@apache.org on 2026/10/23 16:18:41 UTC

(iceberg-go) branch main updated: test(table): deflake TestPositionDeletePartitionedNoGoroutineLeak (#2289)

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 c1bd75d30 test(table): deflake TestPositionDeletePartitionedNoGoroutineLeak (#2289)
c1bd75d30 is described below

commit c1bd75d3036295e97913904e7dc76ac14a1bc3a5
Author: Matt Topol <zo...@gmail.com>
AuthorDate: Fri Oct 23 17:18:34 2026 +0100

    test(table): deflake TestPositionDeletePartitionedNoGoroutineLeak (#2289)
    
    The test compared runtime.NumGoroutine before and after 50 writes while running in parallel with other table tests, whose goroutines counted as leaks. It failed on main (runs 39276480459, 39674109108) and on unrelated PRs with deltas of 6. Run it serially and fail only on growth that scales with the iteration count; the leak it guards against adds one goroutine per iteration.
---
 table/pos_delete_partitioned_fanout_writer_test.go | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/table/pos_delete_partitioned_fanout_writer_test.go b/table/pos_delete_partitioned_fanout_writer_test.go
index 17229dd19..b45536c79 100644
--- a/table/pos_delete_partitioned_fanout_writer_test.go
+++ b/table/pos_delete_partitioned_fanout_writer_test.go
@@ -477,9 +477,9 @@ func TestPositionDeletePartitionedFanoutWriterEarlyStopCancelsRecordProduction(t
 	require.Zero(t, mem.CurrentAlloc())
 }
 
+// Not parallel: runtime.NumGoroutine counts every goroutine in the test binary,
+// so goroutines started by concurrently running tests would count as leaks.
 func TestPositionDeletePartitionedNoGoroutineLeak(t *testing.T) {
-	t.Parallel()
-
 	partitionSpec := iceberg.NewPartitionSpec(iceberg.PartitionField{
 		SourceIDs: []int{2},
 		Name:      "age_bucket",
@@ -541,9 +541,11 @@ func TestPositionDeletePartitionedNoGoroutineLeak(t *testing.T) {
 	after := runtime.NumGoroutine()
 
 	// Before the fix, each iteration leaked a goroutine from iter.Pull(args.counter)
-	// being called unconditionally but stopCount never invoked in the partitioned path.
-	// Allow a small margin for background runtime goroutines.
-	assert.LessOrEqual(t, after, before+5,
+	// being called unconditionally but stopCount never invoked in the partitioned path,
+	// so a regression grows the count by about one per iteration. Goroutines left by
+	// earlier tests can still start or exit in between, so only fail on growth that
+	// scales with the iteration count.
+	assert.Less(t, after-before, iterations/2,
 		"expected no goroutine growth after %d iterations, got %d -> %d (delta: %d)",
 		iterations, before, after, after-before)
 }