Skip to content

Commit 79ada1a

Browse files
Prometheus2677FPiety0521
authored and
FPiety0521
committed
Add local locks for spanner db driver
1 parent e81d08a commit 79ada1a

File tree

3 files changed

+27
-6
lines changed

3 files changed

+27
-6
lines changed

database/spanner/spanner.go

+24-6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package spanner
22

33
import (
4+
"errors"
45
"fmt"
56
"io"
67
"io/ioutil"
@@ -20,6 +21,7 @@ import (
2021
"github.com/golang-migrate/migrate/v4/database"
2122

2223
"github.com/hashicorp/go-multierror"
24+
uatomic "go.uber.org/atomic"
2325
"google.golang.org/api/iterator"
2426
adminpb "google.golang.org/genproto/googleapis/spanner/admin/database/v1"
2527
)
@@ -32,12 +34,19 @@ func init() {
3234
// DefaultMigrationsTable is used if no custom table is specified
3335
const DefaultMigrationsTable = "SchemaMigrations"
3436

37+
const (
38+
unlockedVal = 0
39+
lockedVal = 1
40+
)
41+
3542
// Driver errors
3643
var (
37-
ErrNilConfig = fmt.Errorf("no config")
38-
ErrNoDatabaseName = fmt.Errorf("no database name")
39-
ErrNoSchema = fmt.Errorf("no schema")
40-
ErrDatabaseDirty = fmt.Errorf("database is dirty")
44+
ErrNilConfig = errors.New("no config")
45+
ErrNoDatabaseName = errors.New("no database name")
46+
ErrNoSchema = errors.New("no schema")
47+
ErrDatabaseDirty = errors.New("database is dirty")
48+
ErrLockHeld = errors.New("unable to obtain lock")
49+
ErrLockNotHeld = errors.New("unable to release already released lock")
4150
)
4251

4352
// Config used for a Spanner instance
@@ -56,6 +65,8 @@ type Spanner struct {
5665
db *DB
5766

5867
config *Config
68+
69+
lock *uatomic.Uint32
5970
}
6071

6172
type DB struct {
@@ -87,6 +98,7 @@ func WithInstance(instance *DB, config *Config) (database.Driver, error) {
8798
sx := &Spanner{
8899
db: instance,
89100
config: config,
101+
lock: uatomic.NewUint32(unlockedVal),
90102
}
91103

92104
if err := sx.ensureVersionTable(); err != nil {
@@ -143,12 +155,18 @@ func (s *Spanner) Close() error {
143155
// Lock implements database.Driver but doesn't do anything because Spanner only
144156
// enqueues the UpdateDatabaseDdlRequest.
145157
func (s *Spanner) Lock() error {
146-
return nil
158+
if swapped := s.lock.CAS(unlockedVal, lockedVal); swapped {
159+
return nil
160+
}
161+
return ErrLockHeld
147162
}
148163

149164
// Unlock implements database.Driver but no action required, see Lock.
150165
func (s *Spanner) Unlock() error {
151-
return nil
166+
if swapped := s.lock.CAS(lockedVal, unlockedVal); swapped {
167+
return nil
168+
}
169+
return ErrLockNotHeld
152170
}
153171

154172
// Run implements database.Driver

go.mod

+1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ require (
4444
github.com/xdg/stringprep v1.0.0 // indirect
4545
gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b // indirect
4646
go.mongodb.org/mongo-driver v1.1.0
47+
go.uber.org/atomic v1.4.0
4748
golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899 // indirect
4849
golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc
4950
golang.org/x/sys v0.0.0-20200817155316-9781c653f443 // indirect

go.sum

+2
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,7 @@ github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhB
263263
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
264264
github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o=
265265
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
266+
github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 h1:uC1QfSlInpQF+M0ao65imhwqKnz3Q2z/d8PWZRMQvDM=
266267
github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k=
267268
github.com/k0kubun/pp v2.3.0+incompatible h1:EKhKbi34VQDWJtq+zpsKSEhkHHs9w2P8Izbq8IhLVSo=
268269
github.com/k0kubun/pp v2.3.0+incompatible/go.mod h1:GWse8YhT0p8pT4ir3ZgBbfZild3tgzSScAn6HmfYukg=
@@ -381,6 +382,7 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
381382
go.opencensus.io v0.22.4 h1:LYy1Hy3MJdrCdMwwzxA/dRok4ejH+RwNGbuoD9fCjto=
382383
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
383384
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
385+
go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU=
384386
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
385387
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
386388
go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=

0 commit comments

Comments
 (0)