Skip to content

Commit

Permalink
WIP.
Browse files Browse the repository at this point in the history
  • Loading branch information
efritz committed Sep 12, 2024
1 parent ef9bd0f commit 1142098
Show file tree
Hide file tree
Showing 9 changed files with 129 additions and 216 deletions.
8 changes: 8 additions & 0 deletions .envrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#!/bin/bash

export TEST_PGHOST=localhost
export TEST_PGPORT=5432
export TEST_PGUSER=efritz
export TEST_PGPASSWORD=
export TEST_PGDATABASE=efritz
export TEST_TEMPLATEDB=template0
36 changes: 12 additions & 24 deletions batch_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ import (
"fmt"
"testing"

// TODO - use testify
"github.com/google/go-cmp/cmp"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

func TestBatchInserter(t *testing.T) {
Expand Down Expand Up @@ -110,9 +110,7 @@ func TestBatchInserterWithReturning(t *testing.T) {
// Insert rows and assert scanned serial ids
inserter := NewBatchInserter(db, "test", columns, WithBatchInserterReturn([]string{"id"}, collector.Scanner()))
runBatchInserter(t, inserter, rowValues)
if diff := cmp.Diff(expectedValues, collector.Slice()); diff != "" {
t.Errorf("unexpected values (-want +got):\n%s", diff)
}
assert.Equal(t, expectedValues, collector.Slice())
}

//
Expand All @@ -122,7 +120,7 @@ func setupTestBatchTable(t testing.TB, db DB) {
t.Helper()
ctx := context.Background()

if err := db.Exec(ctx, RawQuery(`
require.NoError(t, db.Exec(ctx, RawQuery(`
CREATE TABLE test (
id SERIAL,
w integer NOT NULL UNIQUE,
Expand All @@ -131,45 +129,35 @@ func setupTestBatchTable(t testing.TB, db DB) {
z integer NOT NULL,
q integer NOT NULL,
payload text
)`,
)); err != nil {
t.Fatalf("failed to create test table (%s)", err)
}
)
`)))
}

func runBatchInserter(t testing.TB, inserter *BatchInserter, rowValues [][]any) {
t.Helper()
ctx := context.Background()

for _, values := range rowValues {
if err := inserter.Insert(ctx, values...); err != nil {
t.Fatalf("failed to insert (%s)", err)
}
require.NoError(t, inserter.Insert(ctx, values...))
}

if err := inserter.Flush(ctx); err != nil {
t.Fatalf("failed to flush (%s)", err)
}
require.NoError(t, inserter.Flush(ctx))
}

func assertBatchInsertedValues(t testing.TB, db DB, columnName string, expectedValues []any) {
t.Helper()
ctx := context.Background()

if values, err := ScanAnys(db.Query(ctx, Query("SELECT {:col} FROM test", Args{"col": Quote(columnName)}))); err != nil {
t.Fatalf("failed to read test values (%s)", err)
} else if diff := cmp.Diff(expectedValues, values); diff != "" {
t.Errorf("unexpected values (-want +got):\n%s", diff)
}
values, err := ScanAnys(db.Query(ctx, Query("SELECT {:col} FROM test", Args{"col": Quote(columnName)})))
require.NoError(t, err)
assert.Equal(t, expectedValues, values)
}

func createBatchPayloads(t testing.TB, n int) []string {
payloads := make([]string, 0, n)
for i := 0; i < n; i++ {
payload, err := randomHexString(128)
if err != nil {
t.Fatalf("failed to generate random payload (%s)", err)
}
require.NoError(t, err)

payloads = append(payloads, fmt.Sprintf("payload-%s", payload))
}
Expand Down
22 changes: 15 additions & 7 deletions db_transaction.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,11 @@ func createSavepoint(ctx context.Context, tx *loggingTx) (*loggingSavepoint, err
}
savepointID := fmt.Sprintf("sp_%s", id)

// NOTE: Must interpolate identifier here as placeholders aren't valid in this position.
if err := tx.Exec(ctx, Query(fmt.Sprintf("SAVEPOINT %s", savepointID), Args{})); err != nil {
if err := tx.Exec(ctx, Query(
// NOTE: Must interpolate identifier here as placeholders aren't valid in this position.
fmt.Sprintf("SAVEPOINT %s", savepointID),
Args{},
)); err != nil {
return nil, err
}

Expand All @@ -82,13 +85,18 @@ func (tx *loggingSavepoint) Done(err error) (combinedErr error) {
defer func() { logDone(tx.logger, time.Since(tx.start), combinedErr) }()

if err != nil {
// NOTE: Must interpolate identifier here as placeholders aren't valid in this position.
rollbackErr := tx.Exec(context.Background(), Query(fmt.Sprintf("ROLLBACK TO %s", tx.savepointID), Args{}))
return errors.Join(err, rollbackErr)
return errors.Join(err, tx.Exec(context.Background(), Query(
// NOTE: Must interpolate identifier here as placeholders aren't valid in this position.
fmt.Sprintf("ROLLBACK TO %s", tx.savepointID),
Args{},
)))
}

// NOTE: Must interpolate identifier here as placeholders aren't valid in this position.
return tx.Exec(context.Background(), Query(fmt.Sprintf("RELEASE %s", tx.savepointID), Args{}))
return tx.Exec(context.Background(), Query(
// NOTE: Must interpolate identifier here as placeholders aren't valid in this position.
fmt.Sprintf("RELEASE %s", tx.savepointID),
Args{},
))
}

var ErrPanicDuringTransaction = fmt.Errorf("encountered panic during transaction")
Expand Down
21 changes: 7 additions & 14 deletions db_transaction_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,12 +99,10 @@ func TestConcurrentTransactions(t *testing.T) {
setupTestTransactionTable(t, db)

tx, err := db.Transact(context.Background())
if err != nil {
t.Fatal(err)
}
require.NoError(t, err)
t.Cleanup(func() {
if err := tx.Done(err); err != nil {
t.Fatalf("closing transaction failed: %s", err)
require.NoError(t, err)
}
})

Expand Down Expand Up @@ -158,26 +156,21 @@ func recurSavepoints(t *testing.T, db DB, index, rollbackAt int) {
}

tx, err := db.Transact(context.Background())
if err != nil {
t.Fatalf("unexpected error creating transaction: %s", err)
}
require.NoError(t, err)
defer func() {
var doneErr error
if index == rollbackAt {
doneErr = errors.New("rollback")
}

if err := tx.Done(doneErr); !errors.Is(err, doneErr) {
t.Fatalf("unexpected error closing transaction. want=%q have=%q", doneErr, err)
}
err := tx.Done(doneErr)
require.ErrorIs(t, err, doneErr)
}()

if err := tx.Exec(context.Background(), Query(
require.NoError(t, tx.Exec(context.Background(), Query(
`INSERT INTO test VALUES ({:index}, {:index} * 2)`,
Args{"index": index},
)); err != nil {
t.Fatalf("unexpected error inserting count: %s", err)
}
)))

recurSavepoints(t, tx, index-1, rollbackAt)
}
Expand Down
16 changes: 8 additions & 8 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,16 @@ module github.com/go-nacelle/pgutil
go 1.21

require (
github.com/go-nacelle/log v1.0.1
github.com/go-nacelle/nacelle v1.1.0
github.com/google/go-cmp v0.6.0
github.com/jackc/pgconn v1.14.1
github.com/lib/pq v1.10.9
github.com/segmentio/fasthash v1.0.3
github.com/spf13/cobra v1.7.0
github.com/stretchr/testify v1.9.0
golang.org/x/exp v0.0.0-20231006140011-7918f672742d
golang.org/x/sync v0.8.0
)

require (
Expand All @@ -20,14 +28,11 @@ require (
github.com/fatih/structtag v1.0.0 // indirect
github.com/ghodss/yaml v1.0.0 // indirect
github.com/go-nacelle/config v1.1.0 // indirect
github.com/go-nacelle/log v1.0.1 // indirect
github.com/go-nacelle/process v1.0.0 // indirect
github.com/go-nacelle/service v1.0.0 // indirect
github.com/google/go-cmp v0.6.0 // indirect
github.com/google/uuid v1.3.1 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/jackc/chunkreader/v2 v2.0.1 // indirect
github.com/jackc/pgconn v1.14.1 // indirect
github.com/jackc/pgio v1.0.0 // indirect
github.com/jackc/pgpassfile v1.0.0 // indirect
github.com/jackc/pgproto3/v2 v2.3.2 // indirect
Expand All @@ -38,14 +43,9 @@ require (
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect
github.com/onsi/gomega v1.7.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/segmentio/fasthash v1.0.3 // indirect
github.com/spaolacci/murmur3 v1.1.0 // indirect
github.com/spf13/cobra v1.7.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/stretchr/testify v1.9.0 // indirect
golang.org/x/crypto v0.6.0 // indirect
golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect
golang.org/x/sync v0.8.0 // indirect
golang.org/x/sys v0.13.0 // indirect
golang.org/x/text v0.7.0 // indirect
gopkg.in/yaml.v2 v2.2.4 // indirect
Expand Down
10 changes: 2 additions & 8 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,6 @@ github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0=
github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo=
github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8=
Expand All @@ -88,10 +87,10 @@ github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE=
github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8=
github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE=
github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c=
github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc=
github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak=
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A=
github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78=
github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA=
github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg=
Expand Down Expand Up @@ -124,7 +123,6 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0=
github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
Expand Down Expand Up @@ -199,7 +197,6 @@ golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACk
golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 h1:HuIa8hRrWRSrqYzx1qI49NNxhdi2PrY7gxVSq1JjLDc=
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
Expand All @@ -219,7 +216,6 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
golang.org/x/net v0.0.0-20190424112056-4829fb13d2c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80 h1:Ao/3l156eZf2AW5wK8a7/smtodRU+gha3+BeqJ69lRk=
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
Expand All @@ -243,24 +239,22 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190429094411-2cc0cad0ac78/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e h1:D5TXcfTk7xF7hvieo4QErS3qqCB4teTffacDWr7CI+0=
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
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=
golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
Expand Down
51 changes: 21 additions & 30 deletions locker_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ package pgutil
import (
"context"
"testing"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

func TestLocker(t *testing.T) {
Expand All @@ -12,22 +15,16 @@ func TestLocker(t *testing.T) {
)

locker, err := NewTransactionalLocker(db, StringKey("test"))
if err != nil {
t.Fatalf("failed to create locker (%s)", err)
}
require.NoError(t, err)

t.Run("sequential", func(t *testing.T) {
if err := locker.WithLock(ctx, 125, func(tx DB) error {
require.NoError(t, locker.WithLock(ctx, 125, func(tx DB) error {
return nil
}); err != nil {
t.Fatalf("failed to run function with lock (%s)", err)
}
}))

if err := locker.WithLock(ctx, 125, func(tx DB) error {
require.NoError(t, locker.WithLock(ctx, 125, func(tx DB) error {
return nil
}); err != nil {
t.Fatalf("failed to run function with lock (%s)", err)
}
}))
})

t.Run("concurrent", func(t *testing.T) {
Expand Down Expand Up @@ -55,37 +52,31 @@ func TestLocker(t *testing.T) {
close(block) // Unblock test routine

for err := range errors {
t.Fatalf("failed to run function with lock (%s)", err)
require.NoError(t, err)
}
}

runWithHeldLock(func() {
// Test acquisition of concurrently held lock
if acquired, err := locker.TryWithLock(ctx, 125, func(tx DB) error {
acquired, err := locker.TryWithLock(ctx, 125, func(tx DB) error {
return nil
}); err != nil {
t.Fatalf("failed to run function with lock (%s)", err)
} else if acquired {
t.Fatalf("expected lock acquisition to fail; held by another goroutine")
}
})
require.NoError(t, err)
assert.False(t, acquired)

// Test acquisition of concurrently un-held lock
if acquired, err := locker.TryWithLock(ctx, 126, func(tx DB) error {
acquired, err = locker.TryWithLock(ctx, 126, func(tx DB) error {
return nil
}); err != nil {
t.Fatalf("failed to run function with lock (%s)", err)
} else if !acquired {
t.Fatalf("expected lock to be acquirable")
}
})
require.NoError(t, err)
assert.True(t, acquired)
})

// Test acquisition of released lock
if acquired, err := locker.TryWithLock(ctx, 125, func(tx DB) error {
acquired, err := locker.TryWithLock(ctx, 125, func(tx DB) error {
return nil
}); err != nil {
t.Fatalf("failed to run function with lock (%s)", err)
} else if !acquired {
t.Fatalf("expected lock to be acquirable")
}
})
require.NoError(t, err)
assert.True(t, acquired)
})
}
Loading

0 comments on commit 1142098

Please sign in to comment.