|
6 | 6 | #include <ydb/core/base/auth.h>
|
7 | 7 | #include <ydb/core/base/bridge.h>
|
8 | 8 | #include <ydb/core/base/blobstorage_common.h>
|
| 9 | +#include <ydb/core/driver_lib/run/grpc_servers_manager.h> |
9 | 10 |
|
10 | 11 | namespace NKikimr::NGRpcService {
|
11 | 12 |
|
@@ -59,6 +60,8 @@ class TUpdateClusterStateRequest : public TBridgeRequestGrpc<TUpdateClusterState
|
59 | 60 | using TBase = TBridgeRequestGrpc<TUpdateClusterStateRequest, TEvUpdateClusterStateRequest, Ydb::Bridge::UpdateClusterStateResult>;
|
60 | 61 | using TRpcBase = TRpcOperationRequestActor<TUpdateClusterStateRequest, TEvUpdateClusterStateRequest>;
|
61 | 62 |
|
| 63 | + bool IsDisconnectingRequest = false; |
| 64 | + |
62 | 65 | public:
|
63 | 66 | using TBase::TBase;
|
64 | 67 |
|
@@ -248,6 +251,19 @@ class TUpdateClusterStateRequest : public TBridgeRequestGrpc<TUpdateClusterState
|
248 | 251 | finalPromoted->CopyToProto(&newClusterState, &NKikimrBridge::TClusterState::SetPromotedPile);
|
249 | 252 | newClusterState.SetGeneration(currentClusterState.GetGeneration() + 1);
|
250 | 253 |
|
| 254 | + // check if current node is transitioning to DISCONNECTED state |
| 255 | + // if so, notify GRpcServersManager to wait for this request before shutting down |
| 256 | + const auto selfNodePileId = bridgeInfo->SelfNodePile->BridgePileId; |
| 257 | + if (selfNodePileId.GetPileIndex() < newClusterState.PerPileStateSize()) { |
| 258 | + const auto newSelfState = newClusterState.GetPerPileState(selfNodePileId.GetPileIndex()); |
| 259 | + if (newSelfState == NKikimrBridge::TClusterState::DISCONNECTED || |
| 260 | + newSelfState == NKikimrBridge::TClusterState::SUSPENDED) { |
| 261 | + IsDisconnectingRequest = true; |
| 262 | + self->ActorContext().Send(NKikimr::MakeGRpcServersManagerId(self->SelfId().NodeId()), |
| 263 | + new NKikimr::TEvGRpcServersManager::TEvDisconnectRequestStarted()); |
| 264 | + } |
| 265 | + } |
| 266 | + |
251 | 267 | auto request = std::make_unique<NStorage::TEvNodeConfigInvokeOnRoot>();
|
252 | 268 | auto *cmd = request->Record.MutableSwitchBridgeClusterState();
|
253 | 269 | cmd->MutableNewClusterState()->CopyFrom(newClusterState);
|
@@ -280,13 +296,23 @@ class TUpdateClusterStateRequest : public TBridgeRequestGrpc<TUpdateClusterState
|
280 | 296 | void Handle(NStorage::TEvNodeConfigInvokeOnRootResult::TPtr& ev) {
|
281 | 297 | const auto& response = ev->Get()->Record;
|
282 | 298 | auto* self = Self();
|
283 |
| - if (response.GetStatus() == NKikimrBlobStorage::TEvNodeConfigInvokeOnRootResult::OK) { |
284 |
| - Ydb::Bridge::UpdateClusterStateResult result; |
285 |
| - self->ReplyWithResult(Ydb::StatusIds::SUCCESS, result, self->ActorContext()); |
| 299 | + const bool success = response.GetStatus() == NKikimrBlobStorage::TEvNodeConfigInvokeOnRootResult::OK; |
| 300 | + auto notifyDisconnectFinished = [&]() { |
| 301 | + if (IsDisconnectingRequest) { |
| 302 | + self->ActorContext().Send(NKikimr::MakeGRpcServersManagerId(self->SelfId().NodeId()), |
| 303 | + new NKikimr::TEvGRpcServersManager::TEvDisconnectRequestFinished()); |
| 304 | + } |
| 305 | + }; |
| 306 | + |
| 307 | + if (!success) { |
| 308 | + notifyDisconnectFinished(); |
| 309 | + self->Reply(Ydb::StatusIds::INTERNAL_ERROR, response.GetErrorReason(), |
| 310 | + NKikimrIssues::TIssuesIds::DEFAULT_ERROR, self->ActorContext()); |
286 | 311 | return;
|
287 | 312 | }
|
288 |
| - self->Reply(Ydb::StatusIds::INTERNAL_ERROR, response.GetErrorReason(), |
289 |
| - NKikimrIssues::TIssuesIds::DEFAULT_ERROR, self->ActorContext()); |
| 313 | + Ydb::Bridge::UpdateClusterStateResult result; |
| 314 | + self->ReplyWithResult(Ydb::StatusIds::SUCCESS, result, self->ActorContext()); |
| 315 | + notifyDisconnectFinished(); |
290 | 316 | }
|
291 | 317 | };
|
292 | 318 |
|
|
0 commit comments