diff --git a/pkg/models/store.go b/pkg/models/store.go index bfb5f7f86..026927a5c 100644 --- a/pkg/models/store.go +++ b/pkg/models/store.go @@ -123,6 +123,19 @@ func (s *Store) Release() error { return s.client.Delete(s.LockPath()) } +func (s *Store) ReleaseByToken(token string) error { + if b, err := s.client.Read(s.LockPath(), false); err != nil { + return err + } else if b != nil { + if t, err := Decode(b); err != nil { + return err + } else if t.Token == token { + return s.Release() + } + } + return nil +} + func (s *Store) LoadTopom(must bool) (*Topom, error) { return LoadTopom(s.client, s.product, must) } diff --git a/pkg/models/topom.go b/pkg/models/topom.go index 746141fba..0a5bd9606 100644 --- a/pkg/models/topom.go +++ b/pkg/models/topom.go @@ -18,3 +18,11 @@ type Topom struct { func (t *Topom) Encode() []byte { return jsonEncode(t) } + +func Decode(b []byte) (*Topom, error) { + s := &Topom{} + if err := jsonDecode(s, b); err != nil { + return nil, err + } + return s, nil +} diff --git a/pkg/topom/topom.go b/pkg/topom/topom.go index 027fe5fea..fb4949b2f 100644 --- a/pkg/topom/topom.go +++ b/pkg/topom/topom.go @@ -168,7 +168,7 @@ func (s *Topom) Close() error { defer s.store.Close() if s.online { - if err := s.store.Release(); err != nil { + if err := s.store.ReleaseByToken(s.model.Token); err != nil { log.ErrorErrorf(err, "store: release lock of %s failed", s.config.ProductName) return errors.Errorf("store: release lock of %s failed", s.config.ProductName) }