diff --git a/database/cassandra/cassandra.go b/database/cassandra/cassandra.go index 74eecc98e..de25313e0 100644 --- a/database/cassandra/cassandra.go +++ b/database/cassandra/cassandra.go @@ -7,10 +7,9 @@ import ( nurl "net/url" "strconv" "strings" + "sync/atomic" "time" - "go.uber.org/atomic" - "github.com/gocql/gocql" "github.com/golang-migrate/migrate/v4/database" "github.com/golang-migrate/migrate/v4/database/multistmt" @@ -199,14 +198,14 @@ func (c *Cassandra) Close() error { } func (c *Cassandra) Lock() error { - if !c.isLocked.CAS(false, true) { + if !c.isLocked.CompareAndSwap(false, true) { return database.ErrLocked } return nil } func (c *Cassandra) Unlock() error { - if !c.isLocked.CAS(true, false) { + if !c.isLocked.CompareAndSwap(true, false) { return database.ErrNotLocked } return nil diff --git a/database/clickhouse/clickhouse.go b/database/clickhouse/clickhouse.go index d2b65c0ce..6bbce8120 100644 --- a/database/clickhouse/clickhouse.go +++ b/database/clickhouse/clickhouse.go @@ -7,10 +7,9 @@ import ( "net/url" "strconv" "strings" + "sync/atomic" "time" - "go.uber.org/atomic" - "github.com/golang-migrate/migrate/v4" "github.com/golang-migrate/migrate/v4/database" "github.com/golang-migrate/migrate/v4/database/multistmt" @@ -291,14 +290,14 @@ func (ch *ClickHouse) Drop() (err error) { } func (ch *ClickHouse) Lock() error { - if !ch.isLocked.CAS(false, true) { + if !ch.isLocked.CompareAndSwap(false, true) { return database.ErrLocked } return nil } func (ch *ClickHouse) Unlock() error { - if !ch.isLocked.CAS(true, false) { + if !ch.isLocked.CompareAndSwap(true, false) { return database.ErrNotLocked } diff --git a/database/cockroachdb/cockroachdb.go b/database/cockroachdb/cockroachdb.go index 699b3facd..250f907b3 100644 --- a/database/cockroachdb/cockroachdb.go +++ b/database/cockroachdb/cockroachdb.go @@ -8,13 +8,13 @@ import ( nurl "net/url" "regexp" "strconv" + "sync/atomic" "github.com/cockroachdb/cockroach-go/v2/crdb" "github.com/golang-migrate/migrate/v4" "github.com/golang-migrate/migrate/v4/database" "github.com/hashicorp/go-multierror" "github.com/lib/pq" - "go.uber.org/atomic" ) func init() { diff --git a/database/firebird/firebird.go b/database/firebird/firebird.go index e15ea96b8..bcece57f3 100644 --- a/database/firebird/firebird.go +++ b/database/firebird/firebird.go @@ -8,12 +8,12 @@ import ( "fmt" "io" nurl "net/url" + "sync/atomic" "github.com/golang-migrate/migrate/v4" "github.com/golang-migrate/migrate/v4/database" "github.com/hashicorp/go-multierror" _ "github.com/nakagami/firebirdsql" - "go.uber.org/atomic" ) func init() { @@ -107,14 +107,14 @@ func (f *Firebird) Close() error { } func (f *Firebird) Lock() error { - if !f.isLocked.CAS(false, true) { + if !f.isLocked.CompareAndSwap(false, true) { return database.ErrLocked } return nil } func (f *Firebird) Unlock() error { - if !f.isLocked.CAS(true, false) { + if !f.isLocked.CompareAndSwap(true, false) { return database.ErrNotLocked } return nil diff --git a/database/mongodb/mongodb.go b/database/mongodb/mongodb.go index 3a9a6be9e..b1334223a 100644 --- a/database/mongodb/mongodb.go +++ b/database/mongodb/mongodb.go @@ -7,6 +7,7 @@ import ( "net/url" "os" "strconv" + "sync/atomic" "time" "github.com/cenkalti/backoff/v4" @@ -16,7 +17,6 @@ import ( "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" "go.mongodb.org/mongo-driver/x/mongo/driver/connstring" - "go.uber.org/atomic" ) func init() { diff --git a/database/mysql/mysql.go b/database/mysql/mysql.go index 711ba5187..8e807c94b 100644 --- a/database/mysql/mysql.go +++ b/database/mysql/mysql.go @@ -13,10 +13,9 @@ import ( "os" "strconv" "strings" + "sync/atomic" "time" - "go.uber.org/atomic" - "github.com/go-sql-driver/mysql" "github.com/golang-migrate/migrate/v4/database" "github.com/hashicorp/go-multierror" diff --git a/database/pgx/pgx.go b/database/pgx/pgx.go index efe8bea80..98ab5aa18 100644 --- a/database/pgx/pgx.go +++ b/database/pgx/pgx.go @@ -11,10 +11,9 @@ import ( "regexp" "strconv" "strings" + "sync/atomic" "time" - "go.uber.org/atomic" - "github.com/golang-migrate/migrate/v4" "github.com/golang-migrate/migrate/v4/database" "github.com/golang-migrate/migrate/v4/database/multistmt" diff --git a/database/pgx/v5/pgx.go b/database/pgx/v5/pgx.go index 303174495..3a442a050 100644 --- a/database/pgx/v5/pgx.go +++ b/database/pgx/v5/pgx.go @@ -11,10 +11,9 @@ import ( "regexp" "strconv" "strings" + "sync/atomic" "time" - "go.uber.org/atomic" - "github.com/golang-migrate/migrate/v4" "github.com/golang-migrate/migrate/v4/database" "github.com/golang-migrate/migrate/v4/database/multistmt" diff --git a/database/postgres/postgres.go b/database/postgres/postgres.go index 5e4519115..6b8a77120 100644 --- a/database/postgres/postgres.go +++ b/database/postgres/postgres.go @@ -11,10 +11,9 @@ import ( "regexp" "strconv" "strings" + "sync/atomic" "time" - "go.uber.org/atomic" - "github.com/golang-migrate/migrate/v4" "github.com/golang-migrate/migrate/v4/database" "github.com/golang-migrate/migrate/v4/database/multistmt" diff --git a/database/ql/ql.go b/database/ql/ql.go index 37c062455..6db6ea303 100644 --- a/database/ql/ql.go +++ b/database/ql/ql.go @@ -6,9 +6,9 @@ import ( "io" nurl "net/url" "strings" + "sync/atomic" "github.com/hashicorp/go-multierror" - "go.uber.org/atomic" "github.com/golang-migrate/migrate/v4" "github.com/golang-migrate/migrate/v4/database" @@ -166,13 +166,13 @@ func (m *Ql) Drop() (err error) { return nil } func (m *Ql) Lock() error { - if !m.isLocked.CAS(false, true) { + if !m.isLocked.CompareAndSwap(false, true) { return database.ErrLocked } return nil } func (m *Ql) Unlock() error { - if !m.isLocked.CAS(true, false) { + if !m.isLocked.CompareAndSwap(true, false) { return database.ErrNotLocked } return nil diff --git a/database/redshift/redshift.go b/database/redshift/redshift.go index 7687b9d9a..9379554ce 100644 --- a/database/redshift/redshift.go +++ b/database/redshift/redshift.go @@ -10,8 +10,7 @@ import ( nurl "net/url" "strconv" "strings" - - "go.uber.org/atomic" + "sync/atomic" "github.com/golang-migrate/migrate/v4" "github.com/golang-migrate/migrate/v4/database" @@ -127,14 +126,14 @@ func (p *Redshift) Close() error { // Redshift does not support advisory lock functions: https://docs.aws.amazon.com/redshift/latest/dg/c_unsupported-postgresql-functions.html func (p *Redshift) Lock() error { - if !p.isLocked.CAS(false, true) { + if !p.isLocked.CompareAndSwap(false, true) { return database.ErrLocked } return nil } func (p *Redshift) Unlock() error { - if !p.isLocked.CAS(true, false) { + if !p.isLocked.CompareAndSwap(true, false) { return database.ErrNotLocked } return nil diff --git a/database/rqlite/rqlite.go b/database/rqlite/rqlite.go index af0d53007..b0f8365c5 100644 --- a/database/rqlite/rqlite.go +++ b/database/rqlite/rqlite.go @@ -6,8 +6,7 @@ import ( nurl "net/url" "strconv" "strings" - - "go.uber.org/atomic" + "sync/atomic" "github.com/golang-migrate/migrate/v4" "github.com/golang-migrate/migrate/v4/database" @@ -143,7 +142,7 @@ func (r *Rqlite) Close() error { // If the implementation can't provide this functionality, return nil. // Return database.ErrLocked if database is already locked. func (r *Rqlite) Lock() error { - if !r.isLocked.CAS(false, true) { + if !r.isLocked.CompareAndSwap(false, true) { return database.ErrLocked } return nil @@ -152,7 +151,7 @@ func (r *Rqlite) Lock() error { // Unlock should release the lock. Migrate will call this function after // all migrations have been run. func (r *Rqlite) Unlock() error { - if !r.isLocked.CAS(true, false) { + if !r.isLocked.CompareAndSwap(true, false) { return database.ErrNotLocked } return nil diff --git a/database/snowflake/snowflake.go b/database/snowflake/snowflake.go index 46ce30200..dc0290467 100644 --- a/database/snowflake/snowflake.go +++ b/database/snowflake/snowflake.go @@ -8,8 +8,7 @@ import ( nurl "net/url" "strconv" "strings" - - "go.uber.org/atomic" + "sync/atomic" "github.com/golang-migrate/migrate/v4/database" "github.com/hashicorp/go-multierror" @@ -159,14 +158,14 @@ func (p *Snowflake) Close() error { } func (p *Snowflake) Lock() error { - if !p.isLocked.CAS(false, true) { + if !p.isLocked.CompareAndSwap(false, true) { return database.ErrLocked } return nil } func (p *Snowflake) Unlock() error { - if !p.isLocked.CAS(true, false) { + if !p.isLocked.CompareAndSwap(true, false) { return database.ErrNotLocked } return nil diff --git a/database/spanner/spanner.go b/database/spanner/spanner.go index b733302d5..b17280dea 100644 --- a/database/spanner/spanner.go +++ b/database/spanner/spanner.go @@ -10,6 +10,7 @@ import ( "regexp" "strconv" "strings" + "sync/atomic" "cloud.google.com/go/spanner" sdb "cloud.google.com/go/spanner/admin/database/apiv1" @@ -20,7 +21,6 @@ import ( adminpb "cloud.google.com/go/spanner/admin/database/apiv1/databasepb" "github.com/hashicorp/go-multierror" - uatomic "go.uber.org/atomic" "google.golang.org/api/iterator" ) @@ -32,11 +32,6 @@ func init() { // DefaultMigrationsTable is used if no custom table is specified const DefaultMigrationsTable = "SchemaMigrations" -const ( - unlockedVal = 0 - lockedVal = 1 -) - // Driver errors var ( ErrNilConfig = errors.New("no config") @@ -64,7 +59,7 @@ type Spanner struct { config *Config - lock *uatomic.Uint32 + lock atomic.Bool } type DB struct { @@ -96,7 +91,6 @@ func WithInstance(instance *DB, config *Config) (database.Driver, error) { sx := &Spanner{ db: instance, config: config, - lock: uatomic.NewUint32(unlockedVal), } if err := sx.ensureVersionTable(); err != nil { @@ -153,7 +147,7 @@ func (s *Spanner) Close() error { // Lock implements database.Driver but doesn't do anything because Spanner only // enqueues the UpdateDatabaseDdlRequest. func (s *Spanner) Lock() error { - if swapped := s.lock.CAS(unlockedVal, lockedVal); swapped { + if swapped := s.lock.CompareAndSwap(false, true); swapped { return nil } return ErrLockHeld @@ -161,7 +155,7 @@ func (s *Spanner) Lock() error { // Unlock implements database.Driver but no action required, see Lock. func (s *Spanner) Unlock() error { - if swapped := s.lock.CAS(lockedVal, unlockedVal); swapped { + if swapped := s.lock.CompareAndSwap(true, false); swapped { return nil } return ErrLockNotHeld diff --git a/database/sqlcipher/sqlcipher.go b/database/sqlcipher/sqlcipher.go index f98fb3a21..ce5fff9f4 100644 --- a/database/sqlcipher/sqlcipher.go +++ b/database/sqlcipher/sqlcipher.go @@ -7,8 +7,7 @@ import ( nurl "net/url" "strconv" "strings" - - "go.uber.org/atomic" + "sync/atomic" "github.com/golang-migrate/migrate/v4" "github.com/golang-migrate/migrate/v4/database" @@ -178,14 +177,14 @@ func (m *Sqlite) Drop() (err error) { } func (m *Sqlite) Lock() error { - if !m.isLocked.CAS(false, true) { + if !m.isLocked.CompareAndSwap(false, true) { return database.ErrLocked } return nil } func (m *Sqlite) Unlock() error { - if !m.isLocked.CAS(true, false) { + if !m.isLocked.CompareAndSwap(true, false) { return database.ErrNotLocked } return nil diff --git a/database/sqlite/sqlite.go b/database/sqlite/sqlite.go index ce449dfa0..bad5b83d2 100644 --- a/database/sqlite/sqlite.go +++ b/database/sqlite/sqlite.go @@ -7,8 +7,7 @@ import ( nurl "net/url" "strconv" "strings" - - "go.uber.org/atomic" + "sync/atomic" "github.com/golang-migrate/migrate/v4" "github.com/golang-migrate/migrate/v4/database" @@ -178,14 +177,14 @@ func (m *Sqlite) Drop() (err error) { } func (m *Sqlite) Lock() error { - if !m.isLocked.CAS(false, true) { + if !m.isLocked.CompareAndSwap(false, true) { return database.ErrLocked } return nil } func (m *Sqlite) Unlock() error { - if !m.isLocked.CAS(true, false) { + if !m.isLocked.CompareAndSwap(true, false) { return database.ErrNotLocked } return nil diff --git a/database/sqlite3/sqlite3.go b/database/sqlite3/sqlite3.go index 56bb23338..9035dee33 100644 --- a/database/sqlite3/sqlite3.go +++ b/database/sqlite3/sqlite3.go @@ -7,8 +7,7 @@ import ( nurl "net/url" "strconv" "strings" - - "go.uber.org/atomic" + "sync/atomic" "github.com/golang-migrate/migrate/v4" "github.com/golang-migrate/migrate/v4/database" @@ -178,14 +177,14 @@ func (m *Sqlite) Drop() (err error) { } func (m *Sqlite) Lock() error { - if !m.isLocked.CAS(false, true) { + if !m.isLocked.CompareAndSwap(false, true) { return database.ErrLocked } return nil } func (m *Sqlite) Unlock() error { - if !m.isLocked.CAS(true, false) { + if !m.isLocked.CompareAndSwap(true, false) { return database.ErrNotLocked } return nil diff --git a/database/sqlserver/sqlserver.go b/database/sqlserver/sqlserver.go index 92834d1ad..51e1b777a 100644 --- a/database/sqlserver/sqlserver.go +++ b/database/sqlserver/sqlserver.go @@ -8,8 +8,7 @@ import ( nurl "net/url" "strconv" "strings" - - "go.uber.org/atomic" + "sync/atomic" "github.com/Azure/go-autorest/autorest/adal" "github.com/golang-migrate/migrate/v4" diff --git a/database/stub/stub.go b/database/stub/stub.go index ae502650b..39edadea2 100644 --- a/database/stub/stub.go +++ b/database/stub/stub.go @@ -3,8 +3,7 @@ package stub import ( "io" "reflect" - - "go.uber.org/atomic" + "sync/atomic" "github.com/golang-migrate/migrate/v4/database" ) @@ -50,14 +49,14 @@ func (s *Stub) Close() error { } func (s *Stub) Lock() error { - if !s.isLocked.CAS(false, true) { + if !s.isLocked.CompareAndSwap(false, true) { return database.ErrLocked } return nil } func (s *Stub) Unlock() error { - if !s.isLocked.CAS(true, false) { + if !s.isLocked.CompareAndSwap(true, false) { return database.ErrNotLocked } return nil diff --git a/database/util.go b/database/util.go index de66d5b80..c60fafb7c 100644 --- a/database/util.go +++ b/database/util.go @@ -2,9 +2,9 @@ package database import ( "fmt" - "go.uber.org/atomic" "hash/crc32" "strings" + "sync/atomic" ) const advisoryLockIDSalt uint = 1486364155 @@ -21,7 +21,7 @@ func GenerateAdvisoryLockId(databaseName string, additionalNames ...string) (str // CasRestoreOnErr CAS wrapper to automatically restore the lock state on error func CasRestoreOnErr(lock *atomic.Bool, o, n bool, casErr error, f func() error) error { - if !lock.CAS(o, n) { + if !lock.CompareAndSwap(o, n) { return casErr } if err := f(); err != nil { diff --git a/database/util_test.go b/database/util_test.go index 3f1dc73ae..9dfa3223f 100644 --- a/database/util_test.go +++ b/database/util_test.go @@ -2,7 +2,7 @@ package database import ( "errors" - "go.uber.org/atomic" + "sync/atomic" "testing" ) @@ -54,7 +54,7 @@ func TestCasRestoreOnErr(t *testing.T) { testcases := []struct { name string - lock *atomic.Bool + lock bool from bool to bool expectLock bool @@ -63,7 +63,7 @@ func TestCasRestoreOnErr(t *testing.T) { }{ { name: "Test positive CAS lock", - lock: atomic.NewBool(false), + lock: false, from: false, to: true, expectLock: true, @@ -72,7 +72,7 @@ func TestCasRestoreOnErr(t *testing.T) { }, { name: "Test negative CAS lock", - lock: atomic.NewBool(true), + lock: true, from: false, to: true, expectLock: true, @@ -81,7 +81,7 @@ func TestCasRestoreOnErr(t *testing.T) { }, { name: "Test negative with callback lock", - lock: atomic.NewBool(false), + lock: false, from: false, to: true, expectLock: false, @@ -92,13 +92,15 @@ func TestCasRestoreOnErr(t *testing.T) { for _, tc := range testcases { t.Run(tc.name, func(t *testing.T) { - if err := CasRestoreOnErr(tc.lock, tc.from, tc.to, casErr, func() error { + var lock atomic.Bool + lock.Store(tc.lock) + if err := CasRestoreOnErr(&lock, tc.from, tc.to, casErr, func() error { return tc.fErr }); err != tc.expectError { t.Error("Incorrect error value returned") } - if tc.lock.Load() != tc.expectLock { + if lock.Load() != tc.expectLock { t.Error("Incorrect state of lock") } }) diff --git a/database/yugabytedb/yugabytedb.go b/database/yugabytedb/yugabytedb.go index 764d23c02..f5abbf301 100644 --- a/database/yugabytedb/yugabytedb.go +++ b/database/yugabytedb/yugabytedb.go @@ -8,6 +8,7 @@ import ( "net/url" "regexp" "strconv" + "sync/atomic" "time" "github.com/cenkalti/backoff/v4" @@ -17,7 +18,6 @@ import ( "github.com/jackc/pgconn" "github.com/jackc/pgerrcode" "github.com/lib/pq" - "go.uber.org/atomic" ) const ( diff --git a/go.mod b/go.mod index 610fbda6e..ef36567a1 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,6 @@ require ( github.com/stretchr/testify v1.10.0 github.com/xanzy/go-gitlab v0.15.0 go.mongodb.org/mongo-driver v1.7.5 - go.uber.org/atomic v1.7.0 golang.org/x/oauth2 v0.27.0 golang.org/x/tools v0.24.0 google.golang.org/api v0.169.0 diff --git a/go.sum b/go.sum index c58cb14a1..8de37ad10 100644 --- a/go.sum +++ b/go.sum @@ -630,8 +630,6 @@ go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=