-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathhedge_test.go
89 lines (77 loc) · 1.61 KB
/
hedge_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package hedge
import (
"context"
"log/slog"
"testing"
"time"
"cloud.google.com/go/spanner"
gaxv2 "github.com/googleapis/gax-go/v2"
)
const (
db = "projects/test-project/instances/test-instance/databases/testdb"
)
func TestAny(t *testing.T) {
// TODO:
d := []byte{}
d = append(d, []byte("hello")...)
d = append(d, []byte("world")...)
d = append(d, []byte("stats")...)
d = append(d, []byte("one")...)
slog.Info("next:", "val", d[0:5])
slog.Info("next:", "val", d[5:10])
slog.Info("next:", "val", d[10:15])
slog.Info("next:", "val", d[15:20])
}
func TestBasic(t *testing.T) {
ctx := context.Background()
client, err := spanner.NewClient(ctx, db)
if err != nil {
t.Error(err)
return
}
defer client.Close()
op := New(client, ":8080", "locktable", "mylock", "logtable",
WithLeaderHandler(
nil,
func(data interface{}, msg []byte) ([]byte, error) {
t.Log("[send] received:", string(msg))
return []byte("send " + string(msg)), nil
},
),
WithBroadcastHandler(
nil,
func(data interface{}, msg []byte) ([]byte, error) {
t.Log("[broadcast/semaphore] received:", string(msg))
return nil, nil
},
),
)
done := make(chan error, 1)
quit, cancel := context.WithCancel(ctx)
go op.Run(quit, done)
var cnt int
bo := gaxv2.Backoff{
Initial: time.Second,
Max: time.Second * 30,
Multiplier: 2,
}
for {
cnt++
locked, _ := op.HasLock()
switch {
case locked:
t.Log("got lock")
break
default:
t.Log("didn't get lock, retry")
time.Sleep(bo.Pause())
continue
}
if cnt >= 10 {
t.Fatalf("can't get lock")
}
break
}
cancel()
<-done
}