Skip to content

Commit 6b392d6

Browse files
author
Ben Iofel
committed
make pg_unregister work with new names
1 parent aeb078f commit 6b392d6

File tree

3 files changed

+43
-4
lines changed

3 files changed

+43
-4
lines changed

cmd/pg_unregister/main.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@ package main
33
import (
44
"context"
55
"encoding/base64"
6+
"errors"
67
"fmt"
78
"os"
89

910
"github.com/fly-apps/postgres-flex/internal/flypg"
1011
"github.com/fly-apps/postgres-flex/internal/utils"
12+
"github.com/jackc/pgx/v5"
1113
)
1214

1315
func main() {
@@ -40,7 +42,13 @@ func processUnregistration(ctx context.Context) error {
4042
defer func() { _ = conn.Close(ctx) }()
4143

4244
member, err := node.RepMgr.MemberByHostname(ctx, conn, string(hostnameBytes))
43-
if err != nil {
45+
if errors.Is(err, pgx.ErrNoRows) {
46+
// for historical reasons, flyctl passes in the 6pn as the hostname
47+
member, err = node.RepMgr.MemberBy6PN(ctx, conn, string(hostnameBytes))
48+
if err != nil {
49+
return fmt.Errorf("failed to resolve member by hostname and 6pn: %s", err)
50+
}
51+
} else if err != nil {
4452
return fmt.Errorf("failed to resolve member: %s", err)
4553
}
4654

internal/flypg/repmgr.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,37 @@ func (*RepMgr) MemberByHostname(ctx context.Context, pg *pgx.Conn, hostname stri
449449
return &member, nil
450450
}
451451

452+
// MemberBy6PN returns a member by its 6PN address.
453+
// This assumes the hostnames are hostnames
454+
func (r *RepMgr) MemberBy6PN(ctx context.Context, pg *pgx.Conn, ip string) (*Member, error) {
455+
members, err := r.Members(ctx, pg)
456+
if err != nil {
457+
return nil, err
458+
}
459+
460+
resolver := privnet.GetResolver()
461+
var lastErr error
462+
for _, member := range members {
463+
ips, err := resolver.LookupIPAddr(ctx, member.Hostname)
464+
if err != nil {
465+
lastErr = err
466+
continue
467+
}
468+
469+
for _, addr := range ips {
470+
if addr.IP.String() == ip {
471+
return &member, nil
472+
}
473+
}
474+
}
475+
476+
if lastErr != nil {
477+
return nil, fmt.Errorf("no matches found for %s, and error encountered: %s", ip, lastErr)
478+
}
479+
480+
return nil, nil
481+
}
482+
452483
func (r *RepMgr) ResolveMemberOverDNS(ctx context.Context) (*Member, error) {
453484
machineIds, err := r.InRegionPeerMachines(ctx)
454485
if err != nil {

internal/privnet/sixpn.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ func AllPeers(ctx context.Context, appName string) ([]net.IPAddr, error) {
1414
}
1515

1616
func Get6PN(ctx context.Context, hostname string) ([]net.IPAddr, error) {
17-
r := getResolver()
17+
r := GetResolver()
1818
ips, err := r.LookupIPAddr(ctx, hostname)
1919

2020
if err != nil {
@@ -47,7 +47,7 @@ type Machine struct {
4747
}
4848

4949
func AllMachines(ctx context.Context, appName string) ([]Machine, error) {
50-
r := getResolver()
50+
r := GetResolver()
5151
txts, err := r.LookupTXT(ctx, fmt.Sprintf("vms.%s.internal", appName))
5252
if err != nil {
5353
return nil, err
@@ -67,7 +67,7 @@ func AllMachines(ctx context.Context, appName string) ([]Machine, error) {
6767
return machines, nil
6868
}
6969

70-
func getResolver() *net.Resolver {
70+
func GetResolver() *net.Resolver {
7171
nameserver := os.Getenv("FLY_NAMESERVER")
7272
if nameserver == "" {
7373
nameserver = "fdaa::3"

0 commit comments

Comments
 (0)