Fix grpc head reconnection

This commit is contained in:
a10zn8
2022-12-15 14:14:15 +04:00
parent 98e20d08be
commit 0d5aab7e8f
2 changed files with 12 additions and 13 deletions

View File

@@ -29,7 +29,7 @@ import org.reactivestreams.Publisher
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import reactor.core.Disposable import reactor.core.Disposable
import reactor.core.publisher.Flux import reactor.core.publisher.Flux
import reactor.util.retry.Retry import reactor.core.publisher.Mono
import java.time.Duration import java.time.Duration
import java.util.function.Function import java.util.function.Function
@@ -62,22 +62,19 @@ class GrpcHead(
stop() stop()
} }
log.debug("Start Head subscription to ${parent.getId()}") log.debug("Start Head subscription to ${parent.getId()}")
internalStart(subscribeHead(remote))
val source = Flux.just(remote).flatMap(this::subscribeHead)
internalStart(source)
} }
fun subscribeHead(client: ReactorBlockchainGrpc.ReactorBlockchainStub): Publisher<BlockchainOuterClass.ChainHead> { fun subscribeHead(client: ReactorBlockchainGrpc.ReactorBlockchainStub): Flux<BlockchainOuterClass.ChainHead> {
val chainRef = Common.Chain.newBuilder() val chainRef = Common.Chain.newBuilder()
.setTypeValue(chain.id) .setTypeValue(chain.id)
.build() .build()
return client.subscribeHead(chainRef)
.doOnError { return Flux.concat(
log.error("subscribeHead err: ${it.message}", it) Mono.just(remote),
parent.setStatus(UpstreamAvailability.UNAVAILABLE) Mono.just(remote).repeat().delayElements(Duration.ofSeconds(1))
} )
// now we are making retries only here .flatMap { it.subscribeHead(chainRef) }
.retryWhen(Retry.backoff(Long.MAX_VALUE, Duration.ofSeconds(1)))
.doFinally { log.warn("Head subscription finished: $it") } .doFinally { log.warn("Head subscription finished: $it") }
} }
@@ -89,12 +86,14 @@ class GrpcHead(
.distinctUntilChanged { .distinctUntilChanged {
it.hash it.hash
}.filter { forkChoice.filter(it) } }.filter { forkChoice.filter(it) }
if (enhancer != null) { if (enhancer != null) {
blocks = blocks.flatMap(enhancer) blocks = blocks.flatMap(enhancer)
} }
blocks = blocks.onErrorContinue { err, _ -> blocks = blocks.onErrorContinue { err, _ ->
log.error("Head subscription error. ${err.javaClass.name}:${err.message}", err) log.error("Head subscription error. ${err.javaClass.name}:${err.message}", err)
parent.setStatus(UpstreamAvailability.UNAVAILABLE)
}.doOnNext { }.doOnNext {
log.info("Received block ${it.height}") log.info("Received block ${it.height}")
} }

View File

@@ -88,7 +88,7 @@ class GrpcUpstreams(
val statusSubscription = AtomicReference<Disposable>() val statusSubscription = AtomicReference<Disposable>()
val updates = Flux.interval(Duration.ZERO, Duration.ofMinutes(1)) val updates = Flux.interval(Duration.ZERO, Duration.ofSeconds(20))
.flatMap { .flatMap {
client.describe(BlockchainOuterClass.DescribeRequest.newBuilder().build()) client.describe(BlockchainOuterClass.DescribeRequest.newBuilder().build())
}.onErrorContinue { t, _ -> }.onErrorContinue { t, _ ->