-
Notifications
You must be signed in to change notification settings - Fork 179
feat: Http2ClientProtocolConfig and GrpcClientProtocolConfig in internal proto #21785
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from 5 commits
72816cc
1499a8e
876ae4e
6a2a22d
f8552a9
34cdc3c
23d876e
e8aea24
333cc5e
4082270
938f016
53248c9
d6b6b36
a60f194
edf6e63
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -25,6 +25,8 @@ | |
| import com.hedera.pbj.runtime.io.buffer.Bytes; | ||
| import edu.umd.cs.findbugs.annotations.NonNull; | ||
| import edu.umd.cs.findbugs.annotations.Nullable; | ||
| import io.helidon.webclient.grpc.GrpcClientProtocolConfig; | ||
| import io.helidon.webclient.http2.Http2ClientProtocolConfig; | ||
| import java.io.IOException; | ||
| import java.io.UncheckedIOException; | ||
| import java.net.InetAddress; | ||
|
|
@@ -39,6 +41,7 @@ | |
| import java.nio.file.WatchService; | ||
| import java.time.Duration; | ||
| import java.time.Instant; | ||
| import java.time.format.DateTimeParseException; | ||
| import java.util.ArrayList; | ||
| import java.util.Iterator; | ||
| import java.util.List; | ||
|
|
@@ -110,6 +113,9 @@ public class BlockNodeConnectionManager { | |
| * startup from the configuration file(s) on disk. | ||
| */ | ||
| private final List<BlockNodeConfig> availableBlockNodes = new ArrayList<>(); | ||
|
|
||
| private Map<BlockNodeConfig, Http2ClientProtocolConfig> http2ClientProtocolConfigs = new ConcurrentHashMap<>(); | ||
|
||
| private Map<BlockNodeConfig, GrpcClientProtocolConfig> grpcClientProtocolConfigs = new ConcurrentHashMap<>(); | ||
| /** | ||
| * Flag that indicates if this connection manager is active or not. In this case, being active means it is actively | ||
| * processing blocks and attempting to send them to a block node. | ||
|
|
@@ -298,11 +304,9 @@ private List<BlockNodeConfig> extractBlockNodesConfigurations(@NonNull final Str | |
|
|
||
| final byte[] jsonConfig = Files.readAllBytes(configPath); | ||
| final BlockNodeConnectionInfo protoConfig = BlockNodeConnectionInfo.JSON.parse(Bytes.wrap(jsonConfig)); | ||
|
|
||
| // Convert proto config to internal config objects | ||
| return protoConfig.nodes().stream() | ||
| .map(node -> new BlockNodeConfig(node.address(), node.port(), node.priority())) | ||
| .toList(); | ||
| extractOptionalHttp2ClientProtocolConfig(protoConfig); | ||
| extractOptionalGrpcClientProtocolConfig(protoConfig); | ||
| return protoConfig.nodes(); | ||
| } catch (final IOException | ParseException e) { | ||
| logWithContext( | ||
| logger, | ||
|
|
@@ -314,6 +318,97 @@ private List<BlockNodeConfig> extractBlockNodesConfigurations(@NonNull final Str | |
| } | ||
| } | ||
|
|
||
| private void extractOptionalHttp2ClientProtocolConfig(BlockNodeConnectionInfo protoConfig) { | ||
| for (BlockNodeConfig config : protoConfig.nodes()) { | ||
| if (config.hasHttp2ClientProtocolConfig()) { | ||
| com.hedera.node.internal.network.Http2ClientProtocolConfig protocolConfig = | ||
| config.http2ClientProtocolConfig(); | ||
| Http2ClientProtocolConfig.Builder builder = Http2ClientProtocolConfig.builder(); | ||
| if (protocolConfig != null) { | ||
| if (protocolConfig.flowControlBlockTimeout() != null) { | ||
| try { | ||
| Duration flowControlBlockTimeout = Duration.parse(protocolConfig.flowControlBlockTimeout()); | ||
| builder.flowControlBlockTimeout(flowControlBlockTimeout); | ||
| } catch (DateTimeParseException e) { | ||
| logger.info( | ||
| "Unable to parse Http2ClientProtocolConfig flowControlBlockTimeout: {}", | ||
| protocolConfig.flowControlBlockTimeout()); | ||
| } | ||
| } | ||
| if (protocolConfig.initialWindowSize() != null) { | ||
| builder.initialWindowSize(protocolConfig.initialWindowSize()); | ||
| } | ||
| if (protocolConfig.maxFrameSize() != null) { | ||
| builder.maxFrameSize(protocolConfig.maxFrameSize()); | ||
| } | ||
| if (protocolConfig.maxHeaderListSize() != null) { | ||
| builder.maxHeaderListSize(protocolConfig.maxHeaderListSize()); | ||
| } | ||
| if (protocolConfig.name() != null) { | ||
| builder.name(protocolConfig.name()); | ||
| } | ||
| if (protocolConfig.ping() != null) { | ||
| builder.ping(protocolConfig.ping()); | ||
| } | ||
| if (protocolConfig.pingTimeout() != null) { | ||
| try { | ||
| Duration pingTimeout = Duration.parse(protocolConfig.pingTimeout()); | ||
| builder.pingTimeout(pingTimeout); | ||
| } catch (DateTimeParseException e) { | ||
| logger.info( | ||
| "Unable to parse Http2ClientProtocolConfig pingTimeout: {}", | ||
| protocolConfig.pingTimeout()); | ||
| } | ||
| } | ||
| if (protocolConfig.priorKnowledge() != null) { | ||
| builder.priorKnowledge(protocolConfig.priorKnowledge()); | ||
| } | ||
| } | ||
| http2ClientProtocolConfigs.put(config, builder.build()); | ||
| } | ||
| } | ||
| } | ||
|
|
||
| private void extractOptionalGrpcClientProtocolConfig(BlockNodeConnectionInfo protoConfig) { | ||
| for (BlockNodeConfig config : protoConfig.nodes()) { | ||
| if (config.hasGrpcClientProtocolConfig()) { | ||
| com.hedera.node.internal.network.GrpcClientProtocolConfig protocolConfig = | ||
| config.grpcClientProtocolConfig(); | ||
| GrpcClientProtocolConfig.Builder builder = GrpcClientProtocolConfig.builder(); | ||
| if (protocolConfig != null) { | ||
| if (protocolConfig.abortPollTimeExpired() != null) { | ||
| builder.abortPollTimeExpired(protocolConfig.abortPollTimeExpired()); | ||
| } | ||
| if (protocolConfig.heartbeatPeriod() != null) { | ||
| try { | ||
| builder.heartbeatPeriod(Duration.parse(protocolConfig.heartbeatPeriod())); | ||
| } catch (DateTimeParseException e) { | ||
| logger.info( | ||
| "Unable to parse GrpcClientProtocolConfig heartbeatPeriod: {}", | ||
| protocolConfig.heartbeatPeriod()); | ||
| } | ||
| } | ||
| if (protocolConfig.initBufferSize() != null) { | ||
| builder.initBufferSize(protocolConfig.initBufferSize()); | ||
| } | ||
| if (protocolConfig.name() != null) { | ||
| builder.name(protocolConfig.name()); | ||
| } | ||
| if (protocolConfig.pollWaitTime() != null) { | ||
| try { | ||
| builder.pollWaitTime(Duration.parse(protocolConfig.pollWaitTime())); | ||
| } catch (DateTimeParseException e) { | ||
| logger.info( | ||
| "Unable to parse GrpcClientProtocolConfig pollWaitTime: {}", | ||
| protocolConfig.pollWaitTime()); | ||
| } | ||
| } | ||
| } | ||
| grpcClientProtocolConfigs.put(config, builder.build()); | ||
| } | ||
| } | ||
| } | ||
|
|
||
| /** | ||
| * Checks if there is only one block node configured. | ||
| * @return whether there is only one block node configured | ||
|
|
@@ -516,6 +611,8 @@ private void clearManagerMetadata() { | |
| activeConnectionRef.set(null); | ||
| nodeStats.clear(); | ||
| availableBlockNodes.clear(); | ||
| http2ClientProtocolConfigs.clear(); | ||
| grpcClientProtocolConfigs.clear(); | ||
| } | ||
|
|
||
| private void closeAllConnections() { | ||
|
|
@@ -1433,4 +1530,20 @@ public BlockNodeStats.HighLatencyResult recordBlockAckAndCheckLatency( | |
|
|
||
| return result; | ||
| } | ||
|
|
||
| /** | ||
| * Gets the HTTP/2 client protocol configurations for all block nodes. | ||
| * @return a map of BlockNodeConfig to Http2ClientProtocolConfig | ||
| */ | ||
| public Map<BlockNodeConfig, Http2ClientProtocolConfig> getHttp2ClientProtocolConfigs() { | ||
| return http2ClientProtocolConfigs; | ||
| } | ||
|
|
||
| /** | ||
| * Gets the gRPC client protocol configurations for all block nodes. | ||
| * @return a map of BlockNodeConfig to GrpcClientProtocolConfig | ||
| */ | ||
| public Map<BlockNodeConfig, GrpcClientProtocolConfig> getGrpcClientProtocolConfigs() { | ||
| return grpcClientProtocolConfigs; | ||
| } | ||
| } | ||
Uh oh!
There was an error while loading. Please reload this page.