mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
server: Remove lock from adapter to avoid deadlock
This commit is contained in:
parent
6c2be0822d
commit
9d47a97b0b
@ -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)
|
||||
}
|
||||
|
@ -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 {
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -256,9 +256,3 @@ func (m *memberMock) UpdateStorageVersion(v semver.Version) error {
|
||||
|
||||
func (m *memberMock) TriggerSnapshot() {
|
||||
}
|
||||
|
||||
func (m *memberMock) Lock() {
|
||||
}
|
||||
|
||||
func (m *memberMock) Unlock() {
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user