Merge "Add secondary index implementation using SolrCloud"
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Reindex.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Reindex.java
index ae92586..19ae1d3 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Reindex.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Reindex.java
@@ -84,6 +84,7 @@
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.util.Collections;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -101,6 +102,9 @@
   @Option(name = "--dry-run", usage = "Dry run: don't write anything to index")
   private boolean dryRun;
 
+  @Option(name = "--verbose", usage = "Output debug information for each change")
+  private boolean verbose;
+
   private Injector dbInjector;
   private Injector sysInjector;
 
@@ -326,9 +330,13 @@
       try {
         Map<String, Ref> refs = repo.getAllRefs();
         for (Change c : db.changes().byProject(project)) {
-          Ref r = refs.get(c.currentPatchSetId().toRefName());
+          String refName = c.currentPatchSetId().toRefName();
+          Ref r = refs.get(refName);
           if (r != null) {
             byId.put(r.getObjectId(), new ChangeData(c));
+          } else {
+            fail("Failed to index change " + c.getId()
+                + " (" + refName + " not found)", true, null);
           }
         }
         walk();
@@ -369,6 +377,7 @@
 
     private void getPathsAndIndex(RevCommit bCommit) throws Exception {
       RevTree bTree = bCommit.getTree();
+      List<ChangeData> cds = byId.get(bCommit);
       try {
         RevTree aTree = aFor(bCommit, walk);
         if (aTree == null) {
@@ -377,21 +386,31 @@
         DiffFormatter df = new DiffFormatter(DisabledOutputStream.INSTANCE);
         try {
           df.setRepository(repo);
-          List<ChangeData> cds = byId.get(bCommit);
           if (!cds.isEmpty()) {
             List<String> paths = getPaths(df.scan(aTree, bTree));
-            for (ChangeData cd : cds) {
-              cd.setCurrentFilePaths(paths);
-              indexer.indexTask(cd).call();
-              done.update(1);
+            Iterator<ChangeData> cdit = cds.iterator();
+            for (ChangeData cd ; cdit.hasNext(); cdit.remove()) {
+              cd = cdit.next();
+              try {
+                cd.setCurrentFilePaths(paths);
+                indexer.indexTask(cd).call();
+                done.update(1);
+                if (verbose) {
+                  System.out.println("Reindexed change " + cd.getId());
+                }
+              } catch (Exception e) {
+                fail("Failed to index change " + cd.getId(), true, e);
+              }
             }
           }
         } finally {
           df.release();
         }
       } catch (Exception e) {
-        log.warn("Failed to index changes for commit " + bCommit.name(), e);
-        failed.update(1);
+        fail("Failed to index commit " + bCommit.name(), false, e);
+        for (ChangeData cd : cds) {
+          fail("Failed to index change " + cd.getId(), true, null);
+        }
       }
     }
 
@@ -433,6 +452,22 @@
         oi.release();
       }
     }
+
+    private void fail(String error, boolean failed, Exception e) {
+      if (failed) {
+        this.failed.update(1);
+      }
+
+      if (e != null) {
+        log.warn(error, e);
+      } else {
+        log.warn(error);
+      }
+
+      if (verbose) {
+        System.out.println(error);
+      }
+    }
   }
 
   private void writeVersion() throws IOException,
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/PatchSetInserter.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/PatchSetInserter.java
index f0458a6..8317859 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/PatchSetInserter.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/PatchSetInserter.java
@@ -205,19 +205,19 @@
 
       if (copyLabels) {
         ApprovalsUtil.copyLabels(db, refControl.getProjectControl()
-            .getLabelTypes(), currentPatchSetId, change.currentPatchSetId());
+            .getLabelTypes(), currentPatchSetId, updatedChange.currentPatchSetId());
       }
 
       final List<FooterLine> footerLines = commit.getFooterLines();
-      ChangeUtil.updateTrackingIds(db, change, trackingFooters, footerLines);
+      ChangeUtil.updateTrackingIds(db, updatedChange, trackingFooters, footerLines);
       db.commit();
 
       if (changeMessage != null) {
         db.changeMessages().insert(Collections.singleton(changeMessage));
       }
 
-      indexer.index(change);
-      hooks.doPatchsetCreatedHook(change, patchSet, db);
+      indexer.index(updatedChange);
+      hooks.doPatchsetCreatedHook(updatedChange, patchSet, db);
     } finally {
       db.rollback();
     }
diff --git a/lib/codemirror/BUCK b/lib/codemirror/BUCK
index 0bd12ce..c722be7 100644
--- a/lib/codemirror/BUCK
+++ b/lib/codemirror/BUCK
@@ -1,7 +1,7 @@
 include_defs('//lib/maven.defs')
 
-VERSION = 'bb73aeacb8'
-SHA1 = '3bc9c92b97210135bc83fca7a2bd5f3c4aab496a'
+VERSION = '1121be6ce8'
+SHA1 = '0f07c14d6a9de7082985e8b3a644b0713e669b17'
 URL = GERRIT + 'net/codemirror/codemirror-%s.zip' % VERSION
 
 prebuilt_jar(