func testStorageStoreRetrieveNode(storage cluster.Storage, t *testing.T) { node1 := cluster.Node{Address: "my-addr-1", Metadata: map[string]string{"abc": "def"}} defer storage.RemoveNode("my-addr-1") err := storage.StoreNode(node1) assertIsNil(err, t) nd, err := storage.RetrieveNode("my-addr-1") assertIsNil(err, t) if !reflect.DeepEqual(nd, node1) { t.Errorf("unexpected node, expected: %#v, got: %#v", node1, nd) } _, err = storage.RetrieveNode("my-addr-xxxx") if err != cstorage.ErrNoSuchNode { t.Errorf("Expected ErrNoSuchNode got: %#v", err) } }
func testStorageStoreAlreadyLocked(storage cluster.Storage, t *testing.T) { node1 := cluster.Node{ Address: "my-addr-locked", Metadata: map[string]string{}, Healing: cluster.HealingData{LockedUntil: time.Now().UTC().Add(5 * time.Second), IsFailure: true}, } defer storage.RemoveNode("my-addr-locked") err := storage.StoreNode(node1) assertIsNil(err, t) nd, err := storage.RetrieveNode("my-addr-locked") assertIsNil(err, t) duration := nd.Healing.LockedUntil.Sub(node1.Healing.LockedUntil) if duration < 0 { duration = -duration } if duration > 1*time.Second { t.Errorf("unexpected node, expected: %#v, got: %#v", node1, nd) } }
func testStorageLockNodeHealing(storage cluster.Storage, t *testing.T) { defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(100)) node := cluster.Node{Address: "addr-xyz"} defer storage.RemoveNode("addr-xyz") err := storage.StoreNode(node) assertIsNil(err, t) successCount := 0 wg := sync.WaitGroup{} wg.Add(50) for i := 0; i < 50; i++ { go func() { defer wg.Done() locked, err := storage.LockNodeForHealing("addr-xyz", true, 5*time.Second) assertIsNil(err, t) if locked { successCount++ } }() } wg.Wait() if successCount != 1 { t.Fatalf("Expected success in only one goroutine, got: %d", successCount) } dbNode, err := storage.RetrieveNode("addr-xyz") assertIsNil(err, t) if dbNode.Healing.LockedUntil.IsZero() { t.Fatal("Expected node Healing.LockedUntil not to be zero") } if !dbNode.Healing.IsFailure { t.Fatal("Expected node healing.isFailure to be true") } dbNode.Healing = cluster.HealingData{} err = storage.UpdateNode(dbNode) assertIsNil(err, t) dbNode, err = storage.RetrieveNode("addr-xyz") assertIsNil(err, t) if !dbNode.Healing.LockedUntil.IsZero() { t.Fatal("Expected node Healing.LockedUntil to be zero") } if dbNode.Healing.IsFailure { t.Fatal("Expected node Healing.IsFailure to be false") } }