From 2959494648f0e906048df54550eb32538bfeb7c0 Mon Sep 17 00:00:00 2001 From: "alex.sharov" Date: Thu, 29 Jun 2023 09:57:52 +0700 Subject: [PATCH 1/2] save --- common/dbg/leak_detector.go | 2 + compress/decompress.go | 16 ++++--- kv/bitmapdb/fixed_size.go | 21 ++++++-- recsplit/index.go | 19 ++++---- state/aggregator_test.go | 2 +- state/btree_index.go | 96 +++++++++++++++++++++---------------- state/domain.go | 28 ++++------- state/domain_committed.go | 2 +- state/history.go | 8 +--- state/inverted_index.go | 8 +--- state/locality_index.go | 4 +- state/merge.go | 2 +- 12 files changed, 110 insertions(+), 98 deletions(-) diff --git a/common/dbg/leak_detector.go b/common/dbg/leak_detector.go index 5962b42b2..d4369f2be 100644 --- a/common/dbg/leak_detector.go +++ b/common/dbg/leak_detector.go @@ -10,6 +10,8 @@ import ( "github.com/ledgerwatch/log/v3" ) +const FileCloseLogLevel = log.LvlTrace + // LeakDetector - use it to find which resource was created but not closed (leaked) // periodically does print in logs resources which living longer than 1min with their creation stack trace // For example db transactions can call Add/Del from Begin/Commit/Rollback methods diff --git a/compress/decompress.go b/compress/decompress.go index 7e0c5b481..c6d2db62f 100644 --- a/compress/decompress.go +++ b/compress/decompress.go @@ -341,14 +341,16 @@ func (d *Decompressor) ModTime() time.Time { return d.modTime } -func (d *Decompressor) Close() error { - if err := mmap.Munmap(d.mmapHandle1, d.mmapHandle2); err != nil { - log.Trace("unmap", "err", err, "file", d.FileName()) - } - if err := d.f.Close(); err != nil { - return err +func (d *Decompressor) Close() { + if d.f != nil { + if err := mmap.Munmap(d.mmapHandle1, d.mmapHandle2); err != nil { + log.Log(dbg.FileCloseLogLevel, "unmap", "err", err, "file", d.FileName(), "stack", dbg.Stack()) + } + if err := d.f.Close(); err != nil { + log.Log(dbg.FileCloseLogLevel, "close", "err", err, "file", d.FileName(), "stack", dbg.Stack()) + } + d.f = nil } - return nil } func (d *Decompressor) FilePath() string { return d.filePath } diff --git a/kv/bitmapdb/fixed_size.go b/kv/bitmapdb/fixed_size.go index 96e8768c1..2570992c9 100644 --- a/kv/bitmapdb/fixed_size.go +++ b/kv/bitmapdb/fixed_size.go @@ -80,18 +80,19 @@ func OpenFixedSizeBitmaps(filePath string, bitsPerBitmap int) (*FixedSizeBitmaps func (bm *FixedSizeBitmaps) FileName() string { return bm.fileName } func (bm *FixedSizeBitmaps) FilePath() string { return bm.filePath } -func (bm *FixedSizeBitmaps) Close() error { +func (bm *FixedSizeBitmaps) Close() { if bm.m != nil { if err := bm.m.Unmap(); err != nil { log.Trace("unmap", "err", err, "file", bm.FileName()) } + bm.m = nil } if bm.f != nil { if err := bm.f.Close(); err != nil { - return err + log.Trace("close", "err", err, "file", bm.FileName()) } + bm.f = nil } - return nil } func (bm *FixedSizeBitmaps) At(item uint64) (res []uint64, err error) { @@ -215,8 +216,18 @@ func NewFixedSizeBitmapsWriter(indexFile string, bitsPerBitmap int, amount uint6 return idx, nil } func (w *FixedSizeBitmapsWriter) Close() { - _ = w.m.Unmap() - _ = w.f.Close() + if w.m != nil { + if err := w.m.Unmap(); err != nil { + log.Trace("unmap", "err", err, "file", w.f.Name()) + } + w.m = nil + } + if w.f != nil { + if err := w.f.Close(); err != nil { + log.Trace("close", "err", err, "file", w.f.Name()) + } + w.f = nil + } } func growFileToSize(f *os.File, size int) error { pageSize := os.Getpagesize() diff --git a/recsplit/index.go b/recsplit/index.go index 5942fbb5d..d1765a7d3 100644 --- a/recsplit/index.go +++ b/recsplit/index.go @@ -28,6 +28,7 @@ import ( "time" "unsafe" + "github.com/ledgerwatch/erigon-lib/common/dbg" "github.com/ledgerwatch/log/v3" "github.com/ledgerwatch/erigon-lib/common" @@ -174,17 +175,19 @@ func (idx *Index) BaseDataID() uint64 { return idx.baseDataID } func (idx *Index) FilePath() string { return idx.filePath } func (idx *Index) FileName() string { return idx.fileName } -func (idx *Index) Close() error { +func (idx *Index) Close() { if idx == nil { - return nil - } - if err := mmap.Munmap(idx.mmapHandle1, idx.mmapHandle2); err != nil { - log.Trace("unmap", "err", err, "file", idx.FileName()) + return } - if err := idx.f.Close(); err != nil { - return err + if idx.f != nil { + if err := mmap.Munmap(idx.mmapHandle1, idx.mmapHandle2); err != nil { + log.Log(dbg.FileCloseLogLevel, "unmap", "err", err, "file", idx.FileName(), "stack", dbg.Stack()) + } + if err := idx.f.Close(); err != nil { + log.Log(dbg.FileCloseLogLevel, "close", "err", err, "file", idx.FileName(), "stack", dbg.Stack()) + } + idx.f = nil } - return nil } func (idx *Index) skipBits(m uint16) int { diff --git a/state/aggregator_test.go b/state/aggregator_test.go index ff510c9e6..6ce3c0d3b 100644 --- a/state/aggregator_test.go +++ b/state/aggregator_test.go @@ -628,7 +628,7 @@ func Test_InitBtreeIndex(t *testing.T) { require.NoError(t, err) defer decomp.Close() - err = BuildBtreeIndexWithDecompressor(tmp+".bt", decomp, &background.Progress{}, logger) + err = BuildBtreeIndexWithDecompressor(tmp+".bt", decomp, &background.Progress{}, tmp, logger) require.NoError(t, err) bt, err := OpenBtreeIndexWithDecompressor(tmp+".bt", M, decomp) diff --git a/state/btree_index.go b/state/btree_index.go index 7ddcaaee3..7990076fd 100644 --- a/state/btree_index.go +++ b/state/btree_index.go @@ -14,14 +14,16 @@ import ( "time" "github.com/c2h5oh/datasize" - "github.com/ledgerwatch/erigon-lib/common/background" + "github.com/edsrzf/mmap-go" + "github.com/ledgerwatch/erigon-lib/common/dbg" "github.com/ledgerwatch/log/v3" + "github.com/ledgerwatch/erigon-lib/common/background" + "github.com/ledgerwatch/erigon-lib/common" "github.com/ledgerwatch/erigon-lib/common/length" "github.com/ledgerwatch/erigon-lib/compress" "github.com/ledgerwatch/erigon-lib/etl" - "github.com/ledgerwatch/erigon-lib/mmap" ) func logBase(n, base uint64) uint64 { @@ -709,8 +711,8 @@ func (btw *BtIndexWriter) Build() error { if btw.indexF, err = os.Create(tmpIdxFilePath); err != nil { return fmt.Errorf("create index file %s: %w", btw.indexFile, err) } - defer btw.indexF.Sync() defer btw.indexF.Close() + defer btw.indexF.Sync() btw.indexW = bufio.NewWriterSize(btw.indexF, etl.BufIOSize) defer btw.indexW.Flush() @@ -779,8 +781,7 @@ func (btw *BtIndexWriter) AddKey(key []byte, offset uint64) error { type BtIndex struct { alloc *btAlloc - mmapWin *[mmap.MaxMapSize]byte - mmapUnix []byte + m mmap.MMap data []byte file *os.File size int64 @@ -804,18 +805,18 @@ func CreateBtreeIndex(indexPath, dataPath string, M uint64, logger log.Logger) ( var DefaultBtreeM = uint64(2048) -func CreateBtreeIndexWithDecompressor(indexPath string, M uint64, decompressor *compress.Decompressor, p *background.Progress, logger log.Logger) (*BtIndex, error) { - err := BuildBtreeIndexWithDecompressor(indexPath, decompressor, p, logger) +func CreateBtreeIndexWithDecompressor(indexPath string, M uint64, decompressor *compress.Decompressor, p *background.Progress, tmpdir string, logger log.Logger) (*BtIndex, error) { + err := BuildBtreeIndexWithDecompressor(indexPath, decompressor, p, tmpdir, logger) if err != nil { return nil, err } return OpenBtreeIndexWithDecompressor(indexPath, M, decompressor) } -func BuildBtreeIndexWithDecompressor(indexPath string, kv *compress.Decompressor, p *background.Progress, logger log.Logger) error { +func BuildBtreeIndexWithDecompressor(indexPath string, kv *compress.Decompressor, p *background.Progress, tmpdir string, logger log.Logger) error { args := BtIndexWriterArgs{ IndexFile: indexPath, - TmpDir: filepath.Dir(indexPath), + TmpDir: tmpdir, } iw, err := NewBtIndexWriter(args, logger) @@ -913,10 +914,11 @@ func OpenBtreeIndexWithDecompressor(indexPath string, M uint64, kv *compress.Dec return nil, err } - if idx.mmapUnix, idx.mmapWin, err = mmap.Mmap(idx.file, int(idx.size)); err != nil { + idx.m, err = mmap.MapRegion(idx.file, int(idx.size), mmap.RDONLY, 0, 0) + if err != nil { return nil, err } - idx.data = idx.mmapUnix[:idx.size] + idx.data = idx.m[:idx.size] // Read number of keys and bytes per record pos := 8 @@ -932,11 +934,13 @@ func OpenBtreeIndexWithDecompressor(indexPath string, M uint64, kv *compress.Dec idx.getter = kv.MakeGetter() - idx.alloc = newBtAlloc(idx.keyCount, M, false) - idx.alloc.dataLookup = idx.dataLookup idx.dataoffset = uint64(pos) - idx.alloc.traverseDfs() - idx.alloc.fillSearchMx() + idx.alloc = newBtAlloc(idx.keyCount, M, false) + if idx.alloc != nil { + idx.alloc.dataLookup = idx.dataLookup + idx.alloc.traverseDfs() + idx.alloc.fillSearchMx() + } return idx, nil } @@ -958,10 +962,11 @@ func OpenBtreeIndex(indexPath, dataPath string, M uint64) (*BtIndex, error) { return nil, err } - if idx.mmapUnix, idx.mmapWin, err = mmap.Mmap(idx.file, int(idx.size)); err != nil { + idx.m, err = mmap.MapRegion(idx.file, int(idx.size), mmap.RDONLY, 0, 0) + if err != nil { return nil, err } - idx.data = idx.mmapUnix[:idx.size] + idx.data = idx.m[:idx.size] // Read number of keys and bytes per record pos := 8 @@ -984,11 +989,13 @@ func OpenBtreeIndex(indexPath, dataPath string, M uint64) (*BtIndex, error) { } idx.getter = idx.decompressor.MakeGetter() - idx.alloc = newBtAlloc(idx.keyCount, M, false) - idx.alloc.dataLookup = idx.dataLookup idx.dataoffset = uint64(pos) - idx.alloc.traverseDfs() - idx.alloc.fillSearchMx() + idx.alloc = newBtAlloc(idx.keyCount, M, false) + if idx.alloc != nil { + idx.alloc.dataLookup = idx.dataLookup + idx.alloc.traverseDfs() + idx.alloc.fillSearchMx() + } return idx, nil } @@ -1030,41 +1037,47 @@ func (b *BtIndex) FilePath() string { return b.filePath } func (b *BtIndex) FileName() string { return path.Base(b.filePath) } -func (b *BtIndex) Empty() bool { return b.keyCount == 0 } +func (b *BtIndex) Empty() bool { return b == nil || b.keyCount == 0 } func (b *BtIndex) KeyCount() uint64 { return b.keyCount } -func (b *BtIndex) Close() error { +func (b *BtIndex) Close() { if b == nil { - return nil - } - if err := mmap.Munmap(b.mmapUnix, b.mmapWin); err != nil { - return err + return } - if err := b.file.Close(); err != nil { - return err + if b.file != nil { + if err := b.m.Unmap(); err != nil { + log.Log(dbg.FileCloseLogLevel, "unmap", "err", err, "file", b.FileName(), "stack", dbg.Stack()) + } + b.m = nil + if err := b.file.Close(); err != nil { + log.Log(dbg.FileCloseLogLevel, "close", "err", err, "file", b.FileName(), "stack", dbg.Stack()) + } + b.file = nil } if b.decompressor != nil { - if err := b.decompressor.Close(); err != nil { - return err - } + b.decompressor.Close() + b.decompressor = nil } - return nil } func (b *BtIndex) Seek(x []byte) (*Cursor, error) { - if b.alloc != nil { - cursor, err := b.alloc.Seek(x) - if err != nil { - return nil, fmt.Errorf("seek key %x: %w", x, err) - } - return cursor, nil + if b.alloc == nil { + return nil, nil } - return nil, fmt.Errorf("seek has been failed") + cursor, err := b.alloc.Seek(x) + if err != nil { + return nil, fmt.Errorf("seek key %x: %w", x, err) + } + // cursor could be nil along with err if nothing found + return cursor, nil } // deprecated func (b *BtIndex) Lookup(key []byte) uint64 { + if b.alloc == nil { + return 0 + } cursor, err := b.alloc.Seek(key) if err != nil { panic(err) @@ -1073,6 +1086,9 @@ func (b *BtIndex) Lookup(key []byte) uint64 { } func (b *BtIndex) OrdinalLookup(i uint64) *Cursor { + if b.alloc == nil { + return nil + } if i > b.alloc.K { return nil } diff --git a/state/domain.go b/state/domain.go index 905009e07..b93b9c8df 100644 --- a/state/domain.go +++ b/state/domain.go @@ -84,9 +84,7 @@ func filesItemLess(i, j *filesItem) bool { } func (i *filesItem) closeFilesAndRemove() { if i.decompressor != nil { - if err := i.decompressor.Close(); err != nil { - log.Trace("close", "err", err, "file", i.decompressor.FileName()) - } + i.decompressor.Close() // paranoic-mode on: don't delete frozen files if !i.frozen { if err := os.Remove(i.decompressor.FilePath()); err != nil { @@ -96,9 +94,7 @@ func (i *filesItem) closeFilesAndRemove() { i.decompressor = nil } if i.index != nil { - if err := i.index.Close(); err != nil { - log.Trace("close", "err", err, "file", i.index.FileName()) - } + i.index.Close() // paranoic-mode on: don't delete frozen files if !i.frozen { if err := os.Remove(i.index.FilePath()); err != nil { @@ -108,9 +104,7 @@ func (i *filesItem) closeFilesAndRemove() { i.index = nil } if i.bindex != nil { - if err := i.bindex.Close(); err != nil { - log.Trace("close", "err", err, "file", i.bindex.FileName()) - } + i.bindex.Close() if err := os.Remove(i.bindex.FilePath()); err != nil { log.Trace("close", "err", err, "file", i.bindex.FileName()) } @@ -364,21 +358,15 @@ func (d *Domain) closeWhatNotInList(fNames []string) { }) for _, item := range toDelete { if item.decompressor != nil { - if err := item.decompressor.Close(); err != nil { - d.logger.Trace("close", "err", err, "file", item.decompressor.FileName()) - } + item.decompressor.Close() item.decompressor = nil } if item.index != nil { - if err := item.index.Close(); err != nil { - d.logger.Trace("close", "err", err, "file", item.index.FileName()) - } + item.index.Close() item.index = nil } if item.bindex != nil { - if err := item.bindex.Close(); err != nil { - d.logger.Trace("close", "err", err, "file", item.bindex.FileName()) - } + item.bindex.Close() item.bindex = nil } d.files.Delete(item) @@ -1023,7 +1011,7 @@ func (d *Domain) buildFiles(ctx context.Context, step uint64, collation Collatio btPath := filepath.Join(d.dir, btFileName) p := ps.AddNew(btFileName, uint64(valuesDecomp.Count()*2)) defer ps.Delete(p) - bt, err = CreateBtreeIndexWithDecompressor(btPath, DefaultBtreeM, valuesDecomp, p, d.logger) + bt, err = CreateBtreeIndexWithDecompressor(btPath, DefaultBtreeM, valuesDecomp, p, d.tmpdir, d.logger) if err != nil { return StaticFiles{}, fmt.Errorf("build %s values bt idx: %w", d.filenameBase, err) } @@ -1067,7 +1055,7 @@ func (d *Domain) BuildMissedIndices(ctx context.Context, g *errgroup.Group, ps * p := ps.AddNew("fixme", uint64(fitem.decompressor.Count())) defer ps.Delete(p) - if err := BuildBtreeIndexWithDecompressor(idxPath, fitem.decompressor, p, d.logger); err != nil { + if err := BuildBtreeIndexWithDecompressor(idxPath, fitem.decompressor, p, d.tmpdir, d.logger); err != nil { return fmt.Errorf("failed to build btree index for %s: %w", fitem.decompressor.FileName(), err) } return nil diff --git a/state/domain_committed.go b/state/domain_committed.go index 97f0127f9..968209dc5 100644 --- a/state/domain_committed.go +++ b/state/domain_committed.go @@ -539,7 +539,7 @@ func (d *DomainCommitted) mergeFiles(ctx context.Context, oldFiles SelectedStati } btPath := strings.TrimSuffix(idxPath, "kvi") + "bt" - valuesIn.bindex, err = CreateBtreeIndexWithDecompressor(btPath, 2048, valuesIn.decompressor, p, d.logger) + valuesIn.bindex, err = CreateBtreeIndexWithDecompressor(btPath, 2048, valuesIn.decompressor, p, d.tmpdir, d.logger) if err != nil { return nil, nil, nil, fmt.Errorf("create btindex %s [%d-%d]: %w", d.filenameBase, r.valuesStartTxNum, r.valuesEndTxNum, err) } diff --git a/state/history.go b/state/history.go index 0227c2213..b22a3bc25 100644 --- a/state/history.go +++ b/state/history.go @@ -254,15 +254,11 @@ func (h *History) closeWhatNotInList(fNames []string) { }) for _, item := range toDelete { if item.decompressor != nil { - if err := item.decompressor.Close(); err != nil { - h.logger.Trace("close", "err", err, "file", item.index.FileName()) - } + item.decompressor.Close() item.decompressor = nil } if item.index != nil { - if err := item.index.Close(); err != nil { - h.logger.Trace("close", "err", err, "file", item.index.FileName()) - } + item.index.Close() item.index = nil } h.files.Delete(item) diff --git a/state/inverted_index.go b/state/inverted_index.go index a4f8c3873..f516b8b8f 100644 --- a/state/inverted_index.go +++ b/state/inverted_index.go @@ -352,15 +352,11 @@ func (ii *InvertedIndex) closeWhatNotInList(fNames []string) { }) for _, item := range toDelete { if item.decompressor != nil { - if err := item.decompressor.Close(); err != nil { - ii.logger.Trace("close", "err", err, "file", item.index.FileName()) - } + item.decompressor.Close() item.decompressor = nil } if item.index != nil { - if err := item.index.Close(); err != nil { - ii.logger.Trace("close", "err", err, "file", item.index.FileName()) - } + item.index.Close() item.index = nil } ii.files.Delete(item) diff --git a/state/locality_index.go b/state/locality_index.go index 1f31b9dc5..cff9c4fc0 100644 --- a/state/locality_index.go +++ b/state/locality_index.go @@ -228,9 +228,7 @@ func closeLocalityIndexFilesAndRemove(i *ctxLocalityIdx, logger log.Logger) { i.file.src = nil } if i.bm != nil { - if err := i.bm.Close(); err != nil { - logger.Trace("close", "err", err, "file", i.bm.FileName()) - } + i.bm.Close() if err := os.Remove(i.bm.FilePath()); err != nil { logger.Trace("os.Remove", "err", err, "file", i.bm.FileName()) } diff --git a/state/merge.go b/state/merge.go index a33a18316..4a91f3ff1 100644 --- a/state/merge.go +++ b/state/merge.go @@ -637,7 +637,7 @@ func (d *Domain) mergeFiles(ctx context.Context, valuesFiles, indexFiles, histor p = ps.AddNew(btFileName, uint64(keyCount*2)) defer ps.Delete(p) btPath := filepath.Join(d.dir, btFileName) - err = BuildBtreeIndexWithDecompressor(btPath, valuesIn.decompressor, p, d.logger) + err = BuildBtreeIndexWithDecompressor(btPath, valuesIn.decompressor, p, d.tmpdir, d.logger) if err != nil { return nil, nil, nil, fmt.Errorf("merge %s btindex [%d-%d]: %w", d.filenameBase, r.valuesStartTxNum, r.valuesEndTxNum, err) } From af8f9f4ac85594a37acd1ad077b9f2331b3ed5a9 Mon Sep 17 00:00:00 2001 From: "alex.sharov" Date: Thu, 29 Jun 2023 10:01:15 +0700 Subject: [PATCH 2/2] save --- go.mod | 6 +++--- go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index dddc00a2b..76d20529d 100644 --- a/go.mod +++ b/go.mod @@ -33,13 +33,13 @@ require ( github.com/stretchr/testify v1.8.4 github.com/tidwall/btree v1.6.0 golang.org/x/crypto v0.10.0 - golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 + golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df golang.org/x/sync v0.3.0 golang.org/x/sys v0.9.0 golang.org/x/time v0.3.0 google.golang.org/grpc v1.56.1 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 - google.golang.org/protobuf v1.30.0 + google.golang.org/protobuf v1.31.0 ) require ( @@ -103,7 +103,7 @@ require ( go.etcd.io/bbolt v1.3.6 // indirect go.opentelemetry.io/otel v1.8.0 // indirect go.opentelemetry.io/otel/trace v1.8.0 // indirect - golang.org/x/mod v0.9.0 // indirect + golang.org/x/mod v0.11.0 // indirect golang.org/x/net v0.11.0 // indirect golang.org/x/text v0.10.0 // indirect golang.org/x/tools v0.7.0 // indirect diff --git a/go.sum b/go.sum index 0961de4ae..4f06766a1 100644 --- a/go.sum +++ b/go.sum @@ -422,8 +422,8 @@ golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU golang.org/x/crypto v0.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM= golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc= -golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= +golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df h1:UA2aFVmmsIlefxMk29Dp2juaUSth8Pyn3Tq5Y5mJGME= +golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -432,8 +432,8 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= -golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= +golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -576,8 +576,8 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=