|
@@ -113,6 +113,9 @@ func (ec *endpointCnt) updateStore() error {
|
|
if store == nil {
|
|
if store == nil {
|
|
return fmt.Errorf("store not found for scope %s on endpoint count update", ec.DataScope())
|
|
return fmt.Errorf("store not found for scope %s on endpoint count update", ec.DataScope())
|
|
}
|
|
}
|
|
|
|
+ // make a copy of count and n to avoid being overwritten by store.GetObject
|
|
|
|
+ count := ec.EndpointCnt()
|
|
|
|
+ n := ec.n
|
|
for {
|
|
for {
|
|
if err := ec.n.getController().updateToStore(ec); err == nil || err != datastore.ErrKeyModified {
|
|
if err := ec.n.getController().updateToStore(ec); err == nil || err != datastore.ErrKeyModified {
|
|
return err
|
|
return err
|
|
@@ -120,6 +123,10 @@ func (ec *endpointCnt) updateStore() error {
|
|
if err := store.GetObject(datastore.Key(ec.Key()...), ec); err != nil {
|
|
if err := store.GetObject(datastore.Key(ec.Key()...), ec); err != nil {
|
|
return fmt.Errorf("could not update the kvobject to latest on endpoint count update: %v", err)
|
|
return fmt.Errorf("could not update the kvobject to latest on endpoint count update: %v", err)
|
|
}
|
|
}
|
|
|
|
+ ec.Lock()
|
|
|
|
+ ec.Count = count
|
|
|
|
+ ec.n = n
|
|
|
|
+ ec.Unlock()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -136,7 +143,9 @@ retry:
|
|
if inc {
|
|
if inc {
|
|
ec.Count++
|
|
ec.Count++
|
|
} else {
|
|
} else {
|
|
- ec.Count--
|
|
|
|
|
|
+ if ec.Count > 0 {
|
|
|
|
+ ec.Count--
|
|
|
|
+ }
|
|
}
|
|
}
|
|
ec.Unlock()
|
|
ec.Unlock()
|
|
|
|
|