VOL-1512: Set device Active ownership per Core in a Core pair
- Changed NB & SB APIs to seize requests based on device ownership
- Added queue support for change-events
- Need to make prefix & timeout for the device ownership key configurable,
currently hard-coded
- Need to make KV Transaction Monitor timeout configurable,
currently hard-coded
- Need to clean up AdapterRequestHandlerProxy & LogicalDeviceManager
constructors
Change-Id: Ieeb3df6d70baa529b87c8253cb9f0f5b2a94382a
diff --git a/rw_core/core/device_ownership.go b/rw_core/core/device_ownership.go
index b881351..f229383 100644
--- a/rw_core/core/device_ownership.go
+++ b/rw_core/core/device_ownership.go
@@ -81,17 +81,34 @@
}
func (da *DeviceOwnership) startOwnershipMonitoring(id string, chnl chan int) {
+ var op string
+
startloop:
for {
- if err := da.setOwnership(id, da.tryToReserveKey(id)); err != nil {
- log.Errorw("unexpected-error", log.Fields{"error": err})
+ da.deviceMapLock.RLock()
+ val, exist := da.deviceMap[id]
+ da.deviceMapLock.RUnlock()
+ if exist && val.owned {
+ // Device owned; renew reservation
+ op = "renew"
+ kvKey := fmt.Sprintf("%s_%s", da.ownershipPrefix, id)
+ if err := da.kvClient.RenewReservation(kvKey); err != nil {
+ log.Errorw("reservation-renewal-error", log.Fields{"error": err})
+ }
+ } else {
+ // Device not owned; try to seize ownership
+ op = "retry"
+ if err := da.setOwnership(id, da.tryToReserveKey(id)); err != nil {
+ log.Errorw("unexpected-error", log.Fields{"error": err})
+ }
}
select {
case <-da.exitChannel:
log.Infow("closing-monitoring", log.Fields{"Id": id})
break startloop
case <-time.After(time.Duration(da.reservationTimeout) / 3 * time.Second):
- log.Infow("renew-reservation", log.Fields{"Id": id})
+ msg := fmt.Sprintf("%s-reservation", op)
+ log.Infow(msg, log.Fields{"Id": id})
case <-chnl:
log.Infow("closing-device-monitoring", log.Fields{"Id": id})
break startloop
@@ -145,4 +162,4 @@
return nil
}
return status.Error(codes.NotFound, fmt.Sprintf("id-inexistent-%s", id))
-}
\ No newline at end of file
+}