4
4
"context"
5
5
"flag"
6
6
"fmt"
7
+ "os"
7
8
"strconv"
9
+ "time"
8
10
9
11
"github.com/fly-apps/postgres-flex/pkg/flypg"
10
12
)
@@ -21,27 +23,87 @@ func main() {
21
23
details := flag .String ("details" , "" , "details" )
22
24
flag .Parse ()
23
25
24
- fmt .Printf ("Event: %s\n Node: %d\n Success: %s\n Details: %s\n " ,
25
- * event , * nodeID , * success , * details )
26
+ eventDetails := fmt .Sprintf ("%s - Event: %s\n Node: %d\n Success: %s\n Details: %s\n " , time .Now ().String (), * event , * nodeID , * success , * details )
27
+
28
+ // TODO - Use an actual logging framework instead of just writing strings to a file.
29
+ logFile , err := os .OpenFile ("/data/event.log" , os .O_RDWR | os .O_CREATE | os .O_APPEND , 0666 )
30
+ if err != nil {
31
+ fmt .Printf ("failed to open event log: %s" , err )
32
+ }
33
+ defer logFile .Close ()
34
+
35
+ logFile .WriteString (eventDetails )
26
36
27
37
switch * event {
38
+
28
39
case "repmgrd_failover_promote" , "standby_promote" :
29
40
// TODO - Need to figure out what to do when success == 0.
30
- if err := reconfigurePGBouncer (* nodeID ); err != nil {
31
- fmt .Println (err .Error ())
32
- return
41
+
42
+ retry := 0
43
+ maxRetries := 5
44
+ success := false
45
+
46
+ for retry < maxRetries {
47
+ if err := reconfigurePGBouncer (* nodeID ); err != nil {
48
+ errMsg := fmt .Sprintf ("%s [%s] attempt: %d - failed to reconfigure pgbouncer: %s\n " , * event , time .Now ().String (), retry , err )
49
+ logFile .WriteString (errMsg )
50
+
51
+ retry ++
52
+ time .Sleep (1 * time .Second )
53
+ continue
54
+ }
55
+
56
+ success = true
57
+ break
58
+ }
59
+
60
+ if success {
61
+ msg := fmt .Sprintf ("%s [%s] Successfully reconfigured pgBouncer to %d\n " , * event , time .Now ().String (), * nodeID )
62
+ logFile .WriteString (msg )
63
+ os .Exit (0 )
64
+ } else {
65
+ msg := fmt .Sprintf (" %s [%s] Failed ot reconfigured pgBouncer to %d\n " , * event , time .Now ().String (), * nodeID )
66
+ logFile .WriteString (msg )
67
+ os .Exit (1 )
33
68
}
34
69
35
70
case "standby_follow" :
71
+
36
72
newMemberID , err := strconv .Atoi (* newPrimary )
37
73
if err != nil {
38
- fmt .Printf ("failed to parse new member id: %s" , err )
74
+ errMsg := fmt .Sprintf ("failed to parse newMemberID %s: %s\n " , * newPrimary , err )
75
+ logFile .WriteString (errMsg )
76
+ os .Exit (1 )
39
77
}
40
78
41
- if err := reconfigurePGBouncer (newMemberID ); err != nil {
42
- fmt .Println (err .Error ())
43
- return
79
+ retry := 0
80
+ maxRetries := 5
81
+ success := false
82
+
83
+ for retry < maxRetries {
84
+ if err := reconfigurePGBouncer (* & newMemberID ); err != nil {
85
+ errMsg := fmt .Sprintf ("%s [%s] attempt: %d - failed to reconfigure pgbouncer: %s\n " , * event , time .Now ().String (), retry , err )
86
+ logFile .WriteString (errMsg )
87
+
88
+ retry ++
89
+ time .Sleep (1 * time .Second )
90
+ continue
91
+ }
92
+
93
+ success = true
94
+ break
95
+ }
96
+
97
+ if success {
98
+ msg := fmt .Sprintf ("%s [%s] Successfully reconfigured pgBouncer to %d\n " , * event , time .Now ().String (), newMemberID )
99
+ logFile .WriteString (msg )
100
+ os .Exit (0 )
101
+ } else {
102
+ msg := fmt .Sprintf (" %s [%s] Failed ot reconfigured pgBouncer to %d\n " , * event , time .Now ().String (), newMemberID )
103
+ logFile .WriteString (msg )
104
+ os .Exit (1 )
44
105
}
106
+
45
107
default :
46
108
// noop
47
109
}
@@ -63,7 +125,6 @@ func reconfigurePGBouncer(id int) error {
63
125
return err
64
126
}
65
127
66
- fmt .Println ("Reconfiguring pgbouncer primary" )
67
128
if err := node .PGBouncer .ConfigurePrimary (context .TODO (), member .Hostname , true ); err != nil {
68
129
return fmt .Errorf ("failed to reconfigure pgbouncer primary %s" , err )
69
130
}
0 commit comments