server: Remove lock from adapter to avoid deadlock
This commit is contained in:
@ -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
|
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
|
@ -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
|
|
||||||
}
|
|
||||||
|
@ -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() {
|
|
||||||
}
|
|
||||||
|
Reference in New Issue
Block a user