VOL-2024: If multiple adapter registration requests come during adapter startup,
(because of kafka sending a burst of registrations once adapter connects to core)
there is a race condition that can result in adapter device type getting overridden to "".
This will result in subsequent failure to enable the device.
This fix ensures that lock is taken across the duration while updating adapter and device types.

Change-Id: I0ca046e2b25ae6768f326eeb9685c0a99fff1d38
diff --git a/rw_core/core/adapter_manager.go b/rw_core/core/adapter_manager.go
index 188ae3d..b67487f 100644
--- a/rw_core/core/adapter_manager.go
+++ b/rw_core/core/adapter_manager.go
@@ -174,10 +174,15 @@
 
 //updateAdaptersAndDevicetypesInMemory loads the existing set of adapters and device types in memory
 func (aMgr *AdapterManager) updateAdaptersAndDevicetypesInMemory(adapter *voltha.Adapter) {
-	if aMgr.getAdapter(adapter.Id) != nil {
-		//	Already registered - Adapter may have restarted.  Trigger the reconcile process for that adapter
-		go aMgr.deviceMgr.adapterRestarted(adapter)
-		return
+	aMgr.lockAdaptersMap.Lock()
+	defer aMgr.lockAdaptersMap.Unlock()
+
+	if adapterAgent, ok := aMgr.adapterAgents[adapter.Id]; ok {
+		if adapterAgent.getAdapter() != nil {
+			// Already registered - Adapter may have restarted.  Trigger the reconcile process for that adapter
+			go aMgr.deviceMgr.adapterRestarted(adapter)
+			return
+		}
 	}
 
 	// Update the adapters
@@ -185,17 +190,19 @@
 		for _, adapterIf := range adaptersIf.([]interface{}) {
 			if adapter, ok := adapterIf.(*voltha.Adapter); ok {
 				log.Debugw("found-existing-adapter", log.Fields{"adapterId": adapter.Id})
-				aMgr.updateAdapter(adapter)
+				aMgr.updateAdapterWithoutLock(adapter)
 			}
 		}
 	}
+	aMgr.lockdDeviceTypeToAdapterMap.Lock()
+	defer aMgr.lockdDeviceTypeToAdapterMap.Unlock()
 	// Update the device types
 	if deviceTypesIf := aMgr.clusterDataProxy.List(context.Background(), "/device_types", 0, false, ""); deviceTypesIf != nil {
 		dTypes := &voltha.DeviceTypes{Items: []*voltha.DeviceType{}}
 		for _, deviceTypeIf := range deviceTypesIf.([]interface{}) {
 			if dType, ok := deviceTypeIf.(*voltha.DeviceType); ok {
 				log.Debugw("found-existing-device-types", log.Fields{"deviceTypes": dTypes})
-				aMgr.updateDeviceType(dType)
+				aMgr.updateDeviceTypeWithoutLock(dType)
 			}
 		}
 	}
@@ -290,6 +297,10 @@
 func (aMgr *AdapterManager) updateAdapter(adapter *voltha.Adapter) {
 	aMgr.lockAdaptersMap.Lock()
 	defer aMgr.lockAdaptersMap.Unlock()
+	aMgr.updateAdapterWithoutLock(adapter)
+}
+
+func (aMgr *AdapterManager) updateAdapterWithoutLock(adapter *voltha.Adapter) {
 	if adapterAgent, ok := aMgr.adapterAgents[adapter.Id]; ok {
 		adapterAgent.updateAdapter(adapter)
 	} else {
@@ -303,6 +314,10 @@
 	defer aMgr.lockAdaptersMap.Unlock()
 	aMgr.lockdDeviceTypeToAdapterMap.Lock()
 	defer aMgr.lockdDeviceTypeToAdapterMap.Unlock()
+	aMgr.updateDeviceTypeWithoutLock(deviceType)
+}
+
+func (aMgr *AdapterManager) updateDeviceTypeWithoutLock(deviceType *voltha.DeviceType) {
 	if adapterAgent, exist := aMgr.adapterAgents[deviceType.Adapter]; exist {
 		adapterAgent.updateDeviceType(deviceType)
 	} else {