client: testing state restore
This commit is contained in:
parent
43471d023e
commit
5549a82f9f
|
@ -38,6 +38,9 @@ const (
|
||||||
|
|
||||||
// devModeRetryIntv is the retry interval used for development
|
// devModeRetryIntv is the retry interval used for development
|
||||||
devModeRetryIntv = time.Second
|
devModeRetryIntv = time.Second
|
||||||
|
|
||||||
|
// stateSnapshotIntv is how often the client snapshots state
|
||||||
|
stateSnapshotIntv = 60 * time.Second
|
||||||
)
|
)
|
||||||
|
|
||||||
// DefaultConfig returns the default configuration
|
// DefaultConfig returns the default configuration
|
||||||
|
@ -372,9 +375,18 @@ func (c *Client) run() {
|
||||||
allocUpdates := make(chan []*structs.Allocation, 1)
|
allocUpdates := make(chan []*structs.Allocation, 1)
|
||||||
go c.watchAllocations(allocUpdates)
|
go c.watchAllocations(allocUpdates)
|
||||||
|
|
||||||
|
// Create a snapshot timer
|
||||||
|
snapshot := time.After(stateSnapshotIntv)
|
||||||
|
|
||||||
// Periodically update our status and wait for termination
|
// Periodically update our status and wait for termination
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
|
case <-snapshot:
|
||||||
|
snapshot = time.After(stateSnapshotIntv)
|
||||||
|
if err := c.saveState(); err != nil {
|
||||||
|
c.logger.Printf("[ERR] client: failed to save state: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
case allocs := <-allocUpdates:
|
case allocs := <-allocUpdates:
|
||||||
c.runAllocs(allocs)
|
c.runAllocs(allocs)
|
||||||
|
|
||||||
|
|
|
@ -307,3 +307,59 @@ func TestClient_WatchAllocs(t *testing.T) {
|
||||||
t.Fatalf("err: %v", err)
|
t.Fatalf("err: %v", err)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestClient_SaveRestoreState(t *testing.T) {
|
||||||
|
s1, _ := testServer(t, nil)
|
||||||
|
defer s1.Shutdown()
|
||||||
|
testutil.WaitForLeader(t, s1.RPC)
|
||||||
|
|
||||||
|
c1 := testClient(t, func(c *config.Config) {
|
||||||
|
c.RPCHandler = s1
|
||||||
|
})
|
||||||
|
defer c1.Shutdown()
|
||||||
|
|
||||||
|
// Create mock allocations
|
||||||
|
alloc1 := mock.Alloc()
|
||||||
|
alloc1.NodeID = c1.Node().ID
|
||||||
|
task := alloc1.Job.TaskGroups[0].Tasks[0]
|
||||||
|
task.Config["command"] = "/bin/sleep"
|
||||||
|
task.Config["args"] = "10"
|
||||||
|
|
||||||
|
state := s1.State()
|
||||||
|
err := state.UpdateAllocations(100,
|
||||||
|
[]*structs.Allocation{alloc1})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Allocations should get registered
|
||||||
|
testutil.WaitForResult(func() (bool, error) {
|
||||||
|
c1.allocLock.RLock()
|
||||||
|
num := len(c1.allocs)
|
||||||
|
c1.allocLock.RUnlock()
|
||||||
|
return num == 1, nil
|
||||||
|
}, func(err error) {
|
||||||
|
t.Fatalf("err: %v", err)
|
||||||
|
})
|
||||||
|
|
||||||
|
// Shutdown the client, saves state
|
||||||
|
err = c1.Shutdown()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a new client
|
||||||
|
c2, err := NewClient(c1.config)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %v", err)
|
||||||
|
}
|
||||||
|
defer c2.Shutdown()
|
||||||
|
|
||||||
|
// Ensure the allocation is running
|
||||||
|
c2.allocLock.RLock()
|
||||||
|
ar := c1.allocs[alloc1.ID]
|
||||||
|
c2.allocLock.RUnlock()
|
||||||
|
if ar.Alloc().ClientStatus != structs.AllocClientStatusRunning {
|
||||||
|
t.Fatalf("bad: %#v", ar.Alloc())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue