Skip to content

Commit

Permalink
Merge branch 'main' into 281-new-blockwriter-implementation-for-block…
Browse files Browse the repository at this point in the history
…-as-file
  • Loading branch information
ata-nas committed Nov 28, 2024
2 parents 3c8139d + c0ee61f commit 6e1090b
Show file tree
Hide file tree
Showing 12 changed files with 220 additions and 12 deletions.
7 changes: 7 additions & 0 deletions charts/hedera-block-node/templates/deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,13 @@ spec:
name: {{ include "hedera-block-node.fullname" . }}-config
- secretRef:
name: {{ include "hedera-block-node.fullname" . }}-secret
resources:
requests:
memory: {{ .Values.blockNode.resources.requests.memory }}
cpu: {{ .Values.blockNode.resources.requests.cpu }}
limits:
memory: {{ .Values.blockNode.resources.limits.memory }}
cpu: {{ .Values.blockNode.resources.limits.cpu }}
livenessProbe:
httpGet:
path: {{ .Values.blockNode.health.liveness.endpoint }}
Expand Down
7 changes: 7 additions & 0 deletions charts/hedera-block-node/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,13 @@ blockNode:
endpoint: "/healthz/livez"
metrics:
port: 9999
resources:
limits:
cpu: "8"
memory: "16Gi"
requests:
cpu: "2"
memory: "8Gi"

kubepromstack:
enabled: true
Expand Down
2 changes: 2 additions & 0 deletions server/docs/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,5 @@ defaults and can be left unchanged. It is recommended to browse the properties b
| SERVICE_DELAY_MILLIS | Service shutdown delay in milliseconds | 500 |
| MEDIATOR_RING_BUFFER_SIZE | Size of the ring buffer used by the mediator (must be a power of 2) | 67108864 |
| NOTIFIER_RING_BUFFER_SIZE | Size of the ring buffer used by the notifier (must be a power of 2) | 2048 |
| SERVER_PORT | The port the server will listen on | 8080 |
| SERVER_MAX_MESSAGE_SIZE_BYTES | The maximum size of a message frame in bytes | 1048576 |
10 changes: 7 additions & 3 deletions server/src/main/java/com/hedera/block/server/BlockNodeApp.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ public class BlockNodeApp {
private final WebServerConfig.Builder webServerBuilder;
private final PbjBlockStreamService pbjBlockStreamService;
private final PbjBlockAccessService pbjBlockAccessService;
private final ServerConfig serverConfig;

/**
* Constructs a new BlockNodeApp with the specified dependencies.
Expand All @@ -57,19 +58,22 @@ public class BlockNodeApp {
* @param pbjBlockStreamService defines the Block Stream services
* @param pbjBlockAccessService defines the Block Access services
* @param webServerBuilder used to build the web server and start it
* @param serverConfig has the server configuration
*/
@Inject
public BlockNodeApp(
@NonNull ServiceStatus serviceStatus,
@NonNull HealthService healthService,
@NonNull PbjBlockStreamService pbjBlockStreamService,
@NonNull PbjBlockAccessService pbjBlockAccessService,
@NonNull WebServerConfig.Builder webServerBuilder) {
@NonNull WebServerConfig.Builder webServerBuilder,
@NonNull ServerConfig serverConfig) {
this.serviceStatus = serviceStatus;
this.healthService = healthService;
this.pbjBlockStreamService = pbjBlockStreamService;
this.pbjBlockAccessService = pbjBlockAccessService;
this.webServerBuilder = webServerBuilder;
this.serverConfig = serverConfig;
}

/**
Expand All @@ -88,13 +92,13 @@ public void start() throws IOException {
// Override the default message size
final PbjConfig pbjConfig = PbjConfig.builder()
.name(PBJ_PROTOCOL_PROVIDER_CONFIG_NAME)
.maxMessageSizeBytes(1024 * 4096)
.maxMessageSizeBytes(serverConfig.maxMessageSizeBytes())
.build();

// Build the web server
// TODO: make port server a configurable value.
final WebServer webServer = webServerBuilder
.port(8080)
.port(serverConfig.port())
.addProtocol(pbjConfig)
.addRouting(pbjRouting)
.addRouting(httpRouting)
Expand Down
84 changes: 84 additions & 0 deletions server/src/main/java/com/hedera/block/server/ServerConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
/*
* Copyright (C) 2024 Hedera Hashgraph, LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.hedera.block.server;

import com.swirlds.config.api.ConfigData;
import com.swirlds.config.api.ConfigProperty;
import com.swirlds.config.api.validation.annotation.Max;
import com.swirlds.config.api.validation.annotation.Min;

/**
* Use this configuration across the server features
*
* <p>ServerConfig will have settings for the server.
*
* @param maxMessageSizeBytes the http2 max message/frame size in bytes
* @param port the port the server will listen on
*/
@ConfigData("server")
public record ServerConfig(
@ConfigProperty(defaultValue = defaultMaxMessageSizeBytes)
@Min(minMaxMessageSizeBytes)
@Max(maxMaxMessageSizeBytes)
int maxMessageSizeBytes,
@ConfigProperty(defaultValue = defaultPort) @Min(minPort) @Max(maxPort) int port) {
private static final System.Logger LOGGER = System.getLogger(ServerConfig.class.getName());

// Constants for maxMessageSizeBytes property
private static final String defaultMaxMessageSizeBytes = "4_194_304";
private static final long minMaxMessageSizeBytes = 10_240;
private static final long maxMaxMessageSizeBytes = 16_777_215;

// Constants for port property
private static final String defaultPort = "8080";
private static final int minPort = 1024;
private static final int maxPort = 65_535;

/**
* Validate the configuration.
*
* @throws IllegalArgumentException if the configuration is invalid
*/
public ServerConfig {

validateMaxMessageSizeBytes(maxMessageSizeBytes);
validatePort(port);

LOGGER.log(System.Logger.Level.INFO, "Server configuration server.maxMessageSizeBytes: " + maxMessageSizeBytes);
LOGGER.log(System.Logger.Level.INFO, "Server configuration server.port: " + port);
}

private void validatePort(int port) {
if (port < minPort) {
throw new IllegalArgumentException("port must be greater than " + minPort);
}

if (port > maxPort) {
throw new IllegalArgumentException("port must be less than " + maxPort);
}
}

private void validateMaxMessageSizeBytes(int maxMessageSizeBytes) {
if (maxMessageSizeBytes < minMaxMessageSizeBytes) {
throw new IllegalArgumentException("maxMessageSizeBytes must be greater than " + minMaxMessageSizeBytes);
}

if (maxMessageSizeBytes > maxMaxMessageSizeBytes) {
throw new IllegalArgumentException("maxMessageSizeBytes must be less than " + maxMaxMessageSizeBytes);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
package com.hedera.block.server.config;

import com.google.auto.service.AutoService;
import com.hedera.block.server.ServerConfig;
import com.hedera.block.server.consumer.ConsumerConfig;
import com.hedera.block.server.mediator.MediatorConfig;
import com.hedera.block.server.notifier.NotifierConfig;
Expand Down Expand Up @@ -54,6 +55,7 @@ public Set<Class<? extends Record>> getConfigDataTypes() {
PrometheusConfig.class,
ProducerConfig.class,
ConsumerConfig.class,
PersistenceStorageConfig.class);
PersistenceStorageConfig.class,
ServerConfig.class);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

package com.hedera.block.server.config;

import com.hedera.block.server.ServerConfig;
import com.hedera.block.server.consumer.ConsumerConfig;
import com.hedera.block.server.mediator.MediatorConfig;
import com.hedera.block.server.notifier.NotifierConfig;
Expand Down Expand Up @@ -118,4 +119,16 @@ static NotifierConfig provideNotifierConfig(Configuration configuration) {
static ProducerConfig provideProducerConfig(Configuration configuration) {
return configuration.getConfigData(ProducerConfig.class);
}

/**
* Provides a server configuration singleton using the configuration.
*
* @param configuration is the configuration singleton
* @return a server configuration singleton
*/
@Singleton
@Provides
static ServerConfig provideServerConfig(Configuration configuration) {
return configuration.getConfigData(ServerConfig.class);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,9 @@ public final class ServerMappedConfigSourceInitializer {
new ConfigMapping("persistence.storage.type", "PERSISTENCE_STORAGE_TYPE"),
new ConfigMapping("service.delayMillis", "SERVICE_DELAY_MILLIS"),
new ConfigMapping("mediator.ringBufferSize", "MEDIATOR_RING_BUFFER_SIZE"),
new ConfigMapping("notifier.ringBufferSize", "NOTIFIER_RING_BUFFER_SIZE"));
new ConfigMapping("notifier.ringBufferSize", "NOTIFIER_RING_BUFFER_SIZE"),
new ConfigMapping("server.maxMessageSizeBytes", "SERVER_MAX_MESSAGE_SIZE_BYTES"),
new ConfigMapping("server.port", "SERVER_PORT"));

private ServerMappedConfigSourceInitializer() {}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,18 +74,23 @@ class BlockNodeAppTest {
@Mock
private BlockNodeContext blockNodeContext;

ServerConfig serverConfig;

private BlockNodeApp blockNodeApp;

@BeforeEach
void setup() {

serverConfig = new ServerConfig(4_194_304, 8080);

blockNodeApp = new BlockNodeApp(
serviceStatus,
healthService,
new PbjBlockStreamServiceProxy(
liveStreamMediator, serviceStatus, blockNodeEventHandler, notifier, blockNodeContext),
new PbjBlockAccessServiceProxy(serviceStatus, blockReader, blockNodeContext),
webServerBuilder);
webServerBuilder,
serverConfig);

when(webServerBuilder.port(8080)).thenReturn(webServerBuilder);
when(webServerBuilder.addProtocol(any(PbjConfig.class))).thenReturn(webServerBuilder);
Expand Down
69 changes: 69 additions & 0 deletions server/src/test/java/com/hedera/block/server/ServerConfigTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
/*
* Copyright (C) 2024 Hedera Hashgraph, LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.hedera.block.server;

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

class ServerConfigTest {

@BeforeEach
void setUp() {}

@AfterEach
void tearDown() {}

@Test
void testValidValues() {

ServerConfig serverConfig = new ServerConfig(4_194_304, 8080);

assertEquals(4_194_304, serverConfig.maxMessageSizeBytes());
assertEquals(8080, serverConfig.port());
}

@Test
void testMessageSizeTooBig() {
assertThrows(IllegalArgumentException.class, () -> {
new ServerConfig(16_777_216, 8080);
});
}

@Test
void testMessageSizeTooSmall() {
assertThrows(IllegalArgumentException.class, () -> {
new ServerConfig(10_239, 8080);
});
}

@Test
void testPortValueTooBig() {
assertThrows(IllegalArgumentException.class, () -> {
new ServerConfig(4_194_304, 65_536);
});
}

@Test
void testPortValueTooSmall() {
assertThrows(IllegalArgumentException.class, () -> {
new ServerConfig(4_194_304, 1023);
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

import static org.junit.jupiter.api.Assertions.*;

import com.hedera.block.server.ServerConfig;
import com.hedera.block.server.consumer.ConsumerConfig;
import com.hedera.block.server.mediator.MediatorConfig;
import com.hedera.block.server.notifier.NotifierConfig;
Expand All @@ -36,12 +37,10 @@ void testProvidePersistenceStorageConfig() throws IOException {

BlockNodeContext context = TestConfigUtil.getTestBlockNodeContext();
Configuration configuration = context.configuration();
PersistenceStorageConfig persistenceStorageConfig =
configuration.getConfigData(PersistenceStorageConfig.class);
PersistenceStorageConfig persistenceStorageConfig = configuration.getConfigData(PersistenceStorageConfig.class);

// Call the method under test
PersistenceStorageConfig providedConfig =
ConfigInjectionModule.providePersistenceStorageConfig(configuration);
PersistenceStorageConfig providedConfig = ConfigInjectionModule.providePersistenceStorageConfig(configuration);

// Verify that the correct config data is returned
assertNotNull(providedConfig);
Expand Down Expand Up @@ -71,8 +70,7 @@ void testProvidePrometheusConfig() throws IOException {
PrometheusConfig prometheusConfig = configuration.getConfigData(PrometheusConfig.class);

// Call the method under test
PrometheusConfig providedConfig =
ConfigInjectionModule.providePrometheusConfig(configuration);
PrometheusConfig providedConfig = ConfigInjectionModule.providePrometheusConfig(configuration);

// Verify that the correct config data is returned
assertNotNull(providedConfig);
Expand Down Expand Up @@ -119,4 +117,17 @@ void testProvideNotifierConfig() throws IOException {
assertNotNull(providedConfig);
assertSame(notifierConfig, providedConfig);
}

@Test
void testServerConfig() throws IOException {
BlockNodeContext context = TestConfigUtil.getTestBlockNodeContext();
Configuration configuration = context.configuration();
ServerConfig serverConfig = configuration.getConfigData(ServerConfig.class);

ServerConfig providedConfig = ConfigInjectionModule.provideServerConfig(configuration);

// Verify the config
assertNotNull(providedConfig);
assertSame(serverConfig, providedConfig);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ class ServerMappedConfigSourceInitializerTest {
new ConfigMapping("service.delayMillis", "SERVICE_DELAY_MILLIS"),
new ConfigMapping("mediator.ringBufferSize", "MEDIATOR_RING_BUFFER_SIZE"),
new ConfigMapping("notifier.ringBufferSize", "NOTIFIER_RING_BUFFER_SIZE"),
new ConfigMapping("server.maxMessageSizeBytes", "SERVER_MAX_MESSAGE_SIZE_BYTES"),
new ConfigMapping("server.port", "SERVER_PORT"),
};
private static MappedConfigSource toTest;

Expand Down

0 comments on commit 6e1090b

Please sign in to comment.