diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 2dc9e9c..6400f09 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -11,7 +11,7 @@ jobs: strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] - go-version: [1.18.x] + go-version: [1.23.x] runs-on: ${{ matrix.os }} steps: - name: Checkout @@ -23,8 +23,8 @@ jobs: - name: golangci-lint uses: golangci/golangci-lint-action@v3 with: - version: v1.54.2 - args: --timeout=5m + version: v1.60.1 + args: --new-from-rev=master --timeout=5m install-mode: binary - name: Tests run: | @@ -40,7 +40,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v4 with: - go-version: 1.18.x + go-version: 1.23.x - name: Checkout code uses: actions/checkout@v3 diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 76d2a2f..7da259f 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -16,7 +16,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v4 with: - go-version: "1.18.x" + go-version: "1.23.x" - name: Run GoReleaser uses: goreleaser/goreleaser-action@v2 with: diff --git a/api/aws.go b/api/aws.go index 3fd34b6..54a21e9 100644 --- a/api/aws.go +++ b/api/aws.go @@ -24,36 +24,36 @@ func initAws(ctx context.Context) { log.Info(ctx, "AWS not enabled in config") return } - var providers []credentials.Provider - if config.AWS.AccessKey != "" && config.AWS.SecretKey != "" { - providers = append(providers, &credentials.StaticProvider{Value: credentials.Value{ - AccessKeyID: config.AWS.AccessKey, - SecretAccessKey: config.AWS.SecretKey, - SessionToken: "", - }}) - } - providers = append(providers, - &ec2rolecreds.EC2RoleProvider{ - Client: ec2metadata.New(session.Must(session.NewSession())), - }) - providers = append(providers, &credentials.EnvProvider{}) - - creds := credentials.NewChainCredentials(providers) - _, err := creds.Get() - if err != nil { - log.Error(ctx, "AWS not initialized", "error", err.Error()) - return - } - cfg := aws.NewConfig().WithRegion(config.AWS.Region).WithCredentials(creds) + cfg := aws.NewConfig().WithRegion(config.AWS.Region) if config.AWS.S3Endpoint != "" { cfg = cfg.WithEndpoint(config.AWS.S3Endpoint) } - awsSession, err = session.NewSession(cfg) - if err != nil { - log.Error(ctx, "AWS not initialized. Unable to create session.", "error", err.Error()) - return + + if config.AWS.AccessKey != "" && config.AWS.SecretKey != "" { + providers := []credentials.Provider{ + &credentials.StaticProvider{ + Value: credentials.Value{ + AccessKeyID: config.AWS.AccessKey, + SecretAccessKey: config.AWS.SecretKey, + SessionToken: "", + }, + }, + &ec2rolecreds.EC2RoleProvider{ + Client: ec2metadata.New(session.Must(session.NewSession())), + }, + &credentials.EnvProvider{}, + } + + creds := credentials.NewChainCredentials(providers) + _, err := creds.Get() + if err != nil { + log.Error(ctx, "AWS not initialized", "error", err.Error()) + return + } + cfg = cfg.WithCredentials(creds) } + awsSession = session.Must(session.NewSession(cfg)) log.Info(ctx, "AWS initialized") } diff --git a/api/lists.go b/api/lists.go index 438daf9..ef4e424 100644 --- a/api/lists.go +++ b/api/lists.go @@ -45,7 +45,7 @@ func (c *ListsController) Create(ctx *app.CreateListsContext) error { opts = append(opts, rankdb.WithListOption.Metadata(ctx.Payload.Metadata)) opts = append(opts, rankdb.WithListOption.MergeSplitSize(ctx.Payload.MergeSize, ctx.Payload.SplitSize)) opts = append(opts, rankdb.WithListOption.LoadIndex(ctx.Payload.LoadIndex)) - if ctx.Payload.Populate != nil && len(ctx.Payload.Populate) > 0 { + if len(ctx.Payload.Populate) > 0 { elems := morph.ApiElements{In: ctx.Payload.Populate}.Elements() elems.UpdateTime(time.Now()) elems.Deduplicate() diff --git a/go.mod b/go.mod index a83627c..a4dce8d 100644 --- a/go.mod +++ b/go.mod @@ -1,11 +1,11 @@ module github.com/Vivino/rankdb -go 1.18 +go 1.23 require ( github.com/BurntSushi/toml v1.3.2 github.com/aerospike/aerospike-client-go/v6 v6.12.0 - github.com/aws/aws-sdk-go v1.42.24 + github.com/aws/aws-sdk-go v1.55.6 github.com/cenkalti/backoff v2.2.1+incompatible github.com/dgraph-io/badger v1.6.0 github.com/goadesign/goa v1.4.3 @@ -23,8 +23,8 @@ require ( github.com/tinylib/msgp v1.1.2 github.com/ugorji/go/codec v1.1.7 go.etcd.io/bbolt v1.3.5 - golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 - golang.org/x/tools v0.13.0 + golang.org/x/lint v0.0.0-20241112194109-818c5a804067 + golang.org/x/tools v0.29.0 gopkg.in/DataDog/dd-trace-go.v1 v1.37.0 ) @@ -68,7 +68,7 @@ require ( github.com/apex/log v1.9.0 // indirect github.com/armon/go-metrics v0.3.10 // indirect github.com/atc0005/go-teams-notify/v2 v2.6.0 // indirect - github.com/aws/aws-sdk-go-v2 v1.11.2 // indirect + github.com/aws/aws-sdk-go-v2 v1.36.0 // indirect github.com/aws/aws-sdk-go-v2/config v1.11.0 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.6.4 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.8.2 // indirect @@ -79,7 +79,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/kms v1.11.1 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.6.2 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.11.1 // indirect - github.com/aws/smithy-go v1.11.0 // indirect + github.com/aws/smithy-go v1.22.2 // indirect github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb // indirect github.com/caarlos0/ctrlc v1.0.0 // indirect github.com/caarlos0/env/v6 v6.8.0 // indirect @@ -164,13 +164,13 @@ require ( gitlab.com/digitalxero/go-conventional-commit v1.0.7 // indirect go.opencensus.io v0.24.0 // indirect gocloud.dev v0.24.0 // indirect - golang.org/x/crypto v0.21.0 // indirect - golang.org/x/mod v0.12.0 // indirect - golang.org/x/net v0.23.0 // indirect + golang.org/x/crypto v0.32.0 // indirect + golang.org/x/mod v0.22.0 // indirect + golang.org/x/net v0.34.0 // indirect golang.org/x/oauth2 v0.10.0 // indirect - golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.14.0 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/sys v0.29.0 // indirect + golang.org/x/text v0.21.0 // indirect golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/api v0.126.0 // indirect diff --git a/go.sum b/go.sum index 7654ff6..94c5394 100644 --- a/go.sum +++ b/go.sum @@ -158,6 +158,7 @@ github.com/DataDog/sketches-go v1.0.0 h1:chm5KSXO7kO+ywGWJ0Zs6tdmWU8PBXSbywFVciL github.com/DataDog/sketches-go v1.0.0/go.mod h1:O+XkJHWk9w4hDwY2ZUDU31ZC9sNYlYo8DiFsxjYeo1k= github.com/DataDog/zstd v1.3.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ= +github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/DisgoOrg/disgohook v1.4.4 h1:6xU+nRtyCYX7RyKvRnroJE8JMv+YIrQEMBDGUjBGDlQ= github.com/DisgoOrg/disgohook v1.4.4/go.mod h1:l7r9dZgfkA3KiV+ErxqweKaknnskmzZO+SRTNHvJTUU= github.com/DisgoOrg/log v1.1.0/go.mod h1:Qihgz6fax3JCfuO7vxVavL0LyHS0sUdQ9OmykQ2fiQs= @@ -186,7 +187,9 @@ github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAE github.com/ProtonMail/go-crypto v0.0.0-20230923063757-afb1ddc0824c h1:kMFnB0vCcX7IL/m9Y5LO+KQYv+t1CQOiFe6+SV2J7bE= github.com/ProtonMail/go-crypto v0.0.0-20230923063757-afb1ddc0824c/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= github.com/ProtonMail/go-mime v0.0.0-20190923161245-9b5a4261663a h1:W6RrgN/sTxg1msqzFFb+G80MFmpjMw61IU+slm+wln4= +github.com/ProtonMail/go-mime v0.0.0-20190923161245-9b5a4261663a/go.mod h1:NYt+V3/4rEeDuaev/zw1zCq8uqVEuPHzDPo3OZrlGJ4= github.com/ProtonMail/gopenpgp/v2 v2.2.2 h1:u2m7xt+CZWj88qK1UUNBoXeJCFJwJCZ/Ff4ymGoxEXs= +github.com/ProtonMail/gopenpgp/v2 v2.2.2/go.mod h1:ajUlBGvxMH1UBZnaYO3d1FSVzjiC6kK9XlZYGiDCvpM= github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= @@ -203,6 +206,7 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apex/log v1.9.0 h1:FHtw/xuaM8AgmvDDTI9fiwoAL25Sq2cxojnZICUU8l0= github.com/apex/log v1.9.0/go.mod h1:m82fZlWIuiWzWP04XCTXmnX0xRkYYbCdYn8jbJeLBEA= @@ -218,6 +222,7 @@ github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/atc0005/go-teams-notify/v2 v2.6.0 h1:YegKDWbjlatR0fP2yHsQYXzTcUGNJXhm1/OiCgbyysc= github.com/atc0005/go-teams-notify/v2 v2.6.0/go.mod h1:xo6GejLDHn3tWBA181F8LrllIL0xC1uRsRxq7YNXaaY= github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= @@ -226,12 +231,13 @@ github.com/aws/aws-sdk-go v1.25.37/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpi github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48= github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go v1.40.34/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= -github.com/aws/aws-sdk-go v1.42.24 h1:pDUeL5+HaEK+CBKsnzmjZCpLmfRek9JLMM/KhjiQorU= -github.com/aws/aws-sdk-go v1.42.24/go.mod h1:gyRszuZ/icHmHAVE4gc/r+cfCmhA1AD+vqfWbgI+eHs= +github.com/aws/aws-sdk-go v1.55.6 h1:cSg4pvZ3m8dgYcgqB97MrcdjUmZ1BeMYKUxMMB89IPk= +github.com/aws/aws-sdk-go v1.55.6/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/aws/aws-sdk-go-v2 v1.0.0/go.mod h1:smfAbmpW+tcRVuNUjo3MOArSZmW72t62rkCzc2i0TWM= github.com/aws/aws-sdk-go-v2 v1.9.0/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= -github.com/aws/aws-sdk-go-v2 v1.11.2 h1:SDiCYqxdIYi6HgQfAWRhgdZrdnOuGyLDJVRSWLeHWvs= github.com/aws/aws-sdk-go-v2 v1.11.2/go.mod h1:SQfA+m2ltnu1cA0soUkj4dRSsmITiVQUJvBIZjzfPyQ= +github.com/aws/aws-sdk-go-v2 v1.36.0 h1:b1wM5CcE65Ujwn565qcwgtOTT1aT4ADOHHgglKjG7fk= +github.com/aws/aws-sdk-go-v2 v1.36.0/go.mod h1:5PMILGVKiW32oDzjj6RU52yrNrDPUHcbZQYr1sM7qmM= github.com/aws/aws-sdk-go-v2/config v1.0.0/go.mod h1:WysE/OpUgE37tjtmtJd8GXgT8s1euilE5XtUkRNUQ1w= github.com/aws/aws-sdk-go-v2/config v1.7.0/go.mod h1:w9+nMZ7soXCe5nT46Ri354SNhXDQ6v+V5wqDjnZE+GY= github.com/aws/aws-sdk-go-v2/config v1.11.0 h1:Czlld5zBB61A3/aoegA9/buZulwL9mHHfizh/Oq+Kqs= @@ -272,8 +278,9 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.11.1/go.mod h1:UV2N5HaPfdbDpkgkz4sRz github.com/aws/smithy-go v1.0.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/aws/smithy-go v1.9.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= -github.com/aws/smithy-go v1.11.0 h1:nOfSDwiiH232f90OuevPnAEQO5ZqH+xnn8uGVsvBCw4= github.com/aws/smithy-go v1.11.0/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM= +github.com/aws/smithy-go v1.22.2 h1:6D9hW43xKFrRx/tXXfAlIZc4JI+yQe6snnWcQyxSyLQ= +github.com/aws/smithy-go v1.22.2/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= @@ -291,6 +298,7 @@ github.com/caarlos0/ctrlc v1.0.0/go.mod h1:CdXpj4rmq0q/1Eb44M9zi2nKB0QraNKuRGYGr github.com/caarlos0/env/v6 v6.8.0 h1:abF9JinEXaibthiOowf4uSnRBWN66aJOxSpHLH67jeI= github.com/caarlos0/env/v6 v6.8.0/go.mod h1:FE0jGiAnQqtv2TenJ4KTa8+/T2Ss8kdS5s1VEjasoN0= github.com/caarlos0/go-rpmutils v0.2.1-0.20211112020245-2cd62ff89b11 h1:IRrDwVlWQr6kS1U8/EtyA1+EHcc4yl8pndcqXWrEamg= +github.com/caarlos0/go-rpmutils v0.2.1-0.20211112020245-2cd62ff89b11/go.mod h1:je2KZ+LxaCNvCoKg32jtOIULcFogJKcL1ZWUaIBjKj0= github.com/caarlos0/go-shellwords v1.0.12 h1:HWrUnu6lGbWfrDcFiHcZiwOLzHWjjrPVehULaTFgPp8= github.com/caarlos0/go-shellwords v1.0.12/go.mod h1:bYeeX1GrTLPl5cAMYEzdm272qdsQAZiaHgeF0KTk1Gw= github.com/caarlos0/testfs v0.4.4 h1:3PHvzHi5Lt+g332CiShwS8ogTgS3HjrmzZxCm6JCDr8= @@ -395,6 +403,7 @@ github.com/elastic/go-elasticsearch/v6 v6.8.5/go.mod h1:UwaDJsD3rWLM5rKNFzv9hgox github.com/elastic/go-elasticsearch/v7 v7.17.1/go.mod h1:OJ4wdbtDNk5g503kvlHLyErCgQwwzmDtaFC4XyOxXA4= github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= +github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= @@ -420,10 +429,12 @@ github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoD github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/frankban/quicktest v1.13.0/go.mod h1:qLE0fzW0VuyUAJgPU19zByoIr0HtCHN/r/VLSOOIySU= github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= +github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/garyburd/redigo v1.6.3/go.mod h1:rTb6epsqigu3kYKBnaF028A7Tf/Aw5s0cqA47doKKqw= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -431,6 +442,7 @@ github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= github.com/gin-gonic/gin v1.7.0/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY= +github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/go-asn1-ber/asn1-ber v1.3.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= github.com/go-chi/chi v1.5.0/go.mod h1:REp24E+25iKvxgeTfHmdUoL5x15kBiDBlnIl5bCwe2k= @@ -441,6 +453,7 @@ github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmS github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= github.com/go-git/go-git/v5 v5.11.0 h1:XIZc1p+8YzypNr34itUfSvYJcv+eYdTnTvOZ2vD3cA4= github.com/go-git/go-git/v5 v5.11.0/go.mod h1:6GFcX2P3NM7FPBfpePbpLd21XxsgdAt+lKqXmCUiUCY= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= @@ -616,6 +629,7 @@ github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIG github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -658,6 +672,7 @@ github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5i github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g= +github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k= github.com/goreleaser/chglog v0.5.0 h1:Sk6BMIpx8+vpAf8KyPit34OgWui8c7nKTMHhYx88jJ4= github.com/goreleaser/chglog v0.5.0/go.mod h1:Ri46M3lrMuv76FHszs3vtABR8J8k1w9JHYAzxeeOl28= github.com/goreleaser/fileglob v1.3.0 h1:/X6J7U8lbDpQtBvGcwwPS6OpzkNVlVEsFUVRx9+k+7I= @@ -692,6 +707,7 @@ github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39 github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v0.16.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= +github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= @@ -816,6 +832,7 @@ github.com/jackc/puddle v1.1.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dv github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.2.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jarcoal/httpmock v1.0.8 h1:8kI16SoO6LQKgPE7PvQuV+YuD/inwHd7fOOe2zMbo4k= +github.com/jarcoal/httpmock v1.0.8/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= @@ -842,6 +859,7 @@ github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.1.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= @@ -873,6 +891,7 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= @@ -1009,6 +1028,7 @@ github.com/onsi/gomega v1.27.1/go.mod h1:aHX5xOykVYzWOV4WqQy0sy8BQptgukenXpCXfad github.com/onsi/gomega v1.27.3/go.mod h1:5vG284IBtfDAmDyrK+eGyZmUgUlmi+Wngqo557cZ6Gw= github.com/onsi/gomega v1.27.4/go.mod h1:riYq/GJKh8hhoM01HN6Vmuy93AarCXCBGpvFDK3q3fQ= github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= @@ -1067,6 +1087,7 @@ github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= @@ -1102,8 +1123,10 @@ github.com/slack-go/slack v0.10.0/go.mod h1:wWL//kk0ho+FcQXcBTmEafUI5dz4qz5f4mMk github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= github.com/smartystreets/assertions v1.13.1 h1:Ef7KhSmjZcK6AVf9YbJdvPYG9avaF0ZxudX+ThRdWfU= +github.com/smartystreets/assertions v1.13.1/go.mod h1:cXr/IwVfSo/RbCSPhoAPv73p3hlSdrBH/b3SdnW/LMY= github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM= github.com/smartystreets/goconvey v1.8.0 h1:Oi49ha/2MURE0WexF052Z0m+BNSGirfjg5RL+JXWq3w= +github.com/smartystreets/goconvey v1.8.0/go.mod h1:EdX8jtrTIj26jmjCOVNMVSIYAtgexqXKHOXW2Dx9JLg= github.com/smartystreets/gunit v1.0.0/go.mod h1:qwPWnhz6pn0NnRBP++URONOVyNkPyr4SauJk4cUOwJs= github.com/smartystreets/gunit v1.1.3/go.mod h1:EH5qMBab2UclzXUcpR8b93eHsIlp9u+pDQIRp5DZNzQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -1143,6 +1166,7 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= github.com/technoweenie/multipartstreamer v1.0.1 h1:XRztA5MXiR1TIRHxH2uNxXxaIkKQDeX7m2XsSOlQEnM= github.com/technoweenie/multipartstreamer v1.0.1/go.mod h1:jNVxdtShOxzAsukZwTSw6MDx5eUJoiEBsSvzDU9uzog= @@ -1213,6 +1237,7 @@ github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6 github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo= +github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -1304,8 +1329,8 @@ golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= +golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1331,8 +1356,9 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20241112194109-818c5a804067 h1:adDmSQyFTCiv19j015EGKJBoaa7ElV0Q1Wovb/4G7NA= +golang.org/x/lint v0.0.0-20241112194109-818c5a804067/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -1352,8 +1378,8 @@ golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= +golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180530234432-1e491301e022/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1415,7 +1441,6 @@ golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211020060615-d418f374d309/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= @@ -1426,8 +1451,8 @@ golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= +golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1462,8 +1487,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1566,8 +1591,8 @@ golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= +golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1577,7 +1602,8 @@ golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= +golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1594,8 +1620,8 @@ golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1681,8 +1707,8 @@ golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= -golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE= +golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/list.go b/list.go index e12ffae..866e2a6 100644 --- a/list.go +++ b/list.go @@ -26,6 +26,7 @@ import ( // List contains the segments representing a list // as well as the index to look up segments by object ID. +// //msgp:tuple List type List struct { sync.RWMutex `msg:"-" json:"-"` @@ -55,6 +56,7 @@ type List struct { // ListOption can be used to specify options when creating a list. // Use either directly or use WithListOption. +// //msgp:ignore ListOption type ListOption func(*listOptions) error @@ -463,9 +465,9 @@ func (l *List) saveSegments(ctx context.Context, bs blobstore.Store, s *segments if !s.readOnly { l.updateSegments(ctx, s) } - l.RLock() + l.RWMutex.RLock() set := l.Set - l.RUnlock() + l.RWMutex.RUnlock() store := blobstore.StoreWithSet(bs, set) if s.scores != nil { err := s.scores.Save(ctx, store) @@ -497,15 +499,15 @@ func (l *List) cloneElements(ctx context.Context, bs blobstore.Store, org *List) oScores := oSegs.scores defer oSegs.unlock() - org.RLock() + org.RWMutex.RLock() oSet := org.Set - org.RUnlock() + org.RWMutex.RUnlock() - l.RLock() + l.RWMutex.RLock() dSet := l.Set dMergeSize := l.MergeSize dSplitSize := l.SplitSize - l.RUnlock() + l.RWMutex.RUnlock() bsDst := blobstore.StoreWithSet(bs, dSet) newSegments := l.newSegments(ctx, len(oScores.Segments), false, nil) @@ -575,18 +577,18 @@ func (l *List) Verify(ctx context.Context, bs blobstore.Store) error { // Verify a list without loading elements. func (l *List) verify(ctx context.Context, bs blobstore.Store, segs *segments) error { - l.RLock() + l.RWMutex.RLock() ctx = log.WithFn(ctx, "list_id", l.ID) set := l.Set lMergeSize := l.MergeSize lSplitSize := l.SplitSize lScores := l.Scores lIndex := l.Index - l.RUnlock() + l.RWMutex.RUnlock() err := func() error { - l.RLock() - defer l.RUnlock() + l.RWMutex.RLock() + defer l.RWMutex.RUnlock() if l.Scores.Unset() { return fmt.Errorf("Score Segments ID not set on list.") } @@ -671,9 +673,9 @@ func (l *List) verify(ctx context.Context, bs blobstore.Store, segs *segments) e // VerifyElements verifies elements in list. func (l *List) VerifyElements(ctx context.Context, bs blobstore.Store) error { - l.RLock() + l.RWMutex.RLock() ctx = log.WithFn(ctx, "list_id", l.ID) - l.RUnlock() + l.RWMutex.RUnlock() // We want a consistent view of elements/indexes, so we need update. segs, err := l.loadSegments(ctx, bs, segsReadOnly|segsLockUpdates) if err != nil { @@ -687,9 +689,9 @@ func (l *List) VerifyElements(ctx context.Context, bs blobstore.Store) error { // Caller should hold list updatelock for full consistency. func (l *List) verifyElements(ctx context.Context, bs blobstore.Store, segs *segments) error { ctx = log.WithFn(ctx) - l.RLock() + l.RWMutex.RLock() store := blobstore.StoreWithSet(bs, l.Set) - l.RUnlock() + l.RWMutex.RUnlock() var ids map[ElementID]SegmentID // We do not get the update lock since caller may be holding it. @@ -740,10 +742,10 @@ func (l *List) reindex(ctx context.Context, bs blobstore.Store, segs *segments) } ctx = log.WithFn(ctx, "list_id", l.ID) store := blobstore.StoreWithSet(bs, l.Set) - l.RLock() + l.RWMutex.RLock() mergeSize := l.MergeSize splitSize := l.SplitSize - l.RUnlock() + l.RWMutex.RUnlock() idx, err := segs.scores.ElementIndexAll(ctx, store) if err != nil { @@ -809,8 +811,8 @@ func (l *List) VerifyUnlocked(ctx context.Context, timeout time.Duration) error ok = make(chan struct{}) // We need read lock. - l.RLock() - defer l.RUnlock() + l.RWMutex.RLock() + defer l.RWMutex.RUnlock() testLock(log.Logger(ctx).New("lock", "list.loadingLock"), fail, &l.loadingLock, wg) testLock(log.Logger(ctx).New("lock", "list.segmentsLock"), fail, &l.segmentsLock, wg) testLock(log.Logger(ctx).New("lock", "list.updateLock"), fail, &l.updateLock, wg) @@ -887,9 +889,9 @@ func (l *List) populate(ctx context.Context, bs blobstore.Store, e Elements, seg ctx = log.WithFn(ctx, "list_id", l.ID) store := blobstore.StoreWithSet(bs, l.Set) - l.RLock() + l.RWMutex.RLock() hasValid := (!l.Scores.Unset() || !l.Index.Unset()) && segs != nil - l.RUnlock() + l.RWMutex.RUnlock() if hasValid { err := l.deleteAll(ctx, bs, segs) if err != nil { @@ -902,7 +904,7 @@ func (l *List) populate(ctx context.Context, bs blobstore.Store, e Elements, seg } // Retain full lock while populating. - l.Lock() + l.RWMutex.Lock() // Above ~200k we get significant slowdown, we defer these. var deferred Elements @@ -939,7 +941,7 @@ func (l *List) populate(ctx context.Context, bs blobstore.Store, e Elements, seg ids := IndexElements{make(Elements, 0, len(e))} scores, err := NewSegmentsElements(ctx, store, split, &ids) if err != nil { - l.Unlock() + l.RWMutex.Unlock() return segs, err } scores.cache = l.cache @@ -955,7 +957,7 @@ func (l *List) populate(ctx context.Context, bs blobstore.Store, e Elements, seg } idx.cache = l.cache segs.index = idx - l.Unlock() + l.RWMutex.Unlock() if len(deferred) > 0 { l.updateSegments(ctx, segs) @@ -1061,9 +1063,9 @@ func (l *List) ReleaseSegments(ctx context.Context) { var gotLoading, gotSegments, cancelled bool var done = make(chan struct{}) var mu sync.Mutex - l.RLock() + l.RWMutex.RLock() listID := l.ID - l.RUnlock() + l.RWMutex.RUnlock() // We add a one minute timeout, since we have seen deadlocks here. const timeout = time.Minute @@ -1144,8 +1146,8 @@ func (l *List) deleteAll(ctx context.Context, bs blobstore.Store, segs *segments if !segs.updateLocked { return errors.New("deleteAll: segments without update lock provided") } - l.Lock() - defer l.Unlock() + l.RWMutex.Lock() + defer l.RWMutex.Unlock() store := blobstore.StoreWithSet(bs, l.Set) if segs.scores != nil { @@ -1171,9 +1173,9 @@ func (l *List) deleteAll(ctx context.Context, bs blobstore.Store, segs *segments // May return less than requested elements if duplicates are provided or elements could not be found. func (l *List) getIndexElements(ctx context.Context, bs blobstore.Store, ids []ElementID, segs *segments) (IndexElements, error) { ctx = log.WithFn(ctx) - l.RLock() + l.RWMutex.RLock() set := l.Set - l.RUnlock() + l.RWMutex.RUnlock() // Look up element ids in index to get their segment. var scoreMap = make(map[uint64]struct{}, len(ids)) @@ -1228,9 +1230,9 @@ func (l *List) GetElements(ctx context.Context, bs blobstore.Store, ids []Elemen func (l *List) getElements(ctx context.Context, bs blobstore.Store, ids []ElementID, radius int, segs *segments) (RankedElements, error) { ctx = log.WithFn(ctx) scores := segs.scores - l.RLock() + l.RWMutex.RLock() set := l.Set - l.RUnlock() + l.RWMutex.RUnlock() // Disallow updates to scores until we have found the elements e, err := l.getIndexElements(ctx, bs, ids, segs) @@ -1259,10 +1261,10 @@ func (l *List) UpdateElements(ctx context.Context, bs blobstore.Store, elems Ele scores := segs.scores index := segs.index - l.RLock() + l.RWMutex.RLock() ctx = log.WithValues(ctx, "list_id", l.ID) set := l.Set - l.RUnlock() + l.RWMutex.RUnlock() store := blobstore.StoreWithSet(bs, set) scores.reindex() @@ -1511,9 +1513,9 @@ func (l *List) DeleteElements(ctx context.Context, bs blobstore.Store, ids []Ele scores := segs.scores index := segs.index - l.RLock() + l.RWMutex.RLock() set := l.Set - l.RUnlock() + l.RWMutex.RUnlock() // Retain scores lock until index is updated err = func() error { @@ -1648,9 +1650,9 @@ func (l *List) GetRankTop(ctx context.Context, bs blobstore.Store, offset, eleme // Requesting offset 0 will start with top ranked element. // Requesting offset equal to or grater than list length will return ErrOffsetOutOfBounds. func (l *List) getRankTop(ctx context.Context, bs blobstore.Store, offset, elements int, segs *segments) (Elements, error) { - l.RLock() + l.RWMutex.RLock() set := l.Set - l.RUnlock() + l.RWMutex.RUnlock() segIdx, eoff := segs.scores.segIdxTop(offset) if segIdx < 0 { @@ -1681,9 +1683,9 @@ func (l *List) GetRankBottom(ctx context.Context, bs blobstore.Store, offset, el // Requesting offset 0 will return the bottom element. // If offset is outside list range ErrOffsetOutOfBounds is returned. func (l *List) getRankBottom(ctx context.Context, bs blobstore.Store, offset, elements int, segs *segments) (Elements, error) { - l.RLock() + l.RWMutex.RLock() set := l.Set - l.RUnlock() + l.RWMutex.RUnlock() segIdx, eoff := segs.scores.segIdxBottom(offset) if segIdx < 0 { return nil, ErrOffsetOutOfBounds @@ -1703,9 +1705,9 @@ func (l *List) GetRankScoreDesc(ctx context.Context, bs blobstore.Store, score u return nil, err } defer segs.unlock() - l.RLock() + l.RWMutex.RLock() set := l.Set - l.RUnlock() + l.RWMutex.RUnlock() segIdx, above, total := segs.scores.segIdxScore(score) // log.Info(ctx, "got", "segIdx",segIdx, "above", above, "total", total, "score", score) if segIdx == -1 { @@ -1742,9 +1744,9 @@ func (l *List) GetPercentile(ctx context.Context, bs blobstore.Store, percentile return nil, err } defer segs.unlock() - l.RLock() + l.RWMutex.RLock() set := l.Set - l.RUnlock() + l.RWMutex.RUnlock() store := blobstore.StoreWithSet(bs, set) segOffs, total := segs.scores.topOffsets() @@ -1792,9 +1794,9 @@ func (l *List) Repair(ctx context.Context, bs blobstore.Store, clearIfErr bool) store := blobstore.StoreWithSet(bs, l.Set) stats, _ := l.Stats(ctx, bs, false) - l.RLock() + l.RWMutex.RLock() ctx = log.WithValues(ctx, "list_id", l.ID) - l.RUnlock() + l.RWMutex.RUnlock() segs, err := l.loadSegments(ctx, bs, segsWritable|segsLockUpdates) if err != nil { @@ -1815,7 +1817,7 @@ func (l *List) Repair(ctx context.Context, bs blobstore.Store, clearIfErr bool) }() // Now that no-one else is updating, make sure that no-one else reads from the list while we rebuild. - l.Lock() + l.RWMutex.Lock() segs.scores.SegmentsLock.Lock() segments := segs.scores.Segments allElements := make(Elements, 0, stats.Elements) @@ -1834,7 +1836,7 @@ func (l *List) Repair(ctx context.Context, bs blobstore.Store, clearIfErr bool) seg.unlock() } // Unlock so we can re-populate. - l.Unlock() + l.RWMutex.Unlock() segs.scores.SegmentsLock.Unlock() if allElements.Deduplicate() { @@ -1861,13 +1863,13 @@ func (l *List) Backup(ctx context.Context, bs blobstore.Store, w *WriterMsgp) er if err := w.SetVersion(backupVersion); err != nil { return err } - l.RLock() + l.RWMutex.RLock() store := blobstore.StoreWithSet(bs, l.Set) scores := ssegs.scores // Save list metadata. err = l.EncodeMsg(w.Writer()) - l.RUnlock() + l.RWMutex.RUnlock() if err != nil { return err } @@ -2023,10 +2025,10 @@ func (l *List) checkSplit(ctx context.Context, bs blobstore.Store, segs *segment scores := segs.scores index := segs.index - l.RLock() + l.RWMutex.RLock() splitSize := l.SplitSize mergeSize := l.MergeSize - l.RUnlock() + l.RWMutex.RUnlock() // Check if we should split using only read lock. shouldSplitFn := func(s *Segments) bool { @@ -2085,11 +2087,11 @@ func (l *List) split(ctx context.Context, bs blobstore.Store, segs *segments, me defer segs.unlock() } - l.RLock() + l.RWMutex.RLock() splitSize := l.SplitSize mergeSize := l.MergeSize store := blobstore.StoreWithSet(bs, l.Set) - l.RUnlock() + l.RWMutex.RUnlock() log.Info(ctx, "Splitting", "split_size", splitSize, "merge_size", mergeSize) defer func() { diff --git a/lists.go b/lists.go index 7be2d7d..71b1a1e 100644 --- a/lists.go +++ b/lists.go @@ -125,8 +125,8 @@ func (l Lists) Save(ctx context.Context, w io.Writer) error { return true } n++ - list.RLock() - defer list.RUnlock() + list.RWMutex.RLock() + defer list.RWMutex.RUnlock() err = list.EncodeMsg(msg) return err == nil }) @@ -252,9 +252,9 @@ func (l *Lists) Prune(ctx context.Context) error { log.Error(ctx, "Wrong list type:", "type", fmt.Sprintf("%T", value)) return true } - list.RLock() + list.RWMutex.RLock() li := list.LoadIndex - list.RUnlock() + list.RWMutex.RUnlock() // If LoadIndex is specified we only prune elements. if !li { list.ReleaseSegments(ctx) diff --git a/manager.go b/manager.go index 701c451..0892fd1 100644 --- a/manager.go +++ b/manager.go @@ -140,9 +140,9 @@ func (m *Manager) StartListSplitter(ctx context.Context, store blobstore.Store, select { case list := <-m.wantSplit: t := time.Now() - list.RLock() + list.RWMutex.RLock() ctx2 := log.WithValues(ctx, "list_id", list.ID) - list.RUnlock() + list.RWMutex.RUnlock() log.Info(ctx2, "Splitting/Merging list") err := list.split(ctx2, store, nil, true) if err != nil { diff --git a/segments.go b/segments.go index a3e7bf7..ab0ea77 100644 --- a/segments.go +++ b/segments.go @@ -680,10 +680,10 @@ func (s *Segments) Verify(ctx context.Context, bs blobstore.WithSet) error { prefix := fmt.Sprintf("Segment %v:", v.ID) if v.Updated == 0 { - return fmt.Errorf(prefix + "Updated time not set") + return fmt.Errorf("%sUpdated time not set", prefix) } if idx, ok := foundSegs[v.ID]; ok { - return fmt.Errorf(prefix+"Duplicate segment ID, at index %d and %d", idx, i) + return fmt.Errorf("%sDuplicate segment ID, at index %d and %d", prefix, idx, i) } foundSegs[v.ID] = i @@ -691,7 +691,7 @@ func (s *Segments) Verify(ctx context.Context, bs blobstore.WithSet) error { if i == 0 { // First segment should start at max. if v.Max != math.MaxUint64 || v.MaxTie != math.MaxUint32 { - return fmt.Errorf(prefix+"First segment did not start at maximum, was %v, %v", v.Max, v.MaxTie) + return fmt.Errorf("%sFirst segment did not start at maximum, was %v, %v", prefix, v.Max, v.MaxTie) } } else { s.SegmentsLock.RLock() @@ -700,16 +700,16 @@ func (s *Segments) Verify(ctx context.Context, bs blobstore.WithSet) error { // Maximum of this should be just after minimum of previous wantScore, wantTie := Element{Score: prev.Min, TieBreaker: prev.MinTie}.PrevMax() if v.Max != wantScore || v.MaxTie != wantTie { - return fmt.Errorf(prefix+"Does not line up with previous segment. Want score, tie (%d, %d), got (%d, %d)", - wantScore, wantTie, v.Max, v.MaxTie) + return fmt.Errorf("%sDoes not line up with previous segment. Want score, tie (%d, %d), got (%d, %d)", + prefix, wantScore, wantTie, v.Max, v.MaxTie) } if s.IsIndex { // MaxTie should be 0 on indexes if v.MinTie != 0 { - return fmt.Errorf(prefix + "Index segment did not end with mintie 0.") + return fmt.Errorf("%sIndex segment did not end with mintie 0", prefix) } if v.MaxTie != math.MaxUint32 { - return fmt.Errorf(prefix + "Index segment did not start with maxtie MAX.") + return fmt.Errorf("%sIndex segment did not start with maxtie MAX", prefix) } } } @@ -717,7 +717,7 @@ func (s *Segments) Verify(ctx context.Context, bs blobstore.WithSet) error { if i == len(s.Segments)-1 { // Last element should go down to 0 if v.Min != 0 || v.MinTie != 0 { - return fmt.Errorf(prefix+"Last segment did not end at 0, was %v, %v", v.Min, v.MinTie) + return fmt.Errorf("%sLast segment did not end at 0, was %v, %v", prefix, v.Min, v.MinTie) } } return nil @@ -756,20 +756,20 @@ func (s *Segments) VerifyElements(ctx context.Context, bs blobstore.WithSet, IDs prefix := fmt.Sprintf("Segment ID %v (#%d) Elements:", seg.ID, i) if !sort.SliceIsSorted(ls.elements, ls.elements.Sorter()) { - errC <- fmt.Errorf(prefix + "Not sorted") + errC <- fmt.Errorf("%sNot sorted", prefix) } if seg.N != len(ls.elements) { - errC <- fmt.Errorf(prefix+"Element counter wrong, is %d, should be %d", seg.N, len(ls.elements)) + errC <- fmt.Errorf("%sElement counter wrong, is %d, should be %d", prefix, seg.N, len(ls.elements)) } start, end := seg.FilterIdx(ls.elements) if start != 0 { log.Info(ctx, "Extra elements before start", "elements", len(ls.elements[start:]), "segment", seg) - errC <- fmt.Errorf(prefix+"%d Element(s) does not belong at START of segment", start) + errC <- fmt.Errorf("%s%d Element(s) does not belong at START of segment", prefix, start) } if end != len(ls.elements) { log.Info(ctx, "Extra elements after END", "elements", len(ls.elements[end:]), "segment", seg) - err := fmt.Errorf(prefix+"%d Element(s) does not belong at END of segment", len(ls.elements)-end) + err := fmt.Errorf("%s%d Element(s) does not belong at END of segment", prefix, len(ls.elements)-end) errC <- err } if seg.N != len(ls.elements) { @@ -781,7 +781,7 @@ func (s *Segments) VerifyElements(ctx context.Context, bs blobstore.WithSet, IDs defer elemsMu.Unlock() for _, elem := range ls.elements { if _, ok := elems[elem.ID]; ok { - errC <- fmt.Errorf(prefix+"Duplicate element ID: %v", elem.ID) + errC <- fmt.Errorf("%sDuplicate element ID: %v", prefix, elem.ID) return } if s.IsIndex { @@ -790,7 +790,7 @@ func (s *Segments) VerifyElements(ctx context.Context, bs blobstore.WithSet, IDs elems[elem.ID] = seg.ID } if elem.Updated == 0 { - errC <- fmt.Errorf(prefix+"Element %d does not have time set", 0) + errC <- fmt.Errorf("%sElement 0 does not have time set", prefix) return } }