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/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"
)
// serverVersionAdapter implements Server interface needed by serverversion.Monitor
type serverVersionAdapter struct {
*EtcdServer
tx backend.BatchTx
}
func newServerVersionAdapter(s *EtcdServer) *serverVersionAdapter {
return &serverVersionAdapter{
EtcdServer: s,
tx: nil,
}
}
@ -75,11 +72,10 @@ func (s *serverVersionAdapter) GetMembersVersions() map[string]*version.Versions
}
func (s *serverVersionAdapter) GetStorageVersion() *semver.Version {
if s.tx == nil {
s.Lock()
defer s.Unlock()
}
v, err := schema.UnsafeDetectSchemaVersion(s.lg, s.tx)
tx := s.be.BatchTx()
tx.Lock()
defer tx.Unlock()
v, err := schema.UnsafeDetectSchemaVersion(s.lg, tx)
if err != nil {
return nil
}
@ -87,19 +83,8 @@ func (s *serverVersionAdapter) GetStorageVersion() *semver.Version {
}
func (s *serverVersionAdapter) UpdateStorageVersion(target semver.Version) error {
if s.tx == nil {
s.Lock()
defer s.Unlock()
}
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
tx := s.be.BatchTx()
tx.Lock()
defer tx.Unlock()
return schema.UnsafeMigrate(s.lg, tx, s.r.storage, target)
}

View File

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