Jelajahi Sumber

Better crash simulation in TestRestore ; force state lock creation when loading a container from disk

shin- 12 tahun lalu
induk
melakukan
791ca6fde4
3 mengubah file dengan 12 tambahan dan 4 penghapusan
  1. 1 0
      container.go
  2. 6 4
      runtime_test.go
  3. 5 0
      state.go

+ 1 - 0
container.go

@@ -127,6 +127,7 @@ func (container *Container) FromDisk() error {
 	if err := json.Unmarshal(data, container); err != nil {
 		return err
 	}
+	container.State.resetLock()
 	return nil
 }
 

+ 6 - 4
runtime_test.go

@@ -7,6 +7,7 @@ import (
 	"os/exec"
 	"os/user"
 	"testing"
+	"time"
 )
 
 // FIXME: this is no longer needed
@@ -302,11 +303,12 @@ func TestRestore(t *testing.T) {
 	}
 
 	// Simulate a crash/manual quit of dockerd: process dies, states stays 'Running'
-	if err := container2.Stop(); err != nil {
-		t.Fatalf("Could not stop container: %v", err)
-	}
-
+	cStdin, _ := container2.StdinPipe()
+	cStdin.Close()
+	container2.State.setStopped(-1)
+	time.Sleep(time.Second)
 	container2.State.Running = true
+	container2.ToDisk()
 
 	if len(runtime1.List()) != 2 {
 		t.Errorf("Expected 2 container, %v found", len(runtime1.List()))

+ 5 - 0
state.go

@@ -39,6 +39,11 @@ func (s *State) setStopped(exitCode int) {
 	s.broadcast()
 }
 
+func (s *State) resetLock() {
+	s.stateChangeLock = &sync.Mutex{}
+	s.stateChangeCond = sync.NewCond(s.stateChangeLock)
+}
+
 func (s *State) broadcast() {
 	s.stateChangeLock.Lock()
 	s.stateChangeCond.Broadcast()