소스 검색

Update global checkpoint with permit after recovery

After recovery completes from a primary, we now update the local
knowledge on the primary of the global checkpoint on the recovery
target. However if this occurs concurrently with a relocation, an
assertion could trip that we are no longer in primary mode. As this
local knowledge should only be tracked when we are in primary mode,
updating this local knowledge should be done under a permit. This commit
causes that to be the case.

Relates #26666
Jason Tedor 8 년 전
부모
커밋
23093adcb9
1개의 변경된 파일1개의 추가작업 그리고 1개의 파일을 삭제
  1. 1 1
      core/src/main/java/org/elasticsearch/indices/recovery/RecoverySourceHandler.java

+ 1 - 1
core/src/main/java/org/elasticsearch/indices/recovery/RecoverySourceHandler.java

@@ -477,7 +477,7 @@ public class RecoverySourceHandler {
         runUnderPrimaryPermit(() -> shard.markAllocationIdAsInSync(request.targetAllocationId(), targetLocalCheckpoint));
         final long globalCheckpoint = shard.getGlobalCheckpoint();
         cancellableThreads.execute(() -> recoveryTarget.finalizeRecovery(globalCheckpoint));
-        shard.updateGlobalCheckpointForShard(request.targetAllocationId(), globalCheckpoint);
+        runUnderPrimaryPermit(() -> shard.updateGlobalCheckpointForShard(request.targetAllocationId(), globalCheckpoint));
 
         if (request.isPrimaryRelocation()) {
             logger.trace("performing relocation hand-off");