From 4caeeba30ec0dd2aba1ca4f402c0a23800f81cd4 Mon Sep 17 00:00:00 2001
From: Mohit Kataria <tihom88@gmail.com>
Date: Fri, 15 Mar 2019 15:17:38 +0530
Subject: [PATCH] OAK-8134: Index Copier Stats MBean shows stale info

---
 .../oak/plugins/index/lucene/IndexCopier.java     |  2 +-
 .../lucene/directory/IndexRootDirectory.java      | 15 ++++++++++++---
 .../lucene/directory/IndexRootDirectoryTest.java  |  2 +-
 3 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexCopier.java b/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexCopier.java
index 9e01311db3..a99812545c 100644
--- a/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexCopier.java
+++ b/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/IndexCopier.java
@@ -453,7 +453,7 @@ public class IndexCopier implements CopyOnReadStatsMBean, Closeable {
         TabularDataSupport tds;
         try{
             TabularType tt = new TabularType(IndexMappingData.class.getName(),
-                    "Lucene Index Stats", IndexMappingData.TYPE, new String[]{"jcrPath"});
+                    "Lucene Index Stats", IndexMappingData.TYPE, new String[]{"fsPath"});
             tds = new TabularDataSupport(tt);
             for (LocalIndexDir indexDir : indexRootDirectory.getAllLocalIndexes()){
                 String size = humanReadableByteCount(indexDir.size());
diff --git a/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/IndexRootDirectory.java b/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/IndexRootDirectory.java
index ca7e9ac5d2..07a862eb31 100644
--- a/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/IndexRootDirectory.java
+++ b/oak-lucene/src/main/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/IndexRootDirectory.java
@@ -126,15 +126,24 @@ public class IndexRootDirectory {
         }
     }
 
+    private int totalLocalIndexes(Map<String, List<LocalIndexDir>> mapping){
+        int size = 0;
+        for ( Map.Entry<String, List<LocalIndexDir>> e : mapping.entrySet()) {
+            size += e.getValue().size();
+        }
+        return size;
+    }
+
     /**
      * Returns the most recent directory for each index. If for an index 2 versions are present
      * then it would return the most recent version
      */
     public List<LocalIndexDir> getAllLocalIndexes() throws IOException {
         Map<String, List<LocalIndexDir>> mapping = getIndexesPerPath();
-        List<LocalIndexDir> result = Lists.newArrayListWithCapacity(mapping.size());
+        int totalLocalIndexes =  totalLocalIndexes(mapping);
+        List<LocalIndexDir> result = Lists.newArrayListWithCapacity(totalLocalIndexes);
         for (Map.Entry<String, List<LocalIndexDir>> e : mapping.entrySet()){
-            result.add(e.getValue().get(0));
+            result.addAll(e.getValue());
         }
         return result;
     }
@@ -228,7 +237,7 @@ public class IndexRootDirectory {
             pathToDirMap.get(localIndexDir.getJcrPath()).add(localIndexDir);
         }
 
-        Map<String, List<LocalIndexDir>> result = Maps.newHashMap();
+        Map<String, List<LocalIndexDir>> result = Maps.newTreeMap();
         for (Map.Entry<String, Collection<LocalIndexDir>> e : pathToDirMap.asMap().entrySet()){
             List<LocalIndexDir> sortedDirs = new ArrayList<>(e.getValue());
             Collections.sort(sortedDirs, Collections.<LocalIndexDir>reverseOrder());
diff --git a/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/IndexRootDirectoryTest.java b/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/IndexRootDirectoryTest.java
index 2ad2b1db9b..f82d8c0f1d 100644
--- a/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/IndexRootDirectoryTest.java
+++ b/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/directory/IndexRootDirectoryTest.java
@@ -106,7 +106,7 @@ public class IndexRootDirectoryTest {
         File fb2 = dir.getIndexDir(getDefn(), "/b", "default");
 
         List<LocalIndexDir> dirs = dir.getAllLocalIndexes();
-        assertEquals(2, dirs.size());
+        assertEquals(4, dirs.size());
 
         assertEquals(fb2.getParentFile().getAbsolutePath(), getDir("/b", dirs).getFSPath());
         assertEquals(fa2.getParentFile().getAbsolutePath(), getDir("/a", dirs).getFSPath());
-- 
2.17.1

