Browse Source

Only use IndexShard instance to lookup recovery status
make sure we use the instance itself to look it up, and not the shard id, as we might get another instance
leftover from #6825

Shay Banon 11 years ago
parent
commit
43a5cbe9be

+ 1 - 1
src/main/java/org/elasticsearch/action/admin/indices/recovery/TransportRecoveryAction.java

@@ -157,7 +157,7 @@ public class TransportRecoveryAction extends
         RecoveryStatus recoveryStatus = indexShard.recoveryStatus();
 
         if (recoveryStatus == null) {
-            recoveryStatus = recoveryTarget.recoveryStatus(indexShard.shardId());
+            recoveryStatus = recoveryTarget.recoveryStatus(indexShard);
         }
 
         if (recoveryStatus != null) {

+ 1 - 1
src/main/java/org/elasticsearch/indices/cluster/IndicesClusterStateService.java

@@ -544,7 +544,7 @@ public class IndicesClusterStateService extends AbstractLifecycleComponent<Indic
                     indexService.removeShard(shardRouting.id(), "removing shard (different instance of it allocated on this node)");
                 } else if (isPeerRecovery(shardRouting)) {
                     // check if there is an existing recovery going, and if so, and the source node is not the same, cancel the recovery to restart it
-                    RecoveryStatus recoveryStatus = recoveryTarget.recoveryStatus(indexShard.shardId());
+                    RecoveryStatus recoveryStatus = recoveryTarget.recoveryStatus(indexShard);
                     if (recoveryStatus != null && recoveryStatus.stage() != RecoveryState.Stage.DONE) {
                         // we have an ongoing recovery, find the source based on current routing and compare them
                         DiscoveryNode sourceNode = findSourceNodeForPeerRecovery(routingTable, nodes, shardRouting);

+ 7 - 18
src/main/java/org/elasticsearch/indices/recovery/RecoveryTarget.java

@@ -109,16 +109,15 @@ public class RecoveryTarget extends AbstractComponent {
         });
     }
 
-    public RecoveryStatus recoveryStatus(ShardId shardId) {
-        RecoveryStatus peerRecoveryStatus = findRecoveryByShardId(shardId);
-        if (peerRecoveryStatus == null) {
+    public RecoveryStatus recoveryStatus(IndexShard indexShard) {
+        RecoveryStatus recoveryStatus = findRecoveryByShard(indexShard);
+        if (recoveryStatus == null) {
             return null;
         }
-        // update how long it takes if we are still recovering...
-        if (peerRecoveryStatus.recoveryState().getTimer().startTime() > 0 && peerRecoveryStatus.stage() != RecoveryState.Stage.DONE) {
-            peerRecoveryStatus.recoveryState().getTimer().time(System.currentTimeMillis() - peerRecoveryStatus.recoveryState().getTimer().startTime());
+        if (recoveryStatus.recoveryState().getTimer().startTime() > 0 && recoveryStatus.stage() != RecoveryState.Stage.DONE) {
+            recoveryStatus.recoveryState().getTimer().time(System.currentTimeMillis() - recoveryStatus.recoveryState().getTimer().startTime());
         }
-        return peerRecoveryStatus;
+        return recoveryStatus;
     }
 
     public void cancelRecovery(IndexShard indexShard) {
@@ -179,7 +178,7 @@ public class RecoveryTarget extends AbstractComponent {
     }
 
     public void retryRecovery(final StartRecoveryRequest request, TimeValue retryAfter, final RecoveryStatus status, final RecoveryListener listener) {
-        threadPool.schedule(retryAfter, ThreadPool.Names.GENERIC ,new Runnable() {
+        threadPool.schedule(retryAfter, ThreadPool.Names.GENERIC, new Runnable() {
             @Override
             public void run() {
                 doRecovery(request, status, listener);
@@ -319,16 +318,6 @@ public class RecoveryTarget extends AbstractComponent {
         void onRecoveryFailure(RecoveryFailedException e, boolean sendShardFailure);
     }
 
-    @Nullable
-    private RecoveryStatus findRecoveryByShardId(ShardId shardId) {
-        for (RecoveryStatus recoveryStatus : onGoingRecoveries.values()) {
-            if (recoveryStatus.shardId.equals(shardId)) {
-                return recoveryStatus;
-            }
-        }
-        return null;
-    }
-
     @Nullable
     private RecoveryStatus findRecoveryByShard(IndexShard indexShard) {
         for (RecoveryStatus recoveryStatus : onGoingRecoveries.values()) {