@@ -39,9 +39,13 @@ import (
39
39
func TestReaderReadHeartbeat (t * testing.T ) {
40
40
db := fakesqldb .New (t )
41
41
defer db .Close ()
42
- tr := newReader (db , mockNowFunc )
42
+
43
+ now := time .Now ()
44
+ tr := newReader (db , & now )
43
45
defer tr .Close ()
44
46
47
+ tr .pool .Open (tr .env .Config ().DB .AppWithDB (), tr .env .Config ().DB .DbaWithDB (), tr .env .Config ().DB .AppDebugWithDB ())
48
+
45
49
db .AddQuery (fmt .Sprintf ("SELECT ts FROM %s.heartbeat WHERE keyspaceShard='%s'" , "_vt" , tr .keyspaceShard ), & sqltypes.Result {
46
50
Fields : []* querypb.Field {
47
51
{Name : "ts" , Type : sqltypes .Int64 },
@@ -79,14 +83,46 @@ func TestReaderReadHeartbeat(t *testing.T) {
79
83
utils .MustMatch (t , expectedHisto , heartbeatLagNsHistogram .Counts (), "wrong counts in histogram" )
80
84
}
81
85
86
+ // TestReaderCloseSetsCurrentLagToZero tests that when closing the heartbeat reader, the current lag is
87
+ // set to zero.
88
+ func TestReaderCloseSetsCurrentLagToZero (t * testing.T ) {
89
+ db := fakesqldb .New (t )
90
+ defer db .Close ()
91
+ tr := newReader (db , nil )
92
+
93
+ db .AddQuery (fmt .Sprintf ("SELECT ts FROM %s.heartbeat WHERE keyspaceShard='%s'" , "_vt" , tr .keyspaceShard ), & sqltypes.Result {
94
+ Fields : []* querypb.Field {
95
+ {Name : "ts" , Type : sqltypes .Int64 },
96
+ },
97
+ Rows : [][]sqltypes.Value {{
98
+ sqltypes .NewInt64 (time .Now ().Add (- 10 * time .Second ).UnixNano ()),
99
+ }},
100
+ })
101
+
102
+ currentLagNs .Reset ()
103
+
104
+ tr .Open ()
105
+ time .Sleep (2 * time .Second )
106
+
107
+ assert .Greater (t , currentLagNs .Get (), int64 (0 ), "lag should be greater than zero" )
108
+
109
+ tr .Close ()
110
+
111
+ assert .Equal (t , int64 (0 ), currentLagNs .Get (), "lag should be be zero after closing the reader." )
112
+ }
113
+
82
114
// TestReaderReadHeartbeatError tests that we properly account for errors
83
115
// encountered in the reading of heartbeat.
84
116
func TestReaderReadHeartbeatError (t * testing.T ) {
85
117
db := fakesqldb .New (t )
86
118
defer db .Close ()
87
- tr := newReader (db , mockNowFunc )
119
+
120
+ now := time .Now ()
121
+ tr := newReader (db , & now )
88
122
defer tr .Close ()
89
123
124
+ tr .pool .Open (tr .env .Config ().DB .AppWithDB (), tr .env .Config ().DB .DbaWithDB (), tr .env .Config ().DB .AppDebugWithDB ())
125
+
90
126
cumulativeLagNs .Reset ()
91
127
readErrors .Reset ()
92
128
@@ -100,18 +136,23 @@ func TestReaderReadHeartbeatError(t *testing.T) {
100
136
assert .Equal (t , int64 (1 ), readErrors .Get (), "wrong read error count" )
101
137
}
102
138
103
- func newReader (db * fakesqldb.DB , nowFunc func () time.Time ) * heartbeatReader {
139
+ func newReader (db * fakesqldb.DB , frozenTime * time.Time ) * heartbeatReader {
104
140
config := tabletenv .NewDefaultConfig ()
105
141
config .ReplicationTracker .Mode = tabletenv .Heartbeat
106
142
config .ReplicationTracker .HeartbeatIntervalSeconds = 1
107
143
params , _ := db .ConnParams ().MysqlParams ()
108
144
cp := * params
109
145
dbc := dbconfigs .NewTestDBConfigs (cp , cp , "" )
146
+ config .DB = dbc
110
147
111
148
tr := newHeartbeatReader (tabletenv .NewEnv (config , "ReaderTest" ))
112
149
tr .keyspaceShard = "test:0"
113
- tr .now = nowFunc
114
- tr .pool .Open (dbc .AppWithDB (), dbc .DbaWithDB (), dbc .AppDebugWithDB ())
150
+
151
+ if frozenTime != nil {
152
+ tr .now = func () time.Time {
153
+ return * frozenTime
154
+ }
155
+ }
115
156
116
157
return tr
117
158
}
0 commit comments