Skip to content

Commit 3a53018

Browse files
anrsanrs
and
anrs
authored
fix: no such container means WAL has been handled (#348)
Co-authored-by: anrs <anders.hu@shopee.com>
1 parent a3bafe3 commit 3a53018

File tree

4 files changed

+27
-8
lines changed

4 files changed

+27
-8
lines changed

cluster/calcium/calcium.go

+6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package calcium
22

33
import (
4+
"context"
45
"strings"
56

67
"github.com/projecteru2/core/cluster"
@@ -66,6 +67,11 @@ func New(config types.Config, embeddedStorage bool) (*Calcium, error) {
6667
return cal, err
6768
}
6869

70+
// DisasterRecover .
71+
func (c *Calcium) DisasterRecover(ctx context.Context) {
72+
c.wal.Recover(ctx)
73+
}
74+
6975
// Finalizer use for defer
7076
func (c *Calcium) Finalizer() {
7177
c.store.TerminateEmbededStorage()

cluster/calcium/wal.go

+13-5
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package calcium
33
import (
44
"context"
55
"encoding/json"
6+
"fmt"
67
"strings"
78

89
"github.com/projecteru2/core/log"
@@ -125,17 +126,24 @@ func (h *CreateWorkloadHandler) Handle(raw interface{}) error {
125126
// There hasn't been the exact workload metadata, so we must remove it.
126127
node, err := h.calcium.GetNode(context.Background(), wrk.Nodename)
127128
if err != nil {
128-
log.Errorf("[CreateWorkloadHandler.Check] Get node %s failed: %v", wrk.Nodename, err)
129+
log.Errorf("[CreateWorkloadHandler.Handle] Get node %s failed: %v", wrk.Nodename, err)
129130
return err
130131
}
131132
wrk.Engine = node.Engine
132133

133-
err = wrk.Remove(context.Background(), true)
134-
if err != nil {
135-
log.Errorf("[CreateWorkloadHandler.Check] Remove %s failed: %v", wrk.ID, err)
134+
if err := wrk.Remove(context.Background(), true); err != nil {
135+
if strings.HasPrefix(err.Error(), fmt.Sprintf("Error: No such container: %s", wrk.ID)) {
136+
log.Errorf("[CreateWorkloadHandler.Handle] %s has been removed yet", wrk.ID)
137+
return nil
138+
}
139+
140+
log.Errorf("[CreateWorkloadHandler.Handle] Remove %s failed: %v", wrk.ID, err)
141+
return err
136142
}
137143

138-
return err
144+
log.Warnf("[CreateWorkloadHandler.Handle] %s has been removed", wrk.ID)
145+
146+
return nil
139147
}
140148

141149
// CreateLambdaHandler indicates event handler for creating lambda.

cluster/calcium/wal_test.go

+7-3
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,15 @@ func TestHandleCreateWorkloadError(t *testing.T) {
7373
defer eng.AssertExpectations(t)
7474
eng.On("VirtualizationRemove", mock.Anything, wrk.ID, true, true).
7575
Return(fmt.Errorf("err")).
76-
Twice()
76+
Once()
77+
c.wal.Recover(context.Background())
78+
79+
eng.On("VirtualizationRemove", mock.Anything, wrk.ID, true, true).
80+
Return(fmt.Errorf("Error: No such container: %s", wrk.ID)).
81+
Once()
7782
c.wal.Recover(context.Background())
7883

79-
// Recovers again because the above recovering had been failed.
80-
// so the log item hadn't been deleted.
84+
// Nothing recovered.
8185
c.wal.Recover(context.Background())
8286
}
8387

core.go

+1
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ func serve(c *cli.Context) error {
7575
return err
7676
}
7777
defer cluster.Finalizer()
78+
cluster.DisasterRecover(c.Context)
7879

7980
rpcch := make(chan struct{}, 1)
8081
vibranium := rpc.New(cluster, config, rpcch)

0 commit comments

Comments
 (0)