From 2dfc18623ee33ee3f666c5ddb1abfd35b3602be2 Mon Sep 17 00:00:00 2001 From: Vladimir Dementyev Date: Wed, 1 Nov 2023 18:34:09 -0700 Subject: [PATCH] fix: pick correct broadcast adapter on Fly --- config/presets.go | 12 +++++++++++- config/presets_test.go | 4 ++++ docs/configuration.md | 1 + 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/config/presets.go b/config/presets.go index d8fa9f43..1188eb17 100644 --- a/config/presets.go +++ b/config/presets.go @@ -67,6 +67,8 @@ func (c *Config) loadFlyPreset(defaults *Config) error { return errors.New("FLY_APP_NAME env is missing") } + redisEnabled := (c.Redis.URL != defaults.Redis.URL) + // Obtain cluster info cluster, err := fly.Cluster(appName) @@ -107,12 +109,16 @@ func (c *Config) loadFlyPreset(defaults *Config) error { // Enable embedded NATS by default unless another adapter is set for PubSub // or Redis URL is provided if c.PubSubAdapter == defaults.PubSubAdapter { - if c.Redis.URL != defaults.Redis.URL { + if redisEnabled { c.PubSubAdapter = "redis" } } if multiNode { + if !redisEnabled && c.BroadcastAdapter == defaults.BroadcastAdapter { + c.BroadcastAdapter = "http,nats" + } + if c.PubSubAdapter == defaults.PubSubAdapter { c.PubSubAdapter = "nats" } @@ -134,6 +140,10 @@ func (c *Config) loadFlyPreset(defaults *Config) error { if singleNode { log.WithField("context", "config").Infof("Discovered a single node cluster -> enabling in-memory broker") c.BrokerAdapter = "memory" + + if !redisEnabled && c.BroadcastAdapter == defaults.BroadcastAdapter { + c.BroadcastAdapter = "http" + } } if rpcName, ok := os.LookupEnv("ANYCABLE_FLY_RPC_APP_NAME"); ok { diff --git a/config/presets_test.go b/config/presets_test.go index 0d46eeb3..b8e42536 100644 --- a/config/presets_test.go +++ b/config/presets_test.go @@ -77,6 +77,7 @@ func TestFlyPresets_when_single_vm_discovered(t *testing.T) { // In-memory broker is good enough for single node, no pub/sub needed assert.Equal(t, false, config.EmbedNats) assert.Equal(t, "", config.PubSubAdapter) + assert.Equal(t, "http", config.BroadcastAdapter) assert.Equal(t, "memory", config.BrokerAdapter) assert.Equal(t, "nats://0.0.0.0:4222", config.EmbeddedNats.ServiceAddr) } @@ -105,6 +106,7 @@ func TestFlyPresets_when_two_vms_discovered(t *testing.T) { assert.Equal(t, "0.0.0.0", config.Host) assert.Equal(t, 8989, config.Port) assert.Equal(t, 8989, config.HTTPBroadcast.Port) + assert.Equal(t, "http,nats", config.BroadcastAdapter) assert.Equal(t, true, config.EmbedNats) assert.Equal(t, "nats", config.PubSubAdapter) // We do not enable broker by default, since it requires at least 3 nodes or exactly 1 @@ -139,6 +141,7 @@ func TestFlyPresets_when_three_vms_discovered(t *testing.T) { assert.Equal(t, "0.0.0.0", config.Host) assert.Equal(t, 8989, config.Port) assert.Equal(t, 8989, config.HTTPBroadcast.Port) + assert.Equal(t, "http,nats", config.BroadcastAdapter) assert.Equal(t, true, config.EmbedNats) assert.Equal(t, "nats", config.PubSubAdapter) assert.Equal(t, "nats", config.BrokerAdapter) @@ -173,6 +176,7 @@ func TestFlyPresets_when_three_vms_from_different_regions(t *testing.T) { assert.Equal(t, 8989, config.Port) assert.Equal(t, 8989, config.HTTPBroadcast.Port) assert.Equal(t, true, config.EmbedNats) + assert.Equal(t, "http,nats", config.BroadcastAdapter) assert.Equal(t, "nats", config.PubSubAdapter) // Currently, we do not enable broker for multi-region setup; we need to figure this out later assert.Equal(t, "", config.BrokerAdapter) diff --git a/docs/configuration.md b/docs/configuration.md index 88781d2e..d9ca6cec 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -131,6 +131,7 @@ The preset provide the following defaults: - `host`: "0.0.0.0" - `http_broadcast_port`: `$PORT` (set to the same value as the main HTTP port). +- `broadcast_adapter`: "http" (unless Redis is configured) - `enats_server_addr`: "nats://0.0.0.0:4222" - `enats_cluster_addr`: "nats://0.0.0.0:5222" - `enats_cluster_name`: "\-\-cluster"