log for extradata

This commit is contained in:
a10zn8
2023-08-08 14:20:20 +03:00
parent bda1dabdf0
commit cea58efd9b
4 changed files with 47 additions and 9 deletions

View File

@@ -21,8 +21,6 @@ import java.util.Objects;
@JsonSerialize(using = BlockJsonSerializer.class)
public class BlockJson<T extends TransactionRefJson> implements Serializable {
//TODO nonce or sealFields
/**
* the block number. null when its pending block.
*/
@@ -240,11 +238,11 @@ public class BlockJson<T extends TransactionRefJson> implements Serializable {
}
public HexData getExtraData() {
if (extraData != null) {
return extraData;
} else {
return HexData.empty();
}
return Objects.requireNonNullElseGet(extraData, HexData::empty);
}
public boolean checkExtraData() {
return extraData != null;
}
public void setExtraData(HexData extraData) {

View File

@@ -0,0 +1,25 @@
package io.emeraldpay.dshackle
import com.github.benmanes.caffeine.cache.Caffeine
import org.slf4j.Logger
import java.time.Duration
class ThrottledLogger {
companion object {
private val cache = Caffeine.newBuilder()
.expireAfterWrite(Duration.ofMinutes(1))
.build<String, Boolean>()
fun log(log: Logger, msg: String) {
log(log, msg, msg)
}
fun log(log: Logger, category: String, msg: String) {
if (cache.getIfPresent(category) == null) {
log.warn(msg)
cache.put(category, true)
}
}
}
}

View File

@@ -3,6 +3,7 @@ package io.emeraldpay.dshackle.upstream.ethereum
import com.fasterxml.jackson.databind.ObjectMapper
import io.emeraldpay.dshackle.Defaults
import io.emeraldpay.dshackle.Global
import io.emeraldpay.dshackle.ThrottledLogger
import io.emeraldpay.dshackle.cache.Caches
import io.emeraldpay.dshackle.cache.CurrentBlockCache
import io.emeraldpay.dshackle.data.BlockContainer
@@ -160,6 +161,9 @@ class EthereumDirectReader(
.retryWhen(Retry.fixedDelay(3, Duration.ofMillis(200)))
.flatMap { result ->
val block = objectMapper.readValue(result.data, BlockJson::class.java) as BlockJson<TransactionRefJson>?
if (block?.checkExtraData() == false) {
ThrottledLogger.log(log, "${up.getId()} recieved block with empty extradata from direct reader")
}
if (block == null) {
Mono.empty()
} else {

View File

@@ -18,6 +18,7 @@ package io.emeraldpay.dshackle.upstream.ethereum
import io.emeraldpay.dshackle.Global
import io.emeraldpay.dshackle.SilentException
import io.emeraldpay.dshackle.ThrottledLogger
import io.emeraldpay.dshackle.data.BlockContainer
import io.emeraldpay.dshackle.reader.JsonRpcReader
import io.emeraldpay.dshackle.reader.Reader
@@ -89,7 +90,11 @@ class EthereumWsHead(
fun listenNewHeads(): Flux<BlockContainer> {
return subscribe()
.map {
Global.objectMapper.readValue(it, BlockJson::class.java) as BlockJson<TransactionRefJson>
val block = Global.objectMapper.readValue(it, BlockJson::class.java) as BlockJson<TransactionRefJson>
if (!block.checkExtraData() && skipEnhance) {
ThrottledLogger.log(log, "$upstreamId recieved block with empty extradata through ws subscription")
}
return@map block
}
.flatMap { block ->
// newHeads returns incomplete blocks, i.e. without some fields and without transaction hashes,
@@ -115,7 +120,13 @@ class EthereumWsHead(
}
}
.flatMap(JsonRpcResponse::requireResult)
.map { BlockContainer.fromEthereumJson(it, upstreamId) }
.map {
val parsedBlock = BlockContainer.fromEthereumJson(it, upstreamId)
if (parsedBlock.parsed is BlockJson<*> && !parsedBlock.parsed.checkExtraData() && !skipEnhance) {
ThrottledLogger.log(log, "$upstreamId recieved block with empty extradata from block enrichment")
}
return@map parsedBlock
}
}
},
headScheduler