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
+}