add test case for duplicate snapshots during bootstrap
diff --git a/apigee_sync.go b/apigee_sync.go index 2ed1546..d2b36b7 100644 --- a/apigee_sync.go +++ b/apigee_sync.go
@@ -291,6 +291,11 @@ scopes := []string{apidInfo.ClusterID} snapshot := downloadSnapshot(scopes) + storeBootSnapshot(snapshot) +} + +func storeBootSnapshot(snapshot common.Snapshot) { + log.Debug("storeBootSnapshot", snapshot.SnapshotInfo) // note that for boot snapshot case, we don't touch databases. We only update in-mem cache // This aims to deal with duplicate snapshot version#, see XAPID-869 for details scopeCache.clearAndInitCache(snapshot.SnapshotInfo) @@ -316,11 +321,15 @@ scopes := scopeCache.readAllScope() scopes = append(scopes, apidInfo.ClusterID) - resp := downloadSnapshot(scopes) + snapshot := downloadSnapshot(scopes) + storeDataSnapshot(snapshot) +} - knownTables = extractTablesFromSnapshot(resp) +func storeDataSnapshot(snapshot common.Snapshot) { + log.Debug("storeDataSnapshot", snapshot.SnapshotInfo) + knownTables = extractTablesFromSnapshot(snapshot) - db, err := data.DBVersion(resp.SnapshotInfo) + db, err := data.DBVersion(snapshot.SnapshotInfo) if err != nil { log.Panicf("Database inaccessible: %v", err) } @@ -328,7 +337,7 @@ done := make(chan bool) log.Info("Emitting Snapshot to plugins") - events.EmitWithCallback(ApigeeSyncEventSelector, &resp, func(event apid.Event) { + events.EmitWithCallback(ApigeeSyncEventSelector, &snapshot, func(event apid.Event) { done <- true }) @@ -337,8 +346,11 @@ log.Panic("Timeout. Plugins failed to respond to snapshot.") case <-done: } + } + + func extractTablesFromSnapshot(snapshot common.Snapshot) (tables map[string]bool) { tables = make(map[string]bool)
diff --git a/apigee_sync_test.go b/apigee_sync_test.go index f5142d2..07ffe18 100644 --- a/apigee_sync_test.go +++ b/apigee_sync_test.go
@@ -80,5 +80,14 @@ Expect(getChangeStatus("2.2.1", "1.2.2")).To(Equal(-1)) Expect(getChangeStatus("2.2.1", "2.2.0")).To(Equal(-1)) }) + /* + * XAPID-869 + */ + It("Should be able to handle duplicate snapshot during bootstrap", func() { + scopes := []string{apidInfo.ClusterID} + snapshot := downloadSnapshot(scopes) + storeBootSnapshot(snapshot) + storeDataSnapshot(snapshot) + }) })