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