Skip to content

Commit b6b1531

Browse files
author
Swapnil Mhamane
committed
Fix: Set the http stastus ok on first snapshot
Signed-off-by: Swapnil Mhamane <swapnil.mhamane@sap.com>
1 parent 05f276d commit b6b1531

File tree

11 files changed

+145
-97
lines changed

11 files changed

+145
-97
lines changed

cmd/restore.go

+2-20
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ package cmd
1717
import (
1818
"fmt"
1919
"path"
20-
"sort"
2120

2221
"github.com/coreos/etcd/pkg/types"
22+
"github.com/gardener/etcd-backup-restore/pkg/miscellaneous"
2323
"github.com/gardener/etcd-backup-restore/pkg/snapshot/restorer"
2424
"github.com/gardener/etcd-backup-restore/pkg/snapstore"
2525
"github.com/sirupsen/logrus"
@@ -59,7 +59,7 @@ func NewRestoreCommand(stopCh <-chan struct{}) *cobra.Command {
5959
logger.Fatalf("failed to create snapstore from configured storage provider: %v", err)
6060
}
6161
logger.Infoln("Finding latest set of snapshot to recover from...")
62-
baseSnap, deltaSnapList, err := getLatestFullSnapshotAndDeltaSnapList(store)
62+
baseSnap, deltaSnapList, err := miscellaneous.GetLatestFullSnapshotAndDeltaSnapList(store)
6363
if err != nil {
6464
logger.Fatalf("failed to get latest snapshot: %v", err)
6565
}
@@ -112,21 +112,3 @@ func initialClusterFromName(name string) string {
112112
}
113113
return fmt.Sprintf("%s=http://localhost:2380", n)
114114
}
115-
116-
// getLatestFullSnapshotAndDeltaSnapList resturns the latest snapshot
117-
func getLatestFullSnapshotAndDeltaSnapList(store snapstore.SnapStore) (*snapstore.Snapshot, snapstore.SnapList, error) {
118-
var deltaSnapList snapstore.SnapList
119-
snapList, err := store.List()
120-
if err != nil {
121-
return nil, nil, err
122-
}
123-
124-
for index := len(snapList); index > 0; index-- {
125-
if snapList[index-1].Kind == snapstore.SnapshotKindFull {
126-
sort.Sort(deltaSnapList)
127-
return snapList[index-1], deltaSnapList, nil
128-
}
129-
deltaSnapList = append(deltaSnapList, snapList[index-1])
130-
}
131-
return nil, deltaSnapList, nil
132-
}

cmd/server.go

+29-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"github.com/coreos/etcd/pkg/types"
2525
"github.com/gardener/etcd-backup-restore/pkg/errors"
2626
"github.com/gardener/etcd-backup-restore/pkg/initializer"
27+
"github.com/gardener/etcd-backup-restore/pkg/miscellaneous"
2728
"github.com/gardener/etcd-backup-restore/pkg/server"
2829
"github.com/gardener/etcd-backup-restore/pkg/snapshot/restorer"
2930
"github.com/gardener/etcd-backup-restore/pkg/snapshot/snapshotter"
@@ -129,9 +130,36 @@ func NewServerCommand(stopCh <-chan struct{}) *cobra.Command {
129130
handler.Status = http.StatusServiceUnavailable
130131
continue
131132
}
133+
134+
// Try to take snapshot before setting
135+
config := &miscellaneous.Config{
136+
Attempts: 6,
137+
Delay: 1,
138+
Units: time.Second,
139+
Logger: logger,
140+
}
141+
if err := miscellaneous.Do(func() error {
142+
logger.Infof("Taking initial snapshot at time: %s", time.Now().Local())
143+
err := ssr.TakeFullSnapshot()
144+
if err != nil {
145+
logger.Infof("Taking initial snapshot failed: %v", err)
146+
}
147+
return err
148+
}, config); err != nil {
149+
if etcdErr, ok := err.(*errors.EtcdError); ok == true {
150+
logger.Errorf("Snapshotter failed with etcd error: %v", etcdErr)
151+
} else {
152+
logger.Fatalf("Snapshotter failed with error: %v", err)
153+
}
154+
handler.Status = http.StatusServiceUnavailable
155+
continue
156+
} else {
157+
handler.Status = http.StatusOK
158+
}
159+
132160
gcStopCh := make(chan bool)
133161
go ssr.GarbageCollector(gcStopCh)
134-
if err := ssr.Run(stopCh); err != nil {
162+
if err := ssr.Run(true, stopCh); err != nil {
135163
handler.Status = http.StatusServiceUnavailable
136164
if etcdErr, ok := err.(*errors.EtcdError); ok == true {
137165
logger.Errorf("Snapshotter failed with etcd error: %v", etcdErr)

cmd/snapshot.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ storing snapshots on various cloud storage providers as well as local disk locat
6262
}
6363
gcStopCh := make(chan bool)
6464
go ssr.GarbageCollector(gcStopCh)
65-
if err := ssr.Run(stopCh); err != nil {
65+
if err := ssr.Run(false, stopCh); err != nil {
6666
logger.Fatalf("Snapshotter failed with error: %v", err)
6767
}
6868
gcStopCh <- true

pkg/initializer/initializer.go

+2-20
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ import (
1818
"fmt"
1919
"os"
2020
"path/filepath"
21-
"sort"
2221

2322
"github.com/gardener/etcd-backup-restore/pkg/initializer/validator"
23+
"github.com/gardener/etcd-backup-restore/pkg/miscellaneous"
2424
"github.com/gardener/etcd-backup-restore/pkg/snapshot/restorer"
2525
"github.com/gardener/etcd-backup-restore/pkg/snapstore"
2626
"github.com/sirupsen/logrus"
@@ -92,7 +92,7 @@ func (e *EtcdInitializer) restoreCorruptData() error {
9292
return err
9393
}
9494
logger.Infoln("Finding latest set of snapshot to recover from...")
95-
baseSnap, deltaSnapList, err := getLatestFullSnapshotAndDeltaSnapList(store)
95+
baseSnap, deltaSnapList, err := miscellaneous.GetLatestFullSnapshotAndDeltaSnapList(store)
9696
if err != nil {
9797
logger.Errorf("failed to get latest set of snapshot: %v", err)
9898
return err
@@ -133,21 +133,3 @@ func removeContents(dir string) error {
133133
}
134134
return nil
135135
}
136-
137-
// getLatestFullSnapshotAndDeltaSnapList resturns the latest snapshot
138-
func getLatestFullSnapshotAndDeltaSnapList(store snapstore.SnapStore) (*snapstore.Snapshot, snapstore.SnapList, error) {
139-
var deltaSnapList snapstore.SnapList
140-
snapList, err := store.List()
141-
if err != nil {
142-
return nil, nil, err
143-
}
144-
145-
for index := len(snapList); index > 0; index-- {
146-
if snapList[index-1].Kind == snapstore.SnapshotKindFull {
147-
sort.Sort(deltaSnapList)
148-
return snapList[index-1], deltaSnapList, nil
149-
}
150-
deltaSnapList = append(deltaSnapList, snapList[index-1])
151-
}
152-
return nil, deltaSnapList, nil
153-
}

pkg/miscellaneous/miscelleneous.go

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// Copyright (c) 2018 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package miscellaneous
16+
17+
import (
18+
"sort"
19+
20+
"github.com/gardener/etcd-backup-restore/pkg/snapstore"
21+
)
22+
23+
// GetLatestFullSnapshotAndDeltaSnapList returns the latest snapshot
24+
func GetLatestFullSnapshotAndDeltaSnapList(store snapstore.SnapStore) (*snapstore.Snapshot, snapstore.SnapList, error) {
25+
var deltaSnapList snapstore.SnapList
26+
snapList, err := store.List()
27+
if err != nil {
28+
return nil, nil, err
29+
}
30+
31+
for index := len(snapList); index > 0; index-- {
32+
if snapList[index-1].Kind == snapstore.SnapshotKindFull {
33+
sort.Sort(deltaSnapList)
34+
return snapList[index-1], deltaSnapList, nil
35+
}
36+
deltaSnapList = append(deltaSnapList, snapList[index-1])
37+
}
38+
return nil, deltaSnapList, nil
39+
}

pkg/retry/retry.go pkg/miscellaneous/retry.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15-
package retry
15+
package miscellaneous
1616

1717
import (
1818
"time"

pkg/retry/retry_test.go pkg/miscellaneous/retry_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15-
package retry
15+
package miscellaneous
1616

1717
import (
1818
"fmt"

pkg/retry/types.go pkg/miscellaneous/types.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15-
package retry
15+
package miscellaneous
1616

1717
import (
1818
"time"

0 commit comments

Comments
 (0)