Hazelcast OperationTimeoutException: не удалось завершить вызов GetOperation из-за тайм-аута операции heartbeat-timeout - PullRequest
0 голосов
/ 27 апреля 2020

Я использую Hazelcast 3.8.3. Иногда у меня возникает операция TimeoutException (GetOperation). У меня есть 4 узла в одном и том же кластере Hz.

Ошибка выброса приложения. Причина: java .util.concurrent.ExecutionException: com.hazelcast.core.OperationTimeoutException: не удалось завершить вызов GetOperation из-за операции -heartbeat-тайм-аут. Текущее время: 2020-04-23 19: 17: 37.414. Время начала: 2020-04-23 19: 14: 16.456. Общее прошедшее время: 200958 мс. Пульс последней операции: никогда. Пульс последней операции от участника: 2020-04-23 19: 16: 59.335. Invocation {op = com.hazelcast.map.impl.operation.GetOperation {serviceName = 'hz: impl: mapService', identityHash = 300649867, partitionId = 30, replicaIndex = 0, callId = -10707, invocationTime = 1587665497325 (2020-04 -23 19: 11: 37.325), waitTimeout = -1, callTimeout = 180000, name = ENRICHMENT-CACHE-DEFAULT}, tryCount = 250, tryPauseMillis = 500, invokeCount = 1, callTimeoutMillis = 180000, firstInvocationTimeMs = 1587665654456 2020-04-23 19: 14: 16.456 ', lastHeartbeatMillis = 0, lastHeartbeatTime =' 1970-01-01 01: 00: 00.000 ', цель = [10.195.40.212]: 5701, pendingResponse = {VOID}, backupsAcksExpected = 0 , backupsAcksReceived = 0, connection = Connection [id = 56, /10.195.40.210:5702->/10.195.40.212:60231, конечная точка = [10.195.40.212]: 5701, жив = true, тип = MEMBER]} в java .util.concurrent.FutureTask.report (Неизвестный источник) в java .util.concurrent.FutureTask.get (Неизвестный источник) в com.experian.eda.ea.core.enrichmentpack.MultiThreadEnrichmentPackManager.evaluateAllPreEnith hmentPackManager. java: 123) ... пропущено 90 общих кадров. Причина: com.hazelcast.core.OperationTimeoutException: не удалось завершить вызов GetOperation из-за тайм-аута операции heartbeat-timeout. Текущее время: 2020-04-23 19: 17: 37.414. Время начала: 2020-04-23 19: 14: 16.456. Общее прошедшее время: 200958 мс. Пульс последней операции: никогда. Пульс последней операции от участника: 2020-04-23 19: 16: 59.335. Invocation {op = com.hazelcast.map.impl.operation.GetOperation {serviceName = 'hz: impl: mapService', identityHash = 300649867, partitionId = 30, replicaIndex = 0, callId = -10707, invocationTime = 1587665497325 (2020-04 -23 19: 11: 37.325), waitTimeout = -1, callTimeout = 180000, name = ENRICHMENT-CACHE-DEFAULT}, tryCount = 250, tryPauseMillis = 500, invokeCount = 1, callTimeoutMillis = 180000, firstInvocationTimeMs = 1587665654456 2020-04-23 19: 14: 16.456 ', lastHeartbeatMillis = 0, lastHeartbeatTime =' 1970-01-01 01: 00: 00.000 ', цель = [10.195.40.212]: 5701, pendingResponse = {VOID}, backupsAcksExpected = 0 , backupsAcksReceived = 0, connection = Connection [id = 56, /10.195.40.210:5702->/10.195.40.212:60231, конечная точка = [10.195.40.212]: 5701, жив = true, тип = MEMBER]} в com. hazelcast.spi.impl.operationservice.impl.InvocationFuture.newOperationTimeoutException (InvocationFuture. java: 151) в com.hazelcast.spi.impl.operationservice.impl.InvocationFuture.resolve (InvocationFuture. java: 101 at). hazelcast.spi.impl.opera ionservice.impl.InvocationFuture.resolveAndThrowIfException (InvocationFuture. java: 75) по адресу com.hazelcast.spi.impl.AbstractInvocationFuture.get (AbstractInvocationFuture. java: 155) по адресу com.hazelcast.map.impap.Proxy.map.impap. invokeOperation (MapProxySupport. java: 373) в com.hazelcast.map.impl.proxy.MapProxySupport.getInternal (MapProxySupport. java: 304) в com.hazelcast.map.impl.proxy.MapProxyImpl.get (MapProxyImpl. java: 114)

Вот настройка, которую я использую.

<map name="ENRICHMENT-CACHE-*">
    <in-memory-format>BINARY</in-memory-format>
    <backup-count>0</backup-count>
    <max-idle-seconds>600</max-idle-seconds>
    <eviction-policy>LRU</eviction-policy>
    <max-size policy="PER_NODE">5000</max-size>
    <eviction-percentage>25</eviction-percentage>
</map>

<properties>
    <property name="hazelcast.logging.type">slf4j</property>
    <property name="hazelcast.client.invocation.timeout.seconds">360</property>
    <property name="hazelcast.operation.call.timeout.millis">180000</property>
</properties>

Я вижу, код написан таким образом.

@Override
public final V get() throws InterruptedException, ExecutionException {
    Object response = registerWaiter(Thread.currentThread(), null);
    if (response != VOID) {
        // no registration was done since a value is available.
        return resolveAndThrowIfException(response);
    }

    boolean interrupted = false;
    try {
        for (; ; ) {
            park();
            if (isDone()) {
                return resolveAndThrowIfException(state);
            } else if (Thread.interrupted()) {
                interrupted = true;
                onInterruptDetected();
            }
        }
    } finally {
        restoreInterrupt(interrupted);
    }
}

Текущий поток припаркован, ожидая прерывания. Может ли быть исключение тайм-аута сердцебиения, прервавшего поток и разбудившего его в ошибочном состоянии? Если да, поможет ли приращение hazelcast.max.no.heartbeat.seconds?

Если это не так, знаете ли вы, почему произошла ошибка и как ее устранить?

Спасибо.

С уважением, Хайрул

...