From 791fde5022b78d8c4f7aa06558abe32abeddbb4a Mon Sep 17 00:00:00 2001 From: RebeccaMahany Date: Mon, 10 Aug 2026 14:57:06 -0400 Subject: [PATCH 1/4] Upgrade modernc.org/sqlite to latest --- go.mod | 10 +++++----- go.sum | 44 ++++++++++++++++++++++++-------------------- 2 files changed, 29 insertions(+), 25 deletions(-) diff --git a/go.mod b/go.mod index 18cf21098..2274d15b6 100644 --- a/go.mod +++ b/go.mod @@ -31,7 +31,7 @@ require ( golang.org/x/image v0.43.0 golang.org/x/net v0.55.0 // indirect golang.org/x/sync v0.21.0 - golang.org/x/sys v0.46.0 + golang.org/x/sys v0.47.0 golang.org/x/text v0.39.0 golang.org/x/time v0.8.0 google.golang.org/grpc v1.82.1 @@ -66,7 +66,7 @@ require ( go.opentelemetry.io/otel/sdk/metric v1.43.0 go.uber.org/goleak v1.3.0 go.yaml.in/yaml/v4 v4.0.0-rc.4 - modernc.org/sqlite v1.37.1 + modernc.org/sqlite v1.56.0 ) require ( @@ -105,7 +105,7 @@ require ( github.com/lucasb-eyer/go-colorful v1.2.0 // indirect github.com/magiconair/properties v1.8.9 // indirect github.com/mattn/go-colorable v0.1.14 // indirect - github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-isatty v0.0.24 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/mholt/archives v0.1.5 // indirect github.com/mikelolasagasti/xz v1.0.1 // indirect @@ -115,7 +115,7 @@ require ( github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/muesli/reflow v0.2.1-0.20210115123740-9e1d0d53df68 // indirect github.com/muesli/termenv v0.15.1 // indirect - github.com/ncruces/go-strftime v0.1.9 // indirect + github.com/ncruces/go-strftime v1.0.0 // indirect github.com/nwaples/rardecode/v2 v2.2.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/pelletier/go-toml/v2 v2.2.3 // indirect @@ -149,7 +149,7 @@ require ( golang.org/x/term v0.44.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 // indirect - modernc.org/libc v1.65.7 // indirect + modernc.org/libc v1.74.4 // indirect modernc.org/mathutil v1.7.1 // indirect modernc.org/memory v1.11.0 // indirect ) diff --git a/go.sum b/go.sum index 561d9eb8b..b4098959b 100644 --- a/go.sum +++ b/go.sum @@ -197,8 +197,8 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi 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-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e h1:ijClszYn+mADRFY17kjQEVQ1XRhq2/JR1M3sGqeJoxs= -github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= +github.com/google/pprof v0.0.0-20260802141513-ef3492d7dac3 h1:LMLX+LgTNWpfvCBdFebv6EsYotImrt/Ppc5cXIriCSo= +github.com/google/pprof v0.0.0-20260802141513-ef3492d7dac3/go.mod h1:jl5iWTm0/hd5PjEYEOuwAJ57L/CibdZfrqZ5XA5GrCk= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -290,8 +290,8 @@ github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stg github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.24 h1:tGZZoVgT/KiqK1c8ocVLeDS8BSWMRd47J3Lbz7vsReI= +github.com/mattn/go-isatty v0.0.24/go.mod h1:nMCL3Zebbrt45jsMDgnfIwz6ydEQApk5oEI3HqDio6A= github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= @@ -317,8 +317,8 @@ github.com/muesli/termenv v0.11.1-0.20220204035834-5ac8409525e0/go.mod h1:Bd5NYQ github.com/muesli/termenv v0.15.1 h1:UzuTb/+hhlBugQz28rpzey4ZuKcZ03MeKsoG7IJZIxs= github.com/muesli/termenv v0.15.1/go.mod h1:HeAQPTzpfs016yGtA4g00CsdYnVLJvxsS4ANqrZs2sQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= -github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= +github.com/ncruces/go-strftime v1.0.0 h1:HMFp8mLCTPp341M/ZnA4qaf7ZlsbTc+miZjCLOFAw7w= +github.com/ncruces/go-strftime v1.0.0/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= github.com/nwaples/rardecode/v2 v2.2.0 h1:4ufPGHiNe1rYJxYfehALLjup4Ls3ck42CWwjKiOqu0A= @@ -637,8 +637,8 @@ 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.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw= -golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= +golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= 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-20210422114643-f5beecf764ed/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -773,26 +773,30 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= howett.net/plist v0.0.0-20181124034731-591f970eefbb h1:jhnBjNi9UFpfpl8YZhA9CrOqpnJdvzuiHsl/dnxl11M= howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= -modernc.org/cc/v4 v4.26.1 h1:+X5NtzVBn0KgsBCBe+xkDC7twLb/jNVj9FPgiwSQO3s= -modernc.org/cc/v4 v4.26.1/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0= -modernc.org/ccgo/v4 v4.28.0 h1:rjznn6WWehKq7dG4JtLRKxb52Ecv8OUGah8+Z/SfpNU= -modernc.org/ccgo/v4 v4.28.0/go.mod h1:JygV3+9AV6SmPhDasu4JgquwU81XAKLd3OKTUDNOiKE= -modernc.org/fileutil v1.3.1 h1:8vq5fe7jdtEvoCf3Zf9Nm0Q05sH6kGx0Op2CPx1wTC8= -modernc.org/fileutil v1.3.1/go.mod h1:HxmghZSZVAz/LXcMNwZPA/DRrQZEVP9VX0V4LQGQFOc= +modernc.org/cc/v4 v4.29.1 h1:MKgdCV3WykTSPqpVrnxdEDS0HEd2FHpKZDzxzU5LyeI= +modernc.org/cc/v4 v4.29.1/go.mod h1:OnovgIhbbMXMu1aISnJ0wvVD1KnW+cAUJkIrAWh+kVI= +modernc.org/ccgo/v4 v4.34.6 h1:sBgfIwyN0TQ9C5hwIeuqyeAKyMWnbvj2fvpF4L11uzU= +modernc.org/ccgo/v4 v4.34.6/go.mod h1:SZ8YcN9NG7XVsQYdm6jYBvi8PQP1qi+kqB6OhjqI3Fk= +modernc.org/fileutil v1.4.0 h1:j6ZzNTftVS054gi281TyLjHPp6CPHr2KCxEXjEbD6SM= +modernc.org/fileutil v1.4.0/go.mod h1:EqdKFDxiByqxLk8ozOxObDSfcVOv/54xDs/DUHdvCUU= modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI= modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito= -modernc.org/libc v1.65.7 h1:Ia9Z4yzZtWNtUIuiPuQ7Qf7kxYrxP1/jeHZzG8bFu00= -modernc.org/libc v1.65.7/go.mod h1:011EQibzzio/VX3ygj1qGFt5kMjP0lHb0qCW5/D/pQU= +modernc.org/gc/v3 v3.1.4 h1:2g65LGVSmFQrXeITAw97x7hCRvZFcyE1uDP+7Vng7JI= +modernc.org/gc/v3 v3.1.4/go.mod h1:HFK/6AGESC7Ex+EZJhJ2Gni6cTaYpSMmU/cT9RmlfYY= +modernc.org/goabi0 v0.2.0 h1:HvEowk7LxcPd0eq6mVOAEMai46V+i7Jrj13t4AzuNks= +modernc.org/goabi0 v0.2.0/go.mod h1:CEFRnnJhKvWT1c1JTI3Avm+tgOWbkOu5oPA8eH8LnMI= +modernc.org/libc v1.74.4 h1:fX1Omw4o2/1C2iRkkIsrQTasJQldLhRmuPreXLoWs9k= +modernc.org/libc v1.74.4/go.mod h1:eeQAS9W3sZeKYMFubydxJpII9ybHWshk+7or7bLG9co= modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg= modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI= modernc.org/memory v1.11.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw= -modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8= -modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns= +modernc.org/opt v0.2.0 h1:tGyef5ApycA7FSEOMraay9SaTk5zmbx7Tu+cJs4QKZg= +modernc.org/opt v0.2.0/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns= modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE= -modernc.org/sqlite v1.37.1 h1:EgHJK/FPoqC+q2YBXg7fUmES37pCHFc97sI7zSayBEs= -modernc.org/sqlite v1.37.1/go.mod h1:XwdRtsE1MpiBcL54+MbKcaDvcuej+IYSMfLN6gSKV8g= +modernc.org/sqlite v1.56.0 h1:/D8e2RfFqoy/Zc6PuC76U28zFwmI/sYx1Kjm4yEn9e0= +modernc.org/sqlite v1.56.0/go.mod h1:yCJ2cmAaIkHQ25oXWrF8H4O1lIfPYPR26yCEDj2P3pQ= modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0= modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= From 41968feab6b5c9970c8bf101e03b63d9c0cf2371 Mon Sep 17 00:00:00 2001 From: RebeccaMahany Date: Mon, 10 Aug 2026 17:16:26 -0400 Subject: [PATCH 2/4] Set _busy_timeout to 10 seconds --- .../storage/sqlite/keyvalue_store_sqlite.go | 19 +++++++-- .../sqlite/keyvalue_store_sqlite_test.go | 40 +++++++++++++++++++ 2 files changed, 56 insertions(+), 3 deletions(-) diff --git a/ee/agent/storage/sqlite/keyvalue_store_sqlite.go b/ee/agent/storage/sqlite/keyvalue_store_sqlite.go index 38146b339..ec51baced 100644 --- a/ee/agent/storage/sqlite/keyvalue_store_sqlite.go +++ b/ee/agent/storage/sqlite/keyvalue_store_sqlite.go @@ -25,6 +25,7 @@ type storeName int const ( StartupSettingsStore storeName = iota WatchdogLogStore storeName = 1 + busyTimeoutMs int = 10000 // 10 seconds ) var missingMigrationErrFormat = regexp.MustCompile(`no migration found for version \d+`) @@ -69,7 +70,7 @@ func OpenRO(ctx context.Context, slogger *slog.Logger, rootDirectory string, nam return nil, fmt.Errorf("unsupported table %d", name) } - conn, err := sql.Open("sqlite", dbLocation(rootDirectory)) + conn, err := open(dbLocation(rootDirectory)) if err != nil { return nil, fmt.Errorf("opening startup db in %s: %w", rootDirectory, err) } @@ -125,7 +126,7 @@ func validatedDbConn(ctx context.Context, rootDirectory string) (*sql.DB, error) } // Open and validate connection - conn, err := sql.Open("sqlite", startupDbFilepath) + conn, err := open(startupDbFilepath) if err != nil { return nil, fmt.Errorf("opening startup db in %s: %w", rootDirectory, err) } @@ -148,7 +149,7 @@ func validateDb(ctx context.Context, dbFilepath string) error { return fmt.Errorf("determining if db exists: %w", err) } - conn, err := sql.Open("sqlite", dbFilepath) + conn, err := open(dbFilepath) if err != nil { return fmt.Errorf("creating connection: %w", err) } @@ -174,6 +175,18 @@ func dbLocation(rootDirectory string) string { return path.Join(filepath.ToSlash(rootDirectory), "kv.sqlite") } +// open standardizes the options included in the DSN when creating a connection. +// Notably, it sets _busy_timeout so that we do not immediately get SQLITE_BUSY +// when there's database contention. +// See: https://sqlite.org/c3ref/busy_timeout.html +func open(dbFilepath string) (*sql.DB, error) { + conn, err := sql.Open("sqlite", fmt.Sprintf("file://%s?_busy_timeout=%d", dbFilepath, busyTimeoutMs)) + if err != nil { + return nil, fmt.Errorf("opening db: %w", err) + } + return conn, nil +} + // migrate makes sure that the database schema is correct. func (s *sqliteStore) migrate() error { d, err := iofs.New(migrations, "migrations") diff --git a/ee/agent/storage/sqlite/keyvalue_store_sqlite_test.go b/ee/agent/storage/sqlite/keyvalue_store_sqlite_test.go index 343c11477..2fb46fda1 100644 --- a/ee/agent/storage/sqlite/keyvalue_store_sqlite_test.go +++ b/ee/agent/storage/sqlite/keyvalue_store_sqlite_test.go @@ -1,9 +1,12 @@ package agentsqlite import ( + "context" "fmt" "os" + "strconv" "testing" + "time" "github.com/golang-migrate/migrate/v4" "github.com/golang-migrate/migrate/v4/database/sqlite" @@ -12,6 +15,7 @@ import ( "github.com/kolide/launcher/v2/pkg/log/multislogger" "github.com/stretchr/testify/require" "go.uber.org/goleak" + "golang.org/x/sync/semaphore" ) func TestMain(m *testing.M) { @@ -130,6 +134,42 @@ func TestGetSet(t *testing.T) { require.NoError(t, s.Close()) } +func TestGetSet_Simultaneous(t *testing.T) { + t.Parallel() + + testRootDir := t.TempDir() + + s, err := OpenRW(t.Context(), testRootDir, StartupSettingsStore) + require.NoError(t, err, "creating test store") + + flagKey := []byte(keys.UpdateChannel.String()) + + queryCount := int64(100) + queryWait := semaphore.NewWeighted(queryCount) + for i := range queryCount { + queryWait.Acquire(t.Context(), 1) + go func(idx int) { + defer queryWait.Release(1) + // Alternate between get and set operations so we test both reads and writes + if idx%2 == 0 { + flagVal := []byte(strconv.Itoa(idx)) + require.NoError(t, s.Set(flagKey, flagVal), "expected no error setting kv pair") + return + } + _, err := s.Get(flagKey) + require.NoError(t, err, "expected no error getting value") + }(int(i)) + } + + // Wait up to 5x busyTimeout for all queries to complete + queryCtx, queryCancel := context.WithTimeout(t.Context(), time.Duration(busyTimeoutMs*1000000*5)) + defer queryCancel() + + require.NoError(t, queryWait.Acquire(queryCtx, queryCount), "timed out or errored waiting for simultaneous queries to complete") + + require.NoError(t, s.Close()) +} + func TestUpdate(t *testing.T) { t.Parallel() From ecf7faf3b92fa4ad9d0ba4ed12e85a69619d7c94 Mon Sep 17 00:00:00 2001 From: RebeccaMahany Date: Mon, 10 Aug 2026 17:26:46 -0400 Subject: [PATCH 3/4] Fix DSN --- ee/agent/storage/sqlite/keyvalue_store_sqlite.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ee/agent/storage/sqlite/keyvalue_store_sqlite.go b/ee/agent/storage/sqlite/keyvalue_store_sqlite.go index ec51baced..bde1ce36b 100644 --- a/ee/agent/storage/sqlite/keyvalue_store_sqlite.go +++ b/ee/agent/storage/sqlite/keyvalue_store_sqlite.go @@ -25,7 +25,8 @@ type storeName int const ( StartupSettingsStore storeName = iota WatchdogLogStore storeName = 1 - busyTimeoutMs int = 10000 // 10 seconds + + busyTimeoutMs int = 10000 // 10 seconds ) var missingMigrationErrFormat = regexp.MustCompile(`no migration found for version \d+`) @@ -180,7 +181,7 @@ func dbLocation(rootDirectory string) string { // when there's database contention. // See: https://sqlite.org/c3ref/busy_timeout.html func open(dbFilepath string) (*sql.DB, error) { - conn, err := sql.Open("sqlite", fmt.Sprintf("file://%s?_busy_timeout=%d", dbFilepath, busyTimeoutMs)) + conn, err := sql.Open("sqlite", fmt.Sprintf("file:%s?_busy_timeout=%d", dbFilepath, busyTimeoutMs)) if err != nil { return nil, fmt.Errorf("opening db: %w", err) } From 6f8533f20545377d9ec04201bcc611ee695e25a4 Mon Sep 17 00:00:00 2001 From: RebeccaMahany Date: Mon, 10 Aug 2026 17:31:13 -0400 Subject: [PATCH 4/4] Fix up error reporting in test --- .../sqlite/keyvalue_store_sqlite_test.go | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/ee/agent/storage/sqlite/keyvalue_store_sqlite_test.go b/ee/agent/storage/sqlite/keyvalue_store_sqlite_test.go index 2fb46fda1..04e7b9080 100644 --- a/ee/agent/storage/sqlite/keyvalue_store_sqlite_test.go +++ b/ee/agent/storage/sqlite/keyvalue_store_sqlite_test.go @@ -146,6 +146,7 @@ func TestGetSet_Simultaneous(t *testing.T) { queryCount := int64(100) queryWait := semaphore.NewWeighted(queryCount) + queryErrors := make(chan error, queryCount) for i := range queryCount { queryWait.Acquire(t.Context(), 1) go func(idx int) { @@ -153,11 +154,14 @@ func TestGetSet_Simultaneous(t *testing.T) { // Alternate between get and set operations so we test both reads and writes if idx%2 == 0 { flagVal := []byte(strconv.Itoa(idx)) - require.NoError(t, s.Set(flagKey, flagVal), "expected no error setting kv pair") + if err := s.Set(flagKey, flagVal); err != nil { + queryErrors <- err + } return } - _, err := s.Get(flagKey) - require.NoError(t, err, "expected no error getting value") + if _, err := s.Get(flagKey); err != nil { + queryErrors <- err + } }(int(i)) } @@ -165,7 +169,17 @@ func TestGetSet_Simultaneous(t *testing.T) { queryCtx, queryCancel := context.WithTimeout(t.Context(), time.Duration(busyTimeoutMs*1000000*5)) defer queryCancel() - require.NoError(t, queryWait.Acquire(queryCtx, queryCount), "timed out or errored waiting for simultaneous queries to complete") + // Confirm queries completed + require.NoError(t, queryWait.Acquire(queryCtx, queryCount), "timed out waiting for simultaneous queries to complete") + + // Confirm no errors for queries + select { + case exampleErr := <-queryErrors: + t.Fatalf("got %d errors out of %d operations; example: %v", len(queryErrors), queryCount, exampleErr) + default: + // No errors + } + close(queryErrors) require.NoError(t, s.Close()) }