Skip to content
8 changes: 7 additions & 1 deletion cmd/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,13 @@ func validateHarmonyConfig(config harmonyconfig.HarmonyConfig) error {
return fmt.Errorf("flag --run.offline must have p2p IP be %v", nodeconfig.DefaultLocalListenIP)
}

if !config.Sync.Client && !config.DNSSync.Client {
// Recovery maintenance must be able to open a stopped database without
// starting either downloader. The mainnet validator exception is paired
// with a fail-closed runtime checkpoint/sync guard in cmd/harmony.
recoveryValidator := config.Network.NetworkType == nodeconfig.Mainnet &&
config.General.NodeType == NodeTypeValidator
if !config.Sync.Client && !config.DNSSync.Client &&
!config.General.IsOffline && !recoveryValidator {
// There is no module up for sync
return errors.New("either --sync.client or --sync.legacy.client shall be enabled")
}
Expand Down
27 changes: 27 additions & 0 deletions cmd/config/recovery_config_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package config

import (
"testing"

nodeconfig "github.com/harmony-one/harmony/internal/configs/node"
"github.com/stretchr/testify/require"
)

func TestRecoveryConfigAllowsNoSyncClientOnlyInNarrowCases(t *testing.T) {
offline := GetDefaultHmyConfigCopy(nodeconfig.Mainnet)
offline.General.IsOffline = true
offline.P2P.IP = nodeconfig.DefaultLocalListenIP
offline.Sync.Client = false
offline.DNSSync.Client = false
require.NoError(t, validateHarmonyConfig(offline))

recoveryValidator := GetDefaultHmyConfigCopy(nodeconfig.Mainnet)
recoveryValidator.Sync.Client = false
recoveryValidator.DNSSync.Client = false
require.NoError(t, validateHarmonyConfig(recoveryValidator))

testnet := GetDefaultHmyConfigCopy(nodeconfig.Testnet)
testnet.Sync.Client = false
testnet.DNSSync.Client = false
require.Error(t, validateHarmonyConfig(testnet))
}
Loading