VOL-5228 reconciling error handling

Change-Id: Ib558bf79c8ff9419422a70e7f5b1a286fbb24469
diff --git a/VERSION b/VERSION
index d5c0c99..87ce492 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-3.5.1
+3.5.2
diff --git a/rw_core/core/device/agent.go b/rw_core/core/device/agent.go
index aaef7b1..89228e1 100755
--- a/rw_core/core/device/agent.go
+++ b/rw_core/core/device/agent.go
@@ -1572,6 +1572,21 @@
 			agent.logDeviceUpdate(ctx, nil, nil, requestStatus, err, desc)
 			break retry
 		}
+		st, ok := status.FromError(err)
+		if ok {
+			// Decode the error code and error message
+			errorCode := st.Code()
+			if errorCode == codes.AlreadyExists {
+				logger.Warnw(ctx, "device already reconciled", log.Fields{"error": err})
+				err := agent.reconcilingCleanup(ctx)
+				if err != nil {
+					logger.Errorf(ctx, "error during reconcile cleanup", err.Error())
+				}
+				break retry
+
+			}
+
+		}
 		if err != nil {
 			agent.logDeviceUpdate(ctx, nil, nil, requestStatus, err, desc)
 			<-backoffTimer.C