From d82f0d192691f33eb63e2d71beac433a4232b163 Mon Sep 17 00:00:00 2001
From: Evgenii Stratonikov <e.stratonikov@yadro.com>
Date: Thu, 14 Nov 2024 15:09:42 +0300
Subject: [PATCH] [#1496] node/control: Await until SetNetmapStatus() persists

Signed-off-by: Evgenii Stratonikov <e.stratonikov@yadro.com>
---
 cmd/frostfs-node/netmap.go              | 7 +++++--
 pkg/morph/client/netmap/peer.go         | 4 ++--
 pkg/morph/client/netmap/update_state.go | 9 ++-------
 3 files changed, 9 insertions(+), 11 deletions(-)

diff --git a/cmd/frostfs-node/netmap.go b/cmd/frostfs-node/netmap.go
index 6df947954..9127d1123 100644
--- a/cmd/frostfs-node/netmap.go
+++ b/cmd/frostfs-node/netmap.go
@@ -421,8 +421,11 @@ func (c *cfg) updateNetMapState(ctx context.Context, stateSetter func(*nmClient.
 	prm.SetKey(c.key.PublicKey().Bytes())
 	stateSetter(&prm)
 
-	_, err := c.cfgNetmap.wrapper.UpdatePeerState(ctx, prm)
-	return err
+	res, err := c.cfgNetmap.wrapper.UpdatePeerState(ctx, prm)
+	if err != nil {
+		return err
+	}
+	return c.cfgNetmap.wrapper.Morph().WaitTxHalt(ctx, res)
 }
 
 type netInfo struct {
diff --git a/pkg/morph/client/netmap/peer.go b/pkg/morph/client/netmap/peer.go
index 9617d018c..949e8cb63 100644
--- a/pkg/morph/client/netmap/peer.go
+++ b/pkg/morph/client/netmap/peer.go
@@ -58,9 +58,9 @@ func (c *Client) ForceRemovePeer(ctx context.Context, nodeInfo netmap.NodeInfo,
 	prm.SetControlTX(true)
 	prm.SetVUB(vub)
 
-	vub, err := c.UpdatePeerState(ctx, prm)
+	res, err := c.UpdatePeerState(ctx, prm)
 	if err != nil {
 		return 0, fmt.Errorf("updating peer state: %v", err)
 	}
-	return vub, nil
+	return res.VUB, nil
 }
diff --git a/pkg/morph/client/netmap/update_state.go b/pkg/morph/client/netmap/update_state.go
index 971a55d33..f9f639c19 100644
--- a/pkg/morph/client/netmap/update_state.go
+++ b/pkg/morph/client/netmap/update_state.go
@@ -2,7 +2,6 @@ package netmap
 
 import (
 	"context"
-	"fmt"
 
 	"git.frostfs.info/TrueCloudLab/frostfs-contract/netmap"
 	"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/client"
@@ -37,7 +36,7 @@ func (u *UpdatePeerPrm) SetMaintenance() {
 }
 
 // UpdatePeerState changes peer status through Netmap contract call.
-func (c *Client) UpdatePeerState(ctx context.Context, p UpdatePeerPrm) (uint32, error) {
+func (c *Client) UpdatePeerState(ctx context.Context, p UpdatePeerPrm) (client.InvokeRes, error) {
 	method := updateStateMethod
 
 	if c.client.WithNotary() && c.client.IsAlpha() {
@@ -56,9 +55,5 @@ func (c *Client) UpdatePeerState(ctx context.Context, p UpdatePeerPrm) (uint32,
 	prm.SetArgs(int64(p.state), p.key)
 	prm.InvokePrmOptional = p.InvokePrmOptional
 
-	res, err := c.client.Invoke(ctx, prm)
-	if err != nil {
-		return 0, fmt.Errorf("could not invoke smart contract: %w", err)
-	}
-	return res.VUB, nil
+	return c.client.Invoke(ctx, prm)
 }