Skip to content

Commit 11195c2

Browse files
authored
rpcdaemon: support splitted BackEnd and KV servers (#2088)
1 parent 342d6ca commit 11195c2

18 files changed

+842
-441
lines changed

cmd/dev/backend_kv_server.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
#include <silkworm/infra/concurrency/awaitable_wait_for_one.hpp>
4040
#include <silkworm/infra/grpc/client/client_context_pool.hpp>
4141
#include <silkworm/node/backend/ethereum_backend.hpp>
42-
#include <silkworm/node/remote/kv/grpc/server/backend_kv_server.hpp>
42+
#include <silkworm/node/remote/ethbackend/grpc/server/backend_kv_server.hpp>
4343
#include <silkworm/sentry/eth/status_data_provider.hpp>
4444
#include <silkworm/sentry/grpc/client/sentry_client.hpp>
4545
#include <silkworm/sentry/multi_sentry_client.hpp>

silkworm/node/backend/ethereum_backend.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@
2323

2424
#include <silkworm/core/chain/config.hpp>
2525
#include <silkworm/core/common/base.hpp>
26-
#include <silkworm/node/backend/state_change_collection.hpp>
2726
#include <silkworm/node/common/node_settings.hpp>
27+
#include <silkworm/node/remote/kv/grpc/server/state_change_collection.hpp>
2828
#include <silkworm/sentry/api/common/sentry_client.hpp>
2929

3030
namespace silkworm {

silkworm/node/node.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
#include <silkworm/node/common/preverified_hashes.hpp>
3131
#include <silkworm/node/execution/api/active_direct_service.hpp>
3232
#include <silkworm/node/execution/grpc/server/server.hpp>
33-
#include <silkworm/node/remote/kv/grpc/server/backend_kv_server.hpp>
33+
#include <silkworm/node/remote/ethbackend/grpc/server/backend_kv_server.hpp>
3434
#include <silkworm/node/resource_usage.hpp>
3535
#include <silkworm/node/stagedsync/execution_engine.hpp>
3636

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/*
2+
Copyright 2022 The Silkworm Authors
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
#include "backend_kv_server.hpp"
18+
19+
#include <silkworm/infra/concurrency/task.hpp>
20+
21+
#include <silkworm/infra/common/log.hpp>
22+
#include <silkworm/node/remote/ethbackend/grpc/server/backend_calls.hpp>
23+
#include <silkworm/node/remote/kv/grpc/server/kv_calls.hpp>
24+
25+
namespace silkworm::rpc {
26+
27+
BackEndKvServer::BackEndKvServer(const ServerSettings& settings, const EthereumBackEnd& backend)
28+
: Server(settings),
29+
BackEndServer(settings, backend),
30+
KvServer(settings, backend.chaindata_env(), backend.state_change_source()) {
31+
}
32+
33+
// Register the gRPC services: they must exist for the lifetime of the server built by builder.
34+
void BackEndKvServer::register_async_services(grpc::ServerBuilder& builder) {
35+
BackEndServer::register_async_services(builder);
36+
KvServer::register_async_services(builder);
37+
}
38+
39+
// Start server-side RPC requests as required by gRPC async model: one RPC per type is requested in advance.
40+
void BackEndKvServer::register_request_calls() {
41+
BackEndServer::register_request_calls();
42+
KvServer::register_request_calls();
43+
}
44+
45+
} // namespace silkworm::rpc
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
Copyright 2022 The Silkworm Authors
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
#pragma once
18+
19+
#include <silkworm/core/chain/config.hpp>
20+
#include <silkworm/node/backend/ethereum_backend.hpp>
21+
#include <silkworm/node/remote/ethbackend/grpc/server/backend_server.hpp>
22+
#include <silkworm/node/remote/kv/grpc/server/kv_server.hpp>
23+
24+
namespace silkworm::rpc {
25+
26+
class BackEndKvServer : public BackEndServer, public KvServer {
27+
public:
28+
BackEndKvServer(const ServerSettings& settings, const EthereumBackEnd& backend);
29+
30+
BackEndKvServer(const BackEndKvServer&) = delete;
31+
BackEndKvServer& operator=(const BackEndKvServer&) = delete;
32+
33+
protected:
34+
void register_async_services(grpc::ServerBuilder& builder) override;
35+
void register_request_calls() override;
36+
};
37+
38+
} // namespace silkworm::rpc

silkworm/node/remote/kv/grpc/server/backend_kv_server.cpp renamed to silkworm/node/remote/ethbackend/grpc/server/backend_server.cpp

Lines changed: 7 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -14,38 +14,35 @@
1414
limitations under the License.
1515
*/
1616

17-
#include "backend_kv_server.hpp"
17+
#include "backend_server.hpp"
1818

1919
#include <silkworm/infra/concurrency/task.hpp>
2020

2121
#include <silkworm/infra/common/log.hpp>
2222
#include <silkworm/node/remote/ethbackend/grpc/server/backend_calls.hpp>
23-
#include <silkworm/node/remote/kv/grpc/server/kv_calls.hpp>
2423

2524
namespace silkworm::rpc {
2625

27-
BackEndKvServer::BackEndKvServer(const ServerSettings& settings, const EthereumBackEnd& backend)
26+
BackEndServer::BackEndServer(const ServerSettings& settings, const EthereumBackEnd& backend)
2827
: Server(settings), backend_(backend) {
2928
setup_backend_calls(backend);
30-
setup_kv_calls();
31-
SILK_INFO << "BackEndKvServer created listening on: " << settings.address_uri;
29+
SILK_INFO << "BackEndServer created listening on: " << settings.address_uri;
3230
}
3331

3432
// Register the gRPC services: they must exist for the lifetime of the server built by builder.
35-
void BackEndKvServer::register_async_services(grpc::ServerBuilder& builder) {
33+
void BackEndServer::register_async_services(grpc::ServerBuilder& builder) {
3634
builder.RegisterService(&backend_async_service_);
37-
builder.RegisterService(&kv_async_service_);
3835
}
3936

40-
void BackEndKvServer::setup_backend_calls(const EthereumBackEnd& backend) {
37+
void BackEndServer::setup_backend_calls(const EthereumBackEnd& backend) {
4138
EtherbaseCall::fill_predefined_reply(backend);
4239
NetVersionCall::fill_predefined_reply(backend);
4340
BackEndVersionCall::fill_predefined_reply();
4441
ProtocolVersionCall::fill_predefined_reply();
4542
ClientVersionCall::fill_predefined_reply(backend);
4643
}
4744

48-
void BackEndKvServer::register_backend_request_calls(agrpc::GrpcContext* grpc_context) {
45+
void BackEndServer::register_backend_request_calls(agrpc::GrpcContext* grpc_context) {
4946
SILK_TRACE << "BackEndService::register_backend_request_calls START";
5047
auto service = &backend_async_service_;
5148
auto& backend = backend_;
@@ -86,65 +83,15 @@ void BackEndKvServer::register_backend_request_calls(agrpc::GrpcContext* grpc_co
8683
SILK_TRACE << "BackEndService::register_backend_request_calls END";
8784
}
8885

89-
void BackEndKvServer::setup_kv_calls() {
90-
KvVersionCall::fill_predefined_reply();
91-
}
92-
93-
void BackEndKvServer::register_kv_request_calls(agrpc::GrpcContext* grpc_context) {
94-
SILK_TRACE << "BackEndKvServer::register_kv_request_calls START";
95-
auto service = &kv_async_service_;
96-
auto& backend = backend_;
97-
98-
// Register one requested call repeatedly for each RPC: asio-grpc will take care of re-registration on any incoming call
99-
request_repeatedly(*grpc_context, service, &remote::KV::AsyncService::RequestVersion,
100-
[&backend](auto&&... args) -> Task<void> { // NOLINT(cppcoreguidelines-avoid-capturing-lambda-coroutines)
101-
co_await KvVersionCall{std::forward<decltype(args)>(args)...}(backend);
102-
});
103-
request_repeatedly(*grpc_context, service, &remote::KV::AsyncService::RequestTx,
104-
[&backend, grpc_context](auto&&... args) -> Task<void> { // NOLINT(cppcoreguidelines-avoid-capturing-lambda-coroutines)
105-
co_await TxCall{*grpc_context, std::forward<decltype(args)>(args)...}(backend);
106-
});
107-
request_repeatedly(*grpc_context, service, &remote::KV::AsyncService::RequestStateChanges,
108-
[&backend](auto&&... args) -> Task<void> { // NOLINT(cppcoreguidelines-avoid-capturing-lambda-coroutines)
109-
co_await StateChangesCall{std::forward<decltype(args)>(args)...}(backend);
110-
});
111-
request_repeatedly(*grpc_context, service, &remote::KV::AsyncService::RequestSnapshots,
112-
[&backend](auto&&... args) -> Task<void> { // NOLINT(cppcoreguidelines-avoid-capturing-lambda-coroutines)
113-
co_await SnapshotsCall{std::forward<decltype(args)>(args)...}(backend);
114-
});
115-
request_repeatedly(*grpc_context, service, &remote::KV::AsyncService::RequestDomainGet,
116-
[&backend](auto&&... args) -> Task<void> { // NOLINT(cppcoreguidelines-avoid-capturing-lambda-coroutines)
117-
co_await DomainGetCall{std::forward<decltype(args)>(args)...}(backend);
118-
});
119-
request_repeatedly(*grpc_context, service, &remote::KV::AsyncService::RequestHistoryGet,
120-
[&backend](auto&&... args) -> Task<void> { // NOLINT(cppcoreguidelines-avoid-capturing-lambda-coroutines)
121-
co_await HistoryGetCall{std::forward<decltype(args)>(args)...}(backend);
122-
});
123-
request_repeatedly(*grpc_context, service, &remote::KV::AsyncService::RequestIndexRange,
124-
[&backend](auto&&... args) -> Task<void> { // NOLINT(cppcoreguidelines-avoid-capturing-lambda-coroutines)
125-
co_await IndexRangeCall{std::forward<decltype(args)>(args)...}(backend);
126-
});
127-
request_repeatedly(*grpc_context, service, &remote::KV::AsyncService::RequestHistoryRange,
128-
[&backend](auto&&... args) -> Task<void> { // NOLINT(cppcoreguidelines-avoid-capturing-lambda-coroutines)
129-
co_await HistoryRangeCall{std::forward<decltype(args)>(args)...}(backend);
130-
});
131-
request_repeatedly(*grpc_context, service, &remote::KV::AsyncService::RequestDomainRange,
132-
[&backend](auto&&... args) -> Task<void> { // NOLINT(cppcoreguidelines-avoid-capturing-lambda-coroutines)
133-
co_await DomainRangeCall{std::forward<decltype(args)>(args)...}(backend);
134-
});
135-
SILK_TRACE << "BackEndKvServer::register_kv_request_calls END";
136-
}
137-
13886
//! Start server-side RPC requests as required by gRPC async model: one RPC per type is requested in advance.
139-
void BackEndKvServer::register_request_calls() {
87+
void BackEndServer::register_request_calls() {
14088
// Start all server-side RPC requests for each available server context
14189
for (std::size_t i = 0; i < num_contexts(); i++) {
14290
const auto& context = next_context();
14391
auto grpc_context = context.server_grpc_context();
14492

14593
// Register initial requested calls for ETHBACKEND and KV services
14694
register_backend_request_calls(grpc_context);
147-
register_kv_request_calls(grpc_context);
14895
}
14996
}
15097

silkworm/node/remote/kv/grpc/server/backend_kv_server.hpp renamed to silkworm/node/remote/ethbackend/grpc/server/backend_server.hpp

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,16 @@
2222
#include <silkworm/core/chain/config.hpp>
2323
#include <silkworm/infra/grpc/server/server.hpp>
2424
#include <silkworm/interfaces/remote/ethbackend.grpc.pb.h>
25-
#include <silkworm/interfaces/remote/kv.grpc.pb.h>
2625
#include <silkworm/node/backend/ethereum_backend.hpp>
2726

2827
namespace silkworm::rpc {
2928

30-
class BackEndKvServer : public Server {
29+
class BackEndServer : public virtual Server {
3130
public:
32-
BackEndKvServer(const ServerSettings& settings, const EthereumBackEnd& backend);
31+
BackEndServer(const ServerSettings& settings, const EthereumBackEnd& backend);
3332

34-
BackEndKvServer(const BackEndKvServer&) = delete;
35-
BackEndKvServer& operator=(const BackEndKvServer&) = delete;
33+
BackEndServer(const BackEndServer&) = delete;
34+
BackEndServer& operator=(const BackEndServer&) = delete;
3635

3736
protected:
3837
void register_async_services(grpc::ServerBuilder& builder) override;
@@ -42,17 +41,11 @@ class BackEndKvServer : public Server {
4241
static void setup_backend_calls(const EthereumBackEnd& backend);
4342
void register_backend_request_calls(agrpc::GrpcContext* grpc_context);
4443

45-
static void setup_kv_calls();
46-
void register_kv_request_calls(agrpc::GrpcContext* grpc_context);
47-
4844
//! The Ethereum full node service.
4945
const EthereumBackEnd& backend_;
5046

5147
//! \warning The gRPC service must exist for the lifetime of the gRPC server it is registered on.
5248
remote::ETHBACKEND::AsyncService backend_async_service_;
53-
54-
//! \warning The gRPC service must exist for the lifetime of the gRPC server it is registered on.
55-
remote::KV::AsyncService kv_async_service_;
5649
};
5750

5851
} // namespace silkworm::rpc

0 commit comments

Comments
 (0)