Skip to content

Commit 89cf65a

Browse files
authored
Merge pull request #38 from fly-apps/internal_shared_config
Adds plumbing for an internal config file for shared config
2 parents 7d41873 + 4937645 commit 89cf65a

File tree

3 files changed

+119
-4
lines changed

3 files changed

+119
-4
lines changed

cmd/standby_cleaner/main.go

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@ import (
99
"github.com/fly-apps/postgres-flex/pkg/flypg"
1010
"github.com/fly-apps/postgres-flex/pkg/flypg/admin"
1111
"github.com/jackc/pgx/v4"
12+
13+
"golang.org/x/exp/maps"
1214
)
1315

1416
var (
1517
monitorFrequency = time.Minute * 5
16-
// TODO - Make this configurable and/or extend this to 12-24 hours.
17-
deadMemberRemovalThreshold = time.Hour * 1
1818
)
1919

2020
func main() {
@@ -33,11 +33,33 @@ func main() {
3333
os.Exit(1)
3434
}
3535

36+
internal, err := flypg.ReadFromFile("/data/flypg.internal.conf")
37+
if err != nil {
38+
fmt.Printf("failed to open config: %s\n", err)
39+
os.Exit(1)
40+
}
41+
42+
user, err := flypg.ReadFromFile("/data/flypg.user.conf")
43+
if err != nil {
44+
fmt.Printf("failed to open config: %s\n", err)
45+
os.Exit(1)
46+
}
47+
48+
maps.Copy(user, internal)
49+
50+
deadMemberRemovalThreshold, err := time.ParseDuration(fmt.Sprint(internal["standby_clean_interval"]))
51+
if err != nil {
52+
fmt.Printf(fmt.Sprintf("Failed to parse config: %s", err))
53+
os.Exit(1)
54+
}
55+
3656
seenAt := map[int]time.Time{}
3757

3858
ticker := time.NewTicker(monitorFrequency)
3959
defer ticker.Stop()
4060

61+
fmt.Printf("Pruning every %s...\n", deadMemberRemovalThreshold)
62+
4163
for {
4264
select {
4365
case <-ticker.C:

pkg/flypg/flypg.go

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package flypg
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"time"
7+
)
8+
9+
type FlyPGConfig struct {
10+
internalConfigFilePath string
11+
userConfigFilePath string
12+
13+
internalConfig ConfigMap
14+
userConfig ConfigMap
15+
16+
configPath string
17+
}
18+
19+
func (c *FlyPGConfig) SetDefaults() {
20+
c.internalConfig = ConfigMap{
21+
"standby_clean_interval": time.Hour * 24,
22+
}
23+
}
24+
25+
func NewInternalConfig(configPath string) *FlyPGConfig {
26+
return &FlyPGConfig{
27+
internalConfigFilePath: fmt.Sprintf("%s/flypg.internal.conf", configPath),
28+
userConfigFilePath: fmt.Sprintf("%s/flypg.user.conf", configPath),
29+
configPath: configPath,
30+
internalConfig: ConfigMap{},
31+
userConfig: ConfigMap{},
32+
}
33+
}
34+
func (c *FlyPGConfig) InternalConfig() ConfigMap {
35+
return c.internalConfig
36+
}
37+
38+
func (c *FlyPGConfig) UserConfig() ConfigMap {
39+
return c.userConfig
40+
}
41+
42+
func (c *FlyPGConfig) ConsulKey() string {
43+
return "FlyPGConfig"
44+
}
45+
46+
func (c *FlyPGConfig) SetUserConfig(newConfig ConfigMap) {
47+
c.userConfig = newConfig
48+
}
49+
50+
func (c *FlyPGConfig) InternalConfigFile() string {
51+
return c.internalConfigFilePath
52+
}
53+
54+
func (c *FlyPGConfig) UserConfigFile() string {
55+
return c.userConfigFilePath
56+
}
57+
58+
func (c *FlyPGConfig) initialize() error {
59+
c.SetDefaults()
60+
61+
internal, err := os.Create(c.internalConfigFilePath)
62+
if err != nil {
63+
return err
64+
}
65+
defer internal.Close()
66+
67+
user, err := os.Create(c.userConfigFilePath)
68+
if err != nil {
69+
return err
70+
}
71+
defer user.Close()
72+
73+
return nil
74+
}

pkg/flypg/node.go

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,9 @@ type Node struct {
3535
OperatorCredentials Credentials
3636
ReplCredentials Credentials
3737

38-
PGBouncer PGBouncer
39-
RepMgr RepMgr
38+
PGBouncer PGBouncer
39+
RepMgr RepMgr
40+
InternalConfig FlyPGConfig
4041
}
4142

4243
func NewNode() (*Node, error) {
@@ -106,6 +107,8 @@ func NewNode() (*Node, error) {
106107
Credentials: node.ReplCredentials,
107108
}
108109

110+
node.InternalConfig = *NewInternalConfig("/data")
111+
109112
return node, nil
110113
}
111114

@@ -127,6 +130,22 @@ func (n *Node) Init(ctx context.Context) error {
127130
repmgr := n.RepMgr
128131
pgbouncer := n.PGBouncer
129132
PGConfig := n.PGConfig
133+
InternalConfig := n.InternalConfig
134+
135+
fmt.Println("Initializing internal config")
136+
if err := InternalConfig.initialize(); err != nil {
137+
fmt.Printf("Failed to initialize internal config: %s\n", err.Error())
138+
}
139+
140+
err = SyncUserConfig(&InternalConfig, cs.Store)
141+
if err != nil {
142+
fmt.Printf("Failed to sync user config from consul for internal config: %s\n", err.Error())
143+
}
144+
145+
err = WriteConfigFiles(&InternalConfig)
146+
if err != nil {
147+
fmt.Printf("Failed to write config files for internal config: %s\n", err.Error())
148+
}
130149

131150
fmt.Println("Initializing replication manager")
132151
if err := repmgr.initialize(); err != nil {

0 commit comments

Comments
 (0)