VOL-1387 : Fixed issue introduced with watch mechanism submission

- Added flag to determine when a revision is watched
- Added flag to determine when a revision is stored
- Refactored confusing method names for Set/GetChildren
- Fixed issue with deletion of devices due to previous submission

Change-Id: I68c46951f9d40d47e4e74854bba449c9fec4a427
diff --git a/db/model/persisted_revision.go b/db/model/persisted_revision.go
index dd24e7e..84b9569 100644
--- a/db/model/persisted_revision.go
+++ b/db/model/persisted_revision.go
@@ -33,9 +33,11 @@
 	Revision
 	Compress bool
 
-	events  chan *kvstore.Event `json:"-"`
-	kvStore *Backend            `json:"-"`
-	mutex   sync.RWMutex        `json:"-"`
+	events    chan *kvstore.Event `json:"-"`
+	kvStore   *Backend            `json:"-"`
+	mutex     sync.RWMutex        `json:"-"`
+	isStored  bool
+	isWatched bool
 }
 
 // NewPersistedRevision creates a new instance of a PersistentRevision structure
@@ -83,6 +85,7 @@
 		} else {
 			log.Debugw("storing-revision-config",
 				log.Fields{"hash": pr.GetHash(), "data": pr.GetConfig().Data})
+			pr.isStored = true
 		}
 	}
 }
@@ -95,6 +98,8 @@
 
 		pr.events = pr.kvStore.CreateWatch(key)
 
+		pr.isWatched = true
+
 		// Start watching
 		go pr.startWatching()
 	}
@@ -176,8 +181,8 @@
 						if field.Key != "" {
 							// e.g. /logical_devices/abcde --> path="" name=logical_devices key=abcde
 							if field.Key != "" {
-								children = make([]Revision, len(rev.GetChildren()[name]))
-								copy(children, rev.GetChildren()[name])
+								children = make([]Revision, len(rev.GetChildren(name)))
+								copy(children, rev.GetChildren(name))
 
 								_, key := GetAttributeValue(data.Interface(), field.Key, 0)
 
@@ -208,8 +213,8 @@
 						}
 						keyValue := field.KeyFromStr(key)
 
-						children = make([]Revision, len(rev.GetChildren()[name]))
-						copy(children, rev.GetChildren()[name])
+						children = make([]Revision, len(rev.GetChildren(name)))
+						copy(children, rev.GetChildren(name))
 
 						idx, childRev := rev.GetBranch().Node.findRevByKey(children, field.Key, keyValue)
 
@@ -217,7 +222,7 @@
 
 						children[idx] = newChildRev[0]
 
-						rev := rev.UpdateChildren(name, rev.GetChildren()[name], rev.GetBranch())
+						rev := rev.UpdateChildren(name, rev.GetChildren(name), rev.GetBranch())
 						rev.GetBranch().Node.makeLatest(rev.GetBranch(), rev, nil)
 
 						response = append(response, newChildRev[0])
@@ -284,18 +289,25 @@
 	pr.mutex.Lock()
 	defer pr.mutex.Unlock()
 	if pr.kvStore != nil && txid == "" {
-		if includeConfig {
-			if err := pr.kvStore.Delete(pr.GetConfig().Hash); err != nil {
-				log.Errorw("failed-to-remove-revision-config", log.Fields{"hash": pr.GetConfig().Hash, "error": err.Error()})
+		if pr.isStored {
+			if includeConfig {
+				if err := pr.kvStore.Delete(pr.GetConfig().Hash); err != nil {
+					log.Errorw("failed-to-remove-revision-config", log.Fields{"hash": pr.GetConfig().Hash, "error": err.Error()})
+				}
+			}
+
+			if err := pr.kvStore.Delete(pr.GetHash()); err != nil {
+				log.Errorw("failed-to-remove-revision", log.Fields{"hash": pr.GetHash(), "error": err.Error()})
+			} else {
+				pr.isStored = false
+			}
+
+			if pr.isWatched {
+				pr.kvStore.DeleteWatch(pr.GetHash(), pr.events)
+				pr.isWatched = false
 			}
 		}
 
-		if err := pr.kvStore.Delete(pr.GetHash()); err != nil {
-			log.Errorw("failed-to-remove-revision", log.Fields{"hash": pr.GetHash(), "error": err.Error()})
-		}
-
-		pr.kvStore.DeleteWatch(pr.GetConfig().Hash, pr.events)
-
 	} else {
 		if includeConfig {
 			log.Debugw("attempted-to-remove-transacted-revision-config", log.Fields{"hash": pr.GetConfig().Hash, "txid": txid})