diff --git a/client/internal/routemanager/client/client.go b/client/internal/routemanager/client/client.go index 0b8e161d215..c43d228a8de 100644 --- a/client/internal/routemanager/client/client.go +++ b/client/internal/routemanager/client/client.go @@ -336,6 +336,11 @@ func (w *Watcher) recalculateRoutes(rsn reason, routerPeerStatuses map[route.ID] return nil } + if isRouteStickyOnFailure() { + log.Warnf("No available routes for network [%v], keep current route %s", w.handler, w.currentChosen.Peer) + return nil + } + if err := w.removeAllowedIPs(w.currentChosen, rsn); err != nil { return fmt.Errorf("remove obsolete: %w", err) } diff --git a/client/internal/routemanager/client/env.go b/client/internal/routemanager/client/env.go new file mode 100644 index 00000000000..de9a9f1e719 --- /dev/null +++ b/client/internal/routemanager/client/env.go @@ -0,0 +1,24 @@ +package client + +import ( + "os" + "strings" + + log "github.com/sirupsen/logrus" +) + +const ( + // envRouteStickyOnFailure is used to configure if routes should be kept on failure + envRouteStickyOnFailure = "NB_ROUTE_STICKY_ON_FAILURE" +) + +// isRouteStickyOnFailure checks if routes should be kept on failure +func isRouteStickyOnFailure() bool { + stickyOnFailureEnv := os.Getenv(envRouteStickyOnFailure) + if stickyOnFailureEnv == "" { + return false + } + + log.Infof("routes will be kept on failure as %s is set to %s", envRouteStickyOnFailure, stickyOnFailureEnv) + return strings.ToLower(stickyOnFailureEnv) == "true" +}