From 9f93904a4a5739d3ad9cd691e595b7ed43531ea0 Mon Sep 17 00:00:00 2001 From: Andrey Butusov Date: Tue, 29 Oct 2024 17:52:58 +0300 Subject: [PATCH] morph: support reloading morph endpoints with SIGHUP Add a new function `Client.Reload` that passes the `WithEndpoints` option and closes the client if there is no endpoint in the config to which the client is connected. Add docs. Closes #1871. Signed-off-by: Andrey Butusov --- CHANGELOG.md | 1 + cmd/neofs-node/config.go | 4 ++++ docs/sighup.md | 8 ++++++-- pkg/morph/client/reload.go | 25 +++++++++++++++++++++++++ 4 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 pkg/morph/client/reload.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 16e39c36aa..dce6be82a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ attribute, which is used for container domain name in NNS contracts (#2954) - `neofs-cli control object revive` command (#2968) - `--disable-auto-gen-tag` flag for gendoc command (#2983) - Docs files for cli commands to the `docs/cli-commands` folder (#2983) +- Reloading morph endpoints with SIGHUP (#2998) ### Fixed - Do not search for tombstones when handling their expiration, use local indexes instead (#2929) diff --git a/cmd/neofs-node/config.go b/cmd/neofs-node/config.go index 76d762ad92..56beef3bd2 100644 --- a/cmd/neofs-node/config.go +++ b/cmd/neofs-node/config.go @@ -870,6 +870,10 @@ func (c *cfg) configWatcher(ctx context.Context) { continue } + // Morph + + c.cli.Reload(client.WithEndpoints(c.morph.endpoints)) + c.log.Info("configuration has been reloaded successfully") case <-ctx.Done(): return diff --git a/docs/sighup.md b/docs/sighup.md index 0c41564159..cc5595f412 100644 --- a/docs/sighup.md +++ b/docs/sighup.md @@ -10,8 +10,6 @@ Available for reconfiguration fields: ```yml head_timeout: - cache_size: - cache_time: replication_cooldown: object_batch_size: max_workers: @@ -34,3 +32,9 @@ comparing paths from `shard.blobstor` section. After this we have 3 sets: | Changed section | Actions | |-----------------|----------------------------------------------------------------------------------------------------------------------| | `path` | If `path` is different, metabase is closed and opened with a new path. All other configuration will also be updated. | + +### Morph + +| Changed section | Actions | +|-----------------|--------------------------------------------------------------------------------------------------------------------| +| `endpoints` | If in the `endpoints` there is no endpoint that the client is connected to, try connecting to another endpoint N3. | diff --git a/pkg/morph/client/reload.go b/pkg/morph/client/reload.go new file mode 100644 index 0000000000..f001fad7f7 --- /dev/null +++ b/pkg/morph/client/reload.go @@ -0,0 +1,25 @@ +package client + +import "slices" + +// Reload allows runtime reconfiguration for WithEndpoints parameter. +func (c *Client) Reload(opts ...Option) { + cfg := new(cfg) + for _, o := range opts { + o(cfg) + } + + c.cfg.endpoints = cfg.endpoints + + c.endpoints = cfg.endpoints + + var conn = c.conn.Load() + if conn == nil { + return + } + currentEndpointID := conn.client.Endpoint() + + if slices.Index(c.endpoints, currentEndpointID) == -1 { + conn.client.Close() + } +}