server: Remove lock from adapter to avoid deadlock

This commit is contained in:
Marek Siarkowicz
2021-10-15 16:24:47 +02:00
parent 6c2be0822d
commit 9d47a97b0b
4 changed files with 8 additions and 45 deletions

View File

@ -23,20 +23,17 @@ import (
"go.etcd.io/etcd/api/v3/membershippb" "go.etcd.io/etcd/api/v3/membershippb"
"go.etcd.io/etcd/api/v3/version" "go.etcd.io/etcd/api/v3/version"
serverversion "go.etcd.io/etcd/server/v3/etcdserver/version" serverversion "go.etcd.io/etcd/server/v3/etcdserver/version"
"go.etcd.io/etcd/server/v3/storage/backend"
"go.etcd.io/etcd/server/v3/storage/schema" "go.etcd.io/etcd/server/v3/storage/schema"
) )
// serverVersionAdapter implements Server interface needed by serverversion.Monitor // serverVersionAdapter implements Server interface needed by serverversion.Monitor
type serverVersionAdapter struct { type serverVersionAdapter struct {
*EtcdServer *EtcdServer
tx backend.BatchTx
} }
func newServerVersionAdapter(s *EtcdServer) *serverVersionAdapter { func newServerVersionAdapter(s *EtcdServer) *serverVersionAdapter {
return &serverVersionAdapter{ return &serverVersionAdapter{
EtcdServer: s, EtcdServer: s,
tx: nil,
} }
} }
@ -75,11 +72,10 @@ func (s *serverVersionAdapter) GetMembersVersions() map[string]*version.Versions
} }
func (s *serverVersionAdapter) GetStorageVersion() *semver.Version { func (s *serverVersionAdapter) GetStorageVersion() *semver.Version {
if s.tx == nil { tx := s.be.BatchTx()
s.Lock() tx.Lock()
defer s.Unlock() defer tx.Unlock()
} v, err := schema.UnsafeDetectSchemaVersion(s.lg, tx)
v, err := schema.UnsafeDetectSchemaVersion(s.lg, s.tx)
if err != nil { if err != nil {
return nil return nil
} }
@ -87,19 +83,8 @@ func (s *serverVersionAdapter) GetStorageVersion() *semver.Version {
} }
func (s *serverVersionAdapter) UpdateStorageVersion(target semver.Version) error { func (s *serverVersionAdapter) UpdateStorageVersion(target semver.Version) error {
if s.tx == nil { tx := s.be.BatchTx()
s.Lock() tx.Lock()
defer s.Unlock() defer tx.Unlock()
} return schema.UnsafeMigrate(s.lg, tx, s.r.storage, target)
return schema.UnsafeMigrate(s.lg, s.tx, s.r.storage, target)
}
func (s *serverVersionAdapter) Lock() {
s.tx = s.be.BatchTx()
s.tx.Lock()
}
func (s *serverVersionAdapter) Unlock() {
s.tx.Unlock()
s.tx = nil
} }

View File

@ -40,9 +40,6 @@ type Server interface {
GetStorageVersion() *semver.Version GetStorageVersion() *semver.Version
UpdateStorageVersion(semver.Version) error UpdateStorageVersion(semver.Version) error
Lock()
Unlock()
} }
func NewMonitor(lg *zap.Logger, storage Server) *Monitor { func NewMonitor(lg *zap.Logger, storage Server) *Monitor {
@ -100,8 +97,6 @@ func (m *Monitor) UpdateStorageVersionIfNeeded() {
if cv == nil { if cv == nil {
return return
} }
m.s.Lock()
defer m.s.Unlock()
sv := m.s.GetStorageVersion() sv := m.s.GetStorageVersion()
if sv == nil || sv.Major != cv.Major || sv.Minor != cv.Minor { if sv == nil || sv.Major != cv.Major || sv.Minor != cv.Minor {

View File

@ -421,14 +421,3 @@ func (s *storageMock) UpdateStorageVersion(v semver.Version) error {
s.storageVersion = &v s.storageVersion = &v
return nil return nil
} }
func (s *storageMock) Lock() {
if s.locked {
panic("Deadlock")
}
s.locked = true
}
func (s *storageMock) Unlock() {
s.locked = false
}

View File

@ -256,9 +256,3 @@ func (m *memberMock) UpdateStorageVersion(v semver.Version) error {
func (m *memberMock) TriggerSnapshot() { func (m *memberMock) TriggerSnapshot() {
} }
func (m *memberMock) Lock() {
}
func (m *memberMock) Unlock() {
}