@@ -5,8 +5,10 @@ import (
5
5
)
6
6
7
7
const (
8
- SYNCED_STATE = "4 "
8
+ JOINING_STATE = "1 "
9
9
DONOR_DESYNCED_STATE = "2"
10
+ JOINED_STATE = "3"
11
+ SYNCED_STATE = "4"
10
12
)
11
13
12
14
type Healthchecker struct {
@@ -19,35 +21,52 @@ type HealthcheckerConfig struct {
19
21
AvailableWhenReadOnly bool
20
22
}
21
23
24
+ type HealthResult struct {
25
+ Healthy bool
26
+ }
27
+
22
28
func New (db * sql.DB , config HealthcheckerConfig ) * Healthchecker {
23
29
return & Healthchecker {
24
30
db : db ,
25
31
config : config ,
26
32
}
27
33
}
28
34
29
- func (h * Healthchecker ) Check () (bool , string ) {
35
+ var was_joined = false
36
+ var old_state = "0"
37
+
38
+ func (h * Healthchecker ) Check () (* HealthResult , string ) {
30
39
var variable_name string
31
- var value string
32
- err := h .db .QueryRow ("SHOW STATUS LIKE 'wsrep_local_state'" ).Scan (& variable_name , & value )
40
+ var state string
41
+ err := h .db .QueryRow ("SHOW STATUS LIKE 'wsrep_local_state'" ).Scan (& variable_name , & state )
33
42
43
+ var res , msg = & HealthResult {Healthy : false }, "not synced"
34
44
switch {
35
45
case err != nil :
36
- return false , err .Error ()
37
- case value == SYNCED_STATE || (value == DONOR_DESYNCED_STATE && h .config .AvailableWhenDonor ):
46
+ res , msg = & HealthResult {Healthy : false }, err .Error ()
47
+ case state != SYNCED_STATE && ! was_joined :
48
+ if old_state == JOINED_STATE && state != JOINED_STATE {
49
+ res , msg = & HealthResult {Healthy : false }, "no synced"
50
+ was_joined = true
51
+ } else {
52
+ res , msg = nil , "syncing"
53
+ }
54
+ case state == SYNCED_STATE || (state == DONOR_DESYNCED_STATE && h .config .AvailableWhenDonor ):
55
+ was_joined = true
56
+ res , msg = & HealthResult {Healthy : true }, "synced"
38
57
if ! h .config .AvailableWhenReadOnly {
39
58
var ro_variable_name string
40
59
var ro_value string
41
60
ro_err := h .db .QueryRow ("SHOW GLOBAL VARIABLES LIKE 'read_only'" ).Scan (& ro_variable_name , & ro_value )
42
61
switch {
43
62
case ro_err != nil :
44
- return false , ro_err .Error ()
63
+ res , msg = & HealthResult { Healthy : false } , ro_err .Error ()
45
64
case ro_value == "ON" :
46
- return false , "read-only"
65
+ res , msg = & HealthResult { Healthy : false } , "read-only"
47
66
}
48
67
}
49
- return true , "synced"
50
- default :
51
- return false , "not synced"
52
68
}
69
+
70
+ old_state = state
71
+ return res , msg
53
72
}
0 commit comments