Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 13 additions & 26 deletions cmd/event_handler/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,16 @@ import (
"context"
"flag"
"fmt"
"log"
"os"
"strconv"
"time"

"github.com/fly-apps/postgres-flex/pkg/flypg"
)

const eventLogFile = "/data/event.log"

func main() {
event := flag.String("event", "", "event type")
nodeID := flag.Int("node-id", 0, "the node id")
Expand All @@ -23,56 +26,45 @@ func main() {
details := flag.String("details", "", "details")
flag.Parse()

eventDetails := fmt.Sprintf("%s - Event: %s\n Node: %d\n Success: %s\n Details: %s\n", time.Now().String(), *event, *nodeID, *success, *details)

// TODO - Use an actual logging framework instead of just writing strings to a file.
logFile, err := os.OpenFile("/data/event.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
logFile, err := os.OpenFile(eventLogFile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644)
if err != nil {
fmt.Printf("failed to open event log: %s", err)
}
defer logFile.Close()

logFile.WriteString(eventDetails)
log.SetOutput(logFile)
log.Printf("event: %s, node: %d, success: %s, details: %s\n", *event, *nodeID, *success, *details)

switch *event {

case "repmgrd_failover_promote", "standby_promote":
// TODO - Need to figure out what to do when success == 0.

retry := 0
maxRetries := 5
success := false

for retry < maxRetries {
if err := reconfigurePGBouncer(*nodeID); err != nil {
errMsg := fmt.Sprintf("%s [%s] attempt: %d - failed to reconfigure pgbouncer: %s\n", *event, time.Now().String(), retry, err)
logFile.WriteString(errMsg)

log.Printf("%s - failed to reconfigure pgbouncer: %s. (attempt: %d)\n", *event, err, retry)
retry++
time.Sleep(1 * time.Second)
continue
}

success = true
break
}

if success {
msg := fmt.Sprintf("%s [%s] Successfully reconfigured pgBouncer to %d\n", *event, time.Now().String(), *nodeID)
logFile.WriteString(msg)
log.Printf("%s - successfully reconfigured pgbouncer to target: %d\n", *event, *nodeID)
os.Exit(0)
} else {
msg := fmt.Sprintf(" %s [%s] Failed ot reconfigured pgBouncer to %d\n", *event, time.Now().String(), *nodeID)
logFile.WriteString(msg)
log.Printf("%s - failed to reconfigured pgbouncer to target: %d\n", *event, *nodeID)
os.Exit(1)
}

case "standby_follow":

newMemberID, err := strconv.Atoi(*newPrimary)
if err != nil {
errMsg := fmt.Sprintf("failed to parse newMemberID %s: %s\n", *newPrimary, err)
logFile.WriteString(errMsg)
log.Printf("failed to parse newMemberID %s: %s\n", *newPrimary, err)
os.Exit(1)
}

Expand All @@ -82,25 +74,20 @@ func main() {

for retry < maxRetries {
if err := reconfigurePGBouncer(*&newMemberID); err != nil {
errMsg := fmt.Sprintf("%s [%s] attempt: %d - failed to reconfigure pgbouncer: %s\n", *event, time.Now().String(), retry, err)
logFile.WriteString(errMsg)

log.Printf("%s - failed to reconfigure pgbouncer: %s. (attempt: %d)\n", *event, err, retry)
retry++
time.Sleep(1 * time.Second)
continue
}

success = true
break
}

if success {
msg := fmt.Sprintf("%s [%s] Successfully reconfigured pgBouncer to %d\n", *event, time.Now().String(), newMemberID)
logFile.WriteString(msg)
log.Printf("%s - successfully reconfigured pgbouncer to target: %d\n", *event, newMemberID)
os.Exit(0)
} else {
msg := fmt.Sprintf(" %s [%s] Failed ot reconfigured pgBouncer to %d\n", *event, time.Now().String(), newMemberID)
logFile.WriteString(msg)
log.Printf("%s - failed to reconfigured pgbouncer to target: %d\n", *event, newMemberID)
os.Exit(1)
}

Expand Down