From de7304cacb0a64b695c81409e0de2582ba105cd3 Mon Sep 17 00:00:00 2001 From: Brandon Croft Date: Wed, 8 Feb 2023 14:43:57 -0700 Subject: [PATCH] Begin cloud remote state with serial > 0 --- internal/cloud/state.go | 8 +++++++- internal/cloud/state_test.go | 20 ++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/internal/cloud/state.go b/internal/cloud/state.go index 853cb4061b56..a0379285a899 100644 --- a/internal/cloud/state.go +++ b/internal/cloud/state.go @@ -140,6 +140,9 @@ func (s *State) PersistState(schemas *terraform.Schemas) error { s.mu.Lock() defer s.mu.Unlock() + log.Printf("[DEBUG] cloud/state: state read serial is: %d; serial is: %d", s.readSerial, s.serial) + log.Printf("[DEBUG] cloud/state: state read lineage is: %s; lineage is: %s", s.readLineage, s.lineage) + if s.readState != nil { lineageUnchanged := s.readLineage != "" && s.lineage == s.readLineage serialUnchanged := s.readSerial != 0 && s.serial == s.readSerial @@ -157,13 +160,16 @@ func (s *State) PersistState(schemas *terraform.Schemas) error { if err != nil { return fmt.Errorf("failed checking for existing remote state: %s", err) } + log.Printf("[DEBUG] cloud/state: after refresh, state read serial is: %d; serial is: %d", s.readSerial, s.serial) + log.Printf("[DEBUG] cloud/state: after refresh, state read lineage is: %s; lineage is: %s", s.readLineage, s.lineage) + if s.lineage == "" { // indicates that no state snapshot is present yet lineage, err := uuid.GenerateUUID() if err != nil { return fmt.Errorf("failed to generate initial lineage: %v", err) } s.lineage = lineage - s.serial = 0 + s.serial++ } } diff --git a/internal/cloud/state_test.go b/internal/cloud/state_test.go index bf297055aa1a..f03bd15c53e5 100644 --- a/internal/cloud/state_test.go +++ b/internal/cloud/state_test.go @@ -250,3 +250,23 @@ func TestDelete_SafeDelete(t *testing.T) { t.Fatalf("workspace %s not deleted", workspaceId) } } + +func TestState_PersistState(t *testing.T) { + cloudState := testCloudState(t) + + t.Run("Initial PersistState", func(t *testing.T) { + if cloudState.readState != nil { + t.Fatal("expected nil initial readState") + } + + err := cloudState.PersistState(nil) + if err != nil { + t.Fatalf("expected no error, got %q", err) + } + + var expectedSerial uint64 = 1 + if cloudState.readSerial != expectedSerial { + t.Fatalf("expected initial state readSerial to be %d, got %d", expectedSerial, cloudState.readSerial) + } + }) +}