limit engine-api info logging (#4156)

* limit engine-api info logging
* use a common constant for engine api logging threshold

Signed-off-by: garyschulte <garyschulte@gmail.com>
pull/4175/head
garyschulte 2 years ago committed by GitHub
parent 01d077bd65
commit eabbea604d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/ExecutionEngineJsonRpcMethod.java
  2. 20
      ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineForkchoiceUpdated.java
  3. 33
      ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayload.java

@ -37,6 +37,7 @@ public abstract class ExecutionEngineJsonRpcMethod implements JsonRpcMethod {
INVALID_BLOCK_HASH; INVALID_BLOCK_HASH;
} }
public static final long ENGINE_API_LOGGING_THRESHOLD = 60000L;
private final Vertx syncVertx; private final Vertx syncVertx;
private static final Logger LOG = LoggerFactory.getLogger(ExecutionEngineJsonRpcMethod.class); private static final Logger LOG = LoggerFactory.getLogger(ExecutionEngineJsonRpcMethod.class);
protected final MergeContext mergeContext; protected final MergeContext mergeContext;

@ -257,18 +257,26 @@ public class EngineForkchoiceUpdated extends ExecutionEngineJsonRpcMethod {
private JsonRpcResponse syncingResponse( private JsonRpcResponse syncingResponse(
final Object requestId, final EngineForkchoiceUpdatedParameter forkChoice) { final Object requestId, final EngineForkchoiceUpdatedParameter forkChoice) {
logForkchoiceUpdatedCall(SYNCING, forkChoice); logForkchoiceUpdatedCall(SYNCING, forkChoice);
return new JsonRpcSuccessResponse( return new JsonRpcSuccessResponse(
requestId, new EngineUpdateForkchoiceResult(SYNCING, null, null, Optional.empty())); requestId, new EngineUpdateForkchoiceResult(SYNCING, null, null, Optional.empty()));
} }
// fcU calls are synchronous, no need to make volatile
private long lastFcuInfoLog = System.currentTimeMillis();
private void logForkchoiceUpdatedCall( private void logForkchoiceUpdatedCall(
final EngineStatus status, final EngineForkchoiceUpdatedParameter forkChoice) { final EngineStatus status, final EngineForkchoiceUpdatedParameter forkChoice) {
LOG.info( // cheaply limit the noise of fcU during consensus client syncing to once a minute:
"{} for fork-choice-update: head: {}, finalized: {}, safeBlockHash: {}", if (lastFcuInfoLog + ENGINE_API_LOGGING_THRESHOLD < System.currentTimeMillis()) {
status.name(), lastFcuInfoLog = System.currentTimeMillis();
forkChoice.getHeadBlockHash(), LOG.info(
forkChoice.getFinalizedBlockHash(), "{} for fork-choice-update: head: {}, finalized: {}, safeBlockHash: {}",
forkChoice.getSafeBlockHash()); status.name(),
forkChoice.getHeadBlockHash(),
forkChoice.getFinalizedBlockHash(),
forkChoice.getSafeBlockHash());
}
} }
} }

@ -19,8 +19,9 @@ import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.Executi
import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.ExecutionEngineJsonRpcMethod.EngineStatus.INVALID_BLOCK_HASH; import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.ExecutionEngineJsonRpcMethod.EngineStatus.INVALID_BLOCK_HASH;
import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.ExecutionEngineJsonRpcMethod.EngineStatus.SYNCING; import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.ExecutionEngineJsonRpcMethod.EngineStatus.SYNCING;
import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.ExecutionEngineJsonRpcMethod.EngineStatus.VALID; import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.ExecutionEngineJsonRpcMethod.EngineStatus.VALID;
import static org.hyperledger.besu.util.Slf4jLambdaHelper.infoLambda; import static org.hyperledger.besu.util.Slf4jLambdaHelper.debugLambda;
import static org.hyperledger.besu.util.Slf4jLambdaHelper.traceLambda; import static org.hyperledger.besu.util.Slf4jLambdaHelper.traceLambda;
import static org.hyperledger.besu.util.Slf4jLambdaHelper.warnLambda;
import org.hyperledger.besu.consensus.merge.blockcreation.MergeMiningCoordinator; import org.hyperledger.besu.consensus.merge.blockcreation.MergeMiningCoordinator;
import org.hyperledger.besu.datatypes.Hash; import org.hyperledger.besu.datatypes.Hash;
@ -155,7 +156,6 @@ public class EngineNewPayload extends ExecutionEngineJsonRpcMethod {
protocolContext.getBlockchain().getBlockHeader(blockParam.getParentHash()); protocolContext.getBlockchain().getBlockHeader(blockParam.getParentHash());
if (parentHeader.isPresent() if (parentHeader.isPresent()
&& (blockParam.getTimestamp() <= parentHeader.get().getTimestamp())) { && (blockParam.getTimestamp() <= parentHeader.get().getTimestamp())) {
LOG.info("method parameter timestamp not greater than parent");
return respondWithInvalid( return respondWithInvalid(
reqId, reqId,
blockParam, blockParam,
@ -167,7 +167,7 @@ public class EngineNewPayload extends ExecutionEngineJsonRpcMethod {
new Block(newBlockHeader, new BlockBody(transactions, Collections.emptyList())); new Block(newBlockHeader, new BlockBody(transactions, Collections.emptyList()));
if (mergeContext.isSyncing() || parentHeader.isEmpty()) { if (mergeContext.isSyncing() || parentHeader.isEmpty()) {
LOG.info( LOG.debug(
"isSyncing: {} parentHeaderMissing: {}, adding {} to backwardsync", "isSyncing: {} parentHeaderMissing: {}, adding {} to backwardsync",
mergeContext.isSyncing(), mergeContext.isSyncing(),
parentHeader.isEmpty(), parentHeader.isEmpty(),
@ -185,7 +185,6 @@ public class EngineNewPayload extends ExecutionEngineJsonRpcMethod {
// TODO: post-merge cleanup // TODO: post-merge cleanup
if (!mergeCoordinator.latestValidAncestorDescendsFromTerminal(newBlockHeader)) { if (!mergeCoordinator.latestValidAncestorDescendsFromTerminal(newBlockHeader)) {
LOG.warn("payload did not descend from terminal: {}", newBlockHeader.toLogString());
mergeCoordinator.addBadBlock(block); mergeCoordinator.addBadBlock(block);
return respondWithInvalid( return respondWithInvalid(
reqId, reqId,
@ -217,7 +216,7 @@ public class EngineNewPayload extends ExecutionEngineJsonRpcMethod {
final EnginePayloadParameter param, final EnginePayloadParameter param,
final Hash latestValidHash, final Hash latestValidHash,
final EngineStatus status) { final EngineStatus status) {
infoLambda( debugLambda(
LOG, LOG,
"New payload: number: {}, hash: {}, parentHash: {}, latestValidHash: {}, status: {}", "New payload: number: {}, hash: {}, parentHash: {}, latestValidHash: {}, status: {}",
() -> param.getBlockNumber(), () -> param.getBlockNumber(),
@ -229,20 +228,26 @@ public class EngineNewPayload extends ExecutionEngineJsonRpcMethod {
requestId, new EnginePayloadStatusResult(status, latestValidHash, Optional.empty())); requestId, new EnginePayloadStatusResult(status, latestValidHash, Optional.empty()));
} }
// engine api calls are synchronous, no need for volatile
private long lastInvalidWarn = System.currentTimeMillis();
JsonRpcResponse respondWithInvalid( JsonRpcResponse respondWithInvalid(
final Object requestId, final Object requestId,
final EnginePayloadParameter param, final EnginePayloadParameter param,
final Hash latestValidHash, final Hash latestValidHash,
final String validationError) { final String validationError) {
infoLambda( if (lastInvalidWarn + ENGINE_API_LOGGING_THRESHOLD < System.currentTimeMillis()) {
LOG, lastInvalidWarn = System.currentTimeMillis();
"Invalid new payload: number: {}, hash: {}, parentHash: {}, latestValidHash: {}, status: {}, validationError: {}", warnLambda(
() -> param.getBlockNumber(), LOG,
() -> param.getBlockHash(), "Invalid new payload: number: {}, hash: {}, parentHash: {}, latestValidHash: {}, status: {}, validationError: {}",
() -> param.getParentHash(), () -> param.getBlockNumber(),
() -> latestValidHash == null ? null : latestValidHash.toHexString(), () -> param.getBlockHash(),
INVALID::name, () -> param.getParentHash(),
() -> validationError); () -> latestValidHash == null ? null : latestValidHash.toHexString(),
INVALID::name,
() -> validationError);
}
return new JsonRpcSuccessResponse( return new JsonRpcSuccessResponse(
requestId, requestId,
new EnginePayloadStatusResult(INVALID, latestValidHash, Optional.of(validationError))); new EnginePayloadStatusResult(INVALID, latestValidHash, Optional.of(validationError)));

Loading…
Cancel
Save