This is an automated email from the ASF dual-hosted git repository.
laskoviymishka 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 bb56f57f8 ci: enable modernize linter (#2072)
bb56f57f8 is described below
commit bb56f57f8eb24e03112222fbb6ab925326909a8b
Author: Ferhat Elmas <[email protected]>
AuthorDate: Wed Sep 30 15:43:52 2026 +0200
ci: enable modernize linter (#2072)
Signed-off-by: Ferhat Elmas <[email protected]>
---
.golangci.yml | 1 +
catalog/rest/load_table_bench_test.go | 4 ++--
catalog/sql/sql_test.go | 6 ++----
data_file_codec.go | 2 +-
data_file_codec_test.go | 2 +-
io/gocloud/blobfs/blob.go | 5 +----
manifest_projection_test.go | 2 +-
table/deferred_snapshots_test.go | 12 ++++--------
table/dv/roaring_bitmap.go | 10 ++--------
table/dv_scan_planning_test.go | 6 ++----
table/equality_delete_reader.go | 6 +++---
table/inspect_internal_test.go | 3 +--
table/inspect_partitions_bench_test.go | 2 +-
table/internal/utils.go | 4 ++--
table/internal/variant_shredding.go | 5 +----
table/orphan_cleanup.go | 2 +-
table/positional_delete_index_bench_test.go | 4 ++--
table/rolling_data_writer_test.go | 12 ++++--------
table/updates_test.go | 4 ++--
19 files changed, 34 insertions(+), 58 deletions(-)
diff --git a/.golangci.yml b/.golangci.yml
index 674605826..f7e1beab8 100644
--- a/.golangci.yml
+++ b/.golangci.yml
@@ -25,6 +25,7 @@ linters:
- copyloopvar
- usestdlibvars
- misspell
+ - modernize
- nlreturn
- perfsprint
- staticcheck
diff --git a/catalog/rest/load_table_bench_test.go
b/catalog/rest/load_table_bench_test.go
index 36658e996..c24fc39ad 100644
--- a/catalog/rest/load_table_bench_test.go
+++ b/catalog/rest/load_table_bench_test.go
@@ -145,7 +145,7 @@ func makeTableResponseWithSnapshots(snapshotCount int64)
[]byte {
panic(fmt.Errorf("failed to generate load table response: %w",
err))
}
- return []byte(fmt.Sprintf(`{
+ return fmt.Appendf(nil, `{
"metadata-location":
"s3://warehouse/database/table/metadata/00001-5f2f8166-244c-4eae-ac36-384ecdec81fc.gz.metadata.json",
"metadata": {
"format-version": 1,
@@ -190,5 +190,5 @@ func makeTableResponseWithSnapshots(snapshotCount int64)
[]byte {
}
]
}
- }`, snapshotTimestamp, snapshotID, snapshotID, snapshotsJson,
snapshotsLogEntriesJson))
+ }`, snapshotTimestamp, snapshotID, snapshotID, snapshotsJson,
snapshotsLogEntriesJson)
}
diff --git a/catalog/sql/sql_test.go b/catalog/sql/sql_test.go
index c27d95df2..58cb293db 100644
--- a/catalog/sql/sql_test.go
+++ b/catalog/sql/sql_test.go
@@ -1953,12 +1953,10 @@ func (s *SqliteCatalogTestSuite)
TestCreateNamespaceConcurrent() {
var wg sync.WaitGroup
for range writers {
- wg.Add(1)
- go func() {
- defer wg.Done()
+ wg.Go(func() {
<-start
errs <- cat.CreateNamespace(ctx, namespace, nil)
- }()
+ })
}
close(start)
wg.Wait()
diff --git a/data_file_codec.go b/data_file_codec.go
index dcd01d952..1aeb0c83c 100644
--- a/data_file_codec.go
+++ b/data_file_codec.go
@@ -182,7 +182,7 @@ func newDecodeEntry(version int) (any, *dataFile) {
return &manifestEntry{Data: df}, df
}
-var dataFileAvroFieldIndexes = avroFieldIndexes(reflect.TypeOf(dataFile{}))
+var dataFileAvroFieldIndexes = avroFieldIndexes(reflect.TypeFor[dataFile]())
func avroFieldIndexes(t reflect.Type) []int {
indexes := make([]int, 0, t.NumField())
diff --git a/data_file_codec_test.go b/data_file_codec_test.go
index 7ca765849..6ac4d16c5 100644
--- a/data_file_codec_test.go
+++ b/data_file_codec_test.go
@@ -146,7 +146,7 @@ func TestMarshalAvroEntryDoesNotMutateAnyAvroField(t
*testing.T) {
}
func TestDataFileAvroFieldIndexesCoverEveryAvroField(t *testing.T) {
- typ := reflect.TypeOf(dataFile{})
+ typ := reflect.TypeFor[dataFile]()
want := make([]int, 0, typ.NumField())
for i := range typ.NumField() {
if _, ok := typ.Field(i).Tag.Lookup("avro"); ok {
diff --git a/io/gocloud/blobfs/blob.go b/io/gocloud/blobfs/blob.go
index 260c02912..0bdad018b 100644
--- a/io/gocloud/blobfs/blob.go
+++ b/io/gocloud/blobfs/blob.go
@@ -486,10 +486,7 @@ func (bfs *FileIO) DeleteFiles(ctx context.Context, paths
[]string) ([]string, e
}
results := make([]result, len(paths))
- workers := len(paths)
- if workers > deleteFilesMaxConcurrency {
- workers = deleteFilesMaxConcurrency
- }
+ workers := min(len(paths), deleteFilesMaxConcurrency)
jobs := make(chan int)
var wg sync.WaitGroup
diff --git a/manifest_projection_test.go b/manifest_projection_test.go
index d7cd76c89..fdfe138af 100644
--- a/manifest_projection_test.go
+++ b/manifest_projection_test.go
@@ -32,7 +32,7 @@ func
TestManifestEntryProjectionWhitelistCoversDataFileSchema(t *testing.T) {
schema := NewSchema(1, NestedField{
ID: 1, Name: "id", Type: PrimitiveTypes.Int64, Required: true,
})
- dataFileType := reflect.TypeOf(dataFile{})
+ dataFileType := reflect.TypeFor[dataFile]()
dataFileFields := make(map[string]struct{},
len(dataFileAvroFieldIndexes))
for _, index := range dataFileAvroFieldIndexes {
name := dataFileType.Field(index).Tag.Get("avro")
diff --git a/table/deferred_snapshots_test.go b/table/deferred_snapshots_test.go
index 67fb72472..87dda88d1 100644
--- a/table/deferred_snapshots_test.go
+++ b/table/deferred_snapshots_test.go
@@ -355,13 +355,11 @@ func TestDeferredSnapshotsConcurrentMaterialization(t
*testing.T) {
var wg sync.WaitGroup
for range 32 {
- wg.Add(1)
- go func() {
- defer wg.Done()
+ wg.Go(func() {
require.NotNil(t, meta.CurrentSnapshot())
require.NotNil(t, meta.SnapshotByID(historicalID))
require.Len(t, meta.Snapshots(), 2)
- }()
+ })
}
wg.Wait()
}
@@ -410,11 +408,9 @@ func
TestDeferredSnapshotsConcurrentSingleLookupDoesNotMaterializeHistory(t *tes
var wg sync.WaitGroup
for range 32 {
- wg.Add(1)
- go func() {
- defer wg.Done()
+ wg.Go(func() {
require.Equal(t, historicalID,
meta.SnapshotByID(historicalID).SnapshotID)
- }()
+ })
}
wg.Wait()
diff --git a/table/dv/roaring_bitmap.go b/table/dv/roaring_bitmap.go
index 7f99fbe4b..0a72d4085 100644
--- a/table/dv/roaring_bitmap.go
+++ b/table/dv/roaring_bitmap.go
@@ -299,10 +299,7 @@ func (b *RoaringPositionBitmap) KeepMaskBytes(length
int64) []byte {
if bucketBitBase >= uint64(length) {
continue
}
- bucketBits := uint64(length) - bucketBitBase
- if bucketBits > 1<<32 {
- bucketBits = 1 << 32
- }
+ bucketBits := min(uint64(length)-bucketBitBase, 1<<32)
if bm.CardinalityInRange(0, bucketBits) < bm.DenseSize() {
it := bm.Iterator()
for it.HasNext() {
@@ -322,10 +319,7 @@ func (b *RoaringPositionBitmap) KeepMaskBytes(length
int64) []byte {
continue
}
// Cap the bucket's bit range to what fits in `length`.
- bucketBits = uint64(len(dense)) * 64
- if bucketBits > uint64(length)-bucketBitBase {
- bucketBits = uint64(length) - bucketBitBase
- }
+ bucketBits = min(uint64(len(dense))*64,
uint64(length)-bucketBitBase)
// bucketBitBase = key << 32 is always 8-byte-aligned, so the
// BitmapWordWriter runs with offset=0 internally. The
trailing-byte
// loop below relies on that alignment — PutNextTrailingByte's
diff --git a/table/dv_scan_planning_test.go b/table/dv_scan_planning_test.go
index 02f95b198..86a4cea49 100644
--- a/table/dv_scan_planning_test.go
+++ b/table/dv_scan_planning_test.go
@@ -230,11 +230,9 @@ func TestManifestEntries_ConcurrentMerge(t *testing.T) {
entries := newManifestEntries()
var wg sync.WaitGroup
for range manifestCount {
- wg.Add(1)
- go func() {
- defer wg.Done()
+ wg.Go(func() {
assert.NoError(t, entries.merge(batch))
- }()
+ })
}
wg.Wait()
diff --git a/table/equality_delete_reader.go b/table/equality_delete_reader.go
index be778b029..17993313b 100644
--- a/table/equality_delete_reader.go
+++ b/table/equality_delete_reader.go
@@ -319,9 +319,9 @@ func schemaForEqualityFields(current *iceberg.Schema,
schemas []*iceberg.Schema,
}
// Scan tasks do not retain the equality delete's sequence number, so
use
// the newest schema that can resolve the file's complete equality key.
- for i := len(schemas) - 1; i >= 0; i-- {
- if hasAllFields(schemas[i]) {
- return schemas[i]
+ for _, v := range slices.Backward(schemas) {
+ if hasAllFields(v) {
+ return v
}
}
diff --git a/table/inspect_internal_test.go b/table/inspect_internal_test.go
index 24ad364e4..57c992cd6 100644
--- a/table/inspect_internal_test.go
+++ b/table/inspect_internal_test.go
@@ -2224,8 +2224,7 @@ func
TestInspectFilesKeepCallerContextForManifestListRead(t *testing.T) {
}, nil
}
- ctx, cancel := context.WithCancel(context.Background())
- defer cancel()
+ ctx := t.Context()
manifests, err := tbl.Inspect().Manifests(ctx)
require.NoError(t, err)
manifests.Release()
diff --git a/table/inspect_partitions_bench_test.go
b/table/inspect_partitions_bench_test.go
index 38ac92999..cee48c384 100644
--- a/table/inspect_partitions_bench_test.go
+++ b/table/inspect_partitions_bench_test.go
@@ -133,7 +133,7 @@ func benchmarkInspectPartitionFiles(
partition := make(map[int]any, benchmark.fieldCount)
for field, partitionField := range partitionFields {
if benchmark.binary {
- partition[partitionField.FieldID] =
[]byte(fmt.Sprintf("partition-%d-field-%d", partitionID, field))
+ partition[partitionField.FieldID] =
fmt.Appendf(nil, "partition-%d-field-%d", partitionID, field)
} else {
partition[partitionField.FieldID] =
int32(partitionID + field)
}
diff --git a/table/internal/utils.go b/table/internal/utils.go
index 743985db8..92e4850ce 100644
--- a/table/internal/utils.go
+++ b/table/internal/utils.go
@@ -636,8 +636,8 @@ func TruncateUpperBoundBinary(val []byte, trunc int) []byte
{
result := slices.Clone(val[:trunc])
- for i := len(result) - 1; i >= 0; i-- {
- if result[i] < 255 {
+ for i, v := range slices.Backward(result) {
+ if v < 255 {
result[i]++
return result[:i+1]
diff --git a/table/internal/variant_shredding.go
b/table/internal/variant_shredding.go
index c7c8670fb..ce9ae9dad 100644
--- a/table/internal/variant_shredding.go
+++ b/table/internal/variant_shredding.go
@@ -388,10 +388,7 @@ func decimalArrowType(info *fieldInfo) arrow.DataType {
// Always Decimal128: arrow-go's pqarrow maps it to INT32/INT64/FLBA by
// precision and cannot serialize Decimal32/Decimal64.
intDigits := max(info.maxDecimalIntDigits, 0)
- prec := min(intDigits+info.maxDecimalScale, 38)
- if prec < 1 {
- prec = 1
- }
+ prec := max(min(intDigits+info.maxDecimalScale, 38), 1)
scale := info.maxDecimalScale
if maxScale := 38 - intDigits; scale > maxScale {
if maxScale < 0 {
diff --git a/table/orphan_cleanup.go b/table/orphan_cleanup.go
index dde04b57d..22d6a6019 100644
--- a/table/orphan_cleanup.go
+++ b/table/orphan_cleanup.go
@@ -196,7 +196,7 @@ func flattenURIEquivalences(equivalences map[string]string)
map[string]string {
continue
}
- for _, value := range strings.Split(group, ",") {
+ for value := range strings.SplitSeq(group, ",") {
flattened[strings.TrimSpace(value)] =
equivalences[group]
}
}
diff --git a/table/positional_delete_index_bench_test.go
b/table/positional_delete_index_bench_test.go
index 3ababeeb9..dd5ed66c2 100644
--- a/table/positional_delete_index_bench_test.go
+++ b/table/positional_delete_index_bench_test.go
@@ -97,8 +97,8 @@ func positionalDeletePartitionKeyBenchmarkFiles(
partition := make(map[int]any, fieldCount)
for field, partitionField := range partitionFields {
if binaryValue {
- partition[partitionField.FieldID] =
[]byte(fmt.Sprintf(
- "partition-%02d-%02d", i%100, field))
+ partition[partitionField.FieldID] =
fmt.Appendf(nil,
+ "partition-%02d-%02d", i%100, field)
} else {
partition[partitionField.FieldID] = int32(i %
100)
}
diff --git a/table/rolling_data_writer_test.go
b/table/rolling_data_writer_test.go
index b3426d463..717f6e5a2 100644
--- a/table/rolling_data_writer_test.go
+++ b/table/rolling_data_writer_test.go
@@ -315,16 +315,14 @@ func (s *RollingDataWriterTestSuite)
TestConcurrentGetOrCreateCreatesOneWriter()
var wg sync.WaitGroup
for range goroutineCount {
- wg.Add(1)
- go func() {
- defer wg.Done()
+ wg.Go(func() {
<-start
writer, err :=
factory.getOrCreateRollingDataWriter(s.ctx, "partition", nil, outputCh)
results <- struct {
writer *RollingDataWriter
err error
}{writer, err}
- }()
+ })
}
close(start)
@@ -1129,16 +1127,14 @@ func (s *RollingDataWriterTestSuite)
TestConcurrentAddDuringStreamErrorLeaksNoth
var atRetain, done sync.WaitGroup
atRetain.Add(senders)
for range senders {
- done.Add(1)
- go func() {
- defer done.Done()
+ done.Go(func() {
record := s.buildRecord(arrSchema, 3)
// Add retains (via gatedRetainRecord.Retain, which
parks the sender
// between the closed check and the enqueue) then
enqueues or aborts;
// the caller always drops its own reference afterward.
_ = writer.Add(gatedRetainRecord{RecordBatch: record,
retainGate: retainGate, atRetain: &atRetain})
record.Release()
- }()
+ })
}
atRetain.Wait() // every sender is past its closed check, parked in
Retain
diff --git a/table/updates_test.go b/table/updates_test.go
index de500074c..60e48c72c 100644
--- a/table/updates_test.go
+++ b/table/updates_test.go
@@ -730,7 +730,7 @@ func TestUnmarshalUpdatesRejectsMissingRequiredFields(t
*testing.T) {
for _, tt := range tests {
t.Run(tt.action, func(t *testing.T) {
var updates Updates
- data := []byte(fmt.Sprintf(`[{"action":%q}]`,
tt.action))
+ data := fmt.Appendf(nil, `[{"action":%q}]`, tt.action)
if tt.action == UpdateSetSnapshotRef {
data = snapshotRefPayload(tt.field, false)
}
@@ -797,7 +797,7 @@ func TestUnmarshalUpdatesRejectsNullRequiredPayload(t
*testing.T) {
for _, tt := range tests {
t.Run(tt.action+"/"+tt.field, func(t *testing.T) {
var updates Updates
- data := []byte(fmt.Sprintf(`[{"action":%q,%q:null}]`,
tt.action, tt.field))
+ data := fmt.Appendf(nil, `[{"action":%q,%q:null}]`,
tt.action, tt.field)
if tt.action == UpdateSetSnapshotRef {
data = snapshotRefPayload(tt.field, true)
}