Skip to content

Commit a17fdae

Browse files
authored
Merge pull request #78 from fly-apps/unregister-primary-fix
Check member role before unregistering
2 parents b999c55 + 11393ca commit a17fdae

File tree

2 files changed

+23
-13
lines changed

2 files changed

+23
-13
lines changed

cmd/pg_unregister/main.go

+8-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,14 @@ func main() {
3535
return
3636
}
3737

38-
if err := node.RepMgr.UnregisterMemberByHostname(ctx, conn, string(hostnameBytes)); err != nil {
38+
member, err := node.RepMgr.MemberByHostname(ctx, conn, string(hostnameBytes))
39+
if err != nil {
40+
utils.WriteError(fmt.Errorf("failed to resolve member: %s", err))
41+
os.Exit(1)
42+
return
43+
}
44+
45+
if err := node.RepMgr.UnregisterMember(ctx, *member); err != nil {
3946
utils.WriteError(fmt.Errorf("failed to unregister member: %v", err))
4047
os.Exit(1)
4148
return

internal/flypg/repmgr.go

+15-12
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,15 @@ func (r *RepMgr) registerPrimary() error {
147147
return nil
148148
}
149149

150+
func (r *RepMgr) unregisterPrimary(id int) error {
151+
cmdStr := fmt.Sprintf("repmgr primary unregister -f %s --node-id=%d", r.ConfigPath, id)
152+
if err := utils.RunCommand(cmdStr); err != nil {
153+
fmt.Printf("failed to unregister primary: %s", err)
154+
}
155+
156+
return nil
157+
}
158+
150159
func (r *RepMgr) rejoinCluster(hostname string) error {
151160
cmdStr := fmt.Sprintf("repmgr -f %s node rejoin -h %s -p %d -U %s -d %s --force-rewind --no-wait",
152161
r.ConfigPath,
@@ -380,21 +389,15 @@ func (r *RepMgr) HostInRegion(ctx context.Context, hostname string) (bool, error
380389
}
381390

382391
func (r *RepMgr) UnregisterMember(ctx context.Context, member Member) error {
383-
if err := r.unregisterStandby(member.ID); err != nil {
384-
return fmt.Errorf("failed to unregister member %d from repmgr: %s", member.ID, err)
385-
}
386-
387-
return nil
388-
}
389-
390-
func (r *RepMgr) UnregisterMemberByHostname(ctx context.Context, conn *pgx.Conn, hostname string) error {
391-
member, err := r.MemberByHostname(ctx, conn, hostname)
392-
if err != nil {
393-
return fmt.Errorf("failed to resolve member %s: %s", hostname, err)
392+
if member.Role == PrimaryRoleName {
393+
if err := r.unregisterPrimary(member.ID); err != nil {
394+
return fmt.Errorf("failed to unregister member %d: %s", member.ID, err)
395+
}
396+
return nil
394397
}
395398

396399
if err := r.unregisterStandby(member.ID); err != nil {
397-
return fmt.Errorf("failed to unregister member %d from repmgr: %s", member.ID, err)
400+
return fmt.Errorf("failed to unregister member %d: %s", member.ID, err)
398401
}
399402

400403
return nil

0 commit comments

Comments
 (0)