From a5c5f65da51323fa25e6fac85e240515c4f34150 Mon Sep 17 00:00:00 2001
From: kimchy <kimchy@gmail.com>
Date: Thu, 19 Aug 2010 22:46:58 +0300
Subject: [PATCH] fix recovery status when all index got reused

---
 .../action/admin/indices/status/GatewayRecoveryStatus.java     | 3 +++
 .../action/admin/indices/status/PeerRecoveryStatus.java        | 3 +++
 .../index/gateway/blobstore/BlobStoreIndexShardGateway.java    | 3 ++-
 3 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/action/admin/indices/status/GatewayRecoveryStatus.java b/modules/elasticsearch/src/main/java/org/elasticsearch/action/admin/indices/status/GatewayRecoveryStatus.java
index a0d78c2562d..0627d4d823e 100644
--- a/modules/elasticsearch/src/main/java/org/elasticsearch/action/admin/indices/status/GatewayRecoveryStatus.java
+++ b/modules/elasticsearch/src/main/java/org/elasticsearch/action/admin/indices/status/GatewayRecoveryStatus.java
@@ -171,6 +171,9 @@ public class GatewayRecoveryStatus {
 
     public int indexRecoveryProgress() {
         if (recoveredIndexSize == 0) {
+            if (indexSize == reusedIndexSize) {
+                return 100;
+            }
             return 0;
         }
         return (int) (((double) recoveredIndexSize) / expectedRecoveredIndexSize().bytes() * 100);
diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/action/admin/indices/status/PeerRecoveryStatus.java b/modules/elasticsearch/src/main/java/org/elasticsearch/action/admin/indices/status/PeerRecoveryStatus.java
index 17d1f1f8910..ffadec507eb 100644
--- a/modules/elasticsearch/src/main/java/org/elasticsearch/action/admin/indices/status/PeerRecoveryStatus.java
+++ b/modules/elasticsearch/src/main/java/org/elasticsearch/action/admin/indices/status/PeerRecoveryStatus.java
@@ -160,6 +160,9 @@ public class PeerRecoveryStatus {
 
     public int indexRecoveryProgress() {
         if (recoveredIndexSize == 0) {
+            if (indexSize == reusedIndexSize) {
+                return 100;
+            }
             return 0;
         }
         return (int) (((double) recoveredIndexSize) / expectedRecoveredIndexSize().bytes() * 100);
diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/index/gateway/blobstore/BlobStoreIndexShardGateway.java b/modules/elasticsearch/src/main/java/org/elasticsearch/index/gateway/blobstore/BlobStoreIndexShardGateway.java
index c0a6e608684..2a2355e63de 100644
--- a/modules/elasticsearch/src/main/java/org/elasticsearch/index/gateway/blobstore/BlobStoreIndexShardGateway.java
+++ b/modules/elasticsearch/src/main/java/org/elasticsearch/index/gateway/blobstore/BlobStoreIndexShardGateway.java
@@ -540,6 +540,7 @@ public abstract class BlobStoreIndexShardGateway extends AbstractIndexShardCompo
                 if (storeMd != null && storeMd.md5().equals(virtualMd.md5())) {
                     numberOfExistingFiles++;
                     existingTotalSize += virtualMd.sizeInBytes();
+                    totalSize += virtualMd.sizeInBytes();
                     if (logger.isTraceEnabled()) {
                         logger.trace("not_recovering [{}], exists in local store and has same md5 [{}]", virtualMd.name(), virtualMd.md5());
                     }
@@ -564,7 +565,7 @@ public abstract class BlobStoreIndexShardGateway extends AbstractIndexShardCompo
         recoveryStatus.index().files(numberOfFiles, totalSize, numberOfExistingFiles, existingTotalSize);
 
         if (logger.isTraceEnabled()) {
-            logger.trace("recovering_files [{}] with total_size [{}], reusing_files [{}] with total_size [{}]", numberOfFiles, new ByteSizeValue(totalSize), numberOfExistingFiles, new ByteSizeValue(existingTotalSize));
+            logger.trace("recovering_files [{}] with total_size [{}], reusing_files [{}] with reused_size [{}]", numberOfFiles, new ByteSizeValue(totalSize), numberOfExistingFiles, new ByteSizeValue(existingTotalSize));
         }
 
         final CountDownLatch latch = new CountDownLatch(filesToRecover.size());