Merge "Enable streaming large files put to an edit"
diff --git a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneChangeIndex.java b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneChangeIndex.java
index 16f0ec3..3be79b8 100644
--- a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneChangeIndex.java
+++ b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneChangeIndex.java
@@ -319,20 +319,7 @@
 
   @SuppressWarnings("unchecked")
   @Override
-  public void delete(ChangeData cd) throws IOException {
-    Term id = QueryBuilder.idTerm(cd);
-    try {
-      Futures.allAsList(
-          openIndex.delete(id),
-          closedIndex.delete(id)).get();
-    } catch (ExecutionException | InterruptedException e) {
-      throw new IOException(e);
-    }
-  }
-
-  @SuppressWarnings("unchecked")
-  @Override
-  public void delete(int id) throws IOException {
+  public void delete(Change.Id id) throws IOException {
     Term idTerm = QueryBuilder.idTerm(id);
     try {
       Futures.allAsList(
diff --git a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/QueryBuilder.java b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/QueryBuilder.java
index ea5786d..28a8315 100644
--- a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/QueryBuilder.java
+++ b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/QueryBuilder.java
@@ -19,6 +19,7 @@
 import static org.apache.lucene.search.BooleanClause.Occur.SHOULD;
 
 import com.google.common.collect.Lists;
+import com.google.gerrit.reviewdb.client.Change;
 import com.google.gerrit.server.index.ChangeField;
 import com.google.gerrit.server.index.FieldType;
 import com.google.gerrit.server.index.IndexPredicate;
@@ -56,8 +57,8 @@
     return intTerm(ID_FIELD, cd.getId().get());
   }
 
-  public static Term idTerm(int id) {
-    return intTerm(ID_FIELD, id);
+  public static Term idTerm(Change.Id id) {
+    return intTerm(ID_FIELD, id.get());
   }
 
   private final Schema<ChangeData> schema;
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Daemon.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Daemon.java
index 64e6cf5..fde783a 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Daemon.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Daemon.java
@@ -35,7 +35,6 @@
 import com.google.gerrit.pgm.http.jetty.JettyEnv;
 import com.google.gerrit.pgm.http.jetty.JettyModule;
 import com.google.gerrit.pgm.http.jetty.ProjectQoSFilter;
-import com.google.gerrit.pgm.JythonShell;
 import com.google.gerrit.pgm.util.ErrorLogFile;
 import com.google.gerrit.pgm.util.GarbageCollectionLogFile;
 import com.google.gerrit.pgm.util.LogFileCompressor;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ChangeUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/ChangeUtil.java
index 19231cf..071d6c9 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/ChangeUtil.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/ChangeUtil.java
@@ -466,7 +466,7 @@
     db.changeMessages().delete(db.changeMessages().byChange(changeId));
     db.starredChanges().delete(db.starredChanges().byChange(changeId));
     db.changes().delete(Collections.singleton(change));
-    indexer.delete(db, change);
+    indexer.delete(change.getId());
   }
 
   public void deleteOnlyDraftPatchSet(PatchSet patch, Change change)
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangesCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangesCollection.java
index e7e71e5..1648a5d 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangesCollection.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangesCollection.java
@@ -86,7 +86,7 @@
       Integer changeId = Ints.tryParse(id.get());
       if (changeId != null) {
         try {
-          changeIndexer.delete(changeId);
+          changeIndexer.delete(new Change.Id(changeId));
         } catch (IOException e) {
           throw new ResourceNotFoundException(id.get(), e);
         }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeIndex.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeIndex.java
index 8d78ccb..cc36928 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeIndex.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeIndex.java
@@ -14,6 +14,7 @@
 
 package com.google.gerrit.server.index;
 
+import com.google.gerrit.reviewdb.client.Change;
 import com.google.gerrit.server.query.Predicate;
 import com.google.gerrit.server.query.QueryParseException;
 import com.google.gerrit.server.query.change.ChangeData;
@@ -53,22 +54,13 @@
   public void replace(ChangeData cd) throws IOException;
 
   /**
-   * Delete a change document from the index.
-   *
-   * @param cd change document
-   *
-   * @throws IOException
-   */
-  public void delete(ChangeData cd) throws IOException;
-
-  /**
    * Delete a change document from the index by id.
    *
-   * @param id change document id
+   * @param id change id
    *
    * @throws IOException
    */
-  public void delete(int id) throws IOException;
+  public void delete(Change.Id id) throws IOException;
 
   /**
    * Delete all change documents from the index.
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeIndexer.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeIndexer.java
index 4662581..3c0d715 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeIndexer.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeIndexer.java
@@ -118,7 +118,7 @@
    */
   public CheckedFuture<?, IOException> indexAsync(Change.Id id) {
     return executor != null
-        ? submit(new Task(id, false))
+        ? submit(new IndexTask(id))
         : Futures.<Object, IOException> immediateCheckedFuture(null);
   }
 
@@ -151,40 +151,17 @@
    */
   public CheckedFuture<?, IOException> deleteAsync(Change.Id id) {
     return executor != null
-        ? submit(new Task(id, true))
+        ? submit(new DeleteTask(id))
         : Futures.<Object, IOException> immediateCheckedFuture(null);
   }
 
   /**
    * Synchronously delete a change.
    *
-   * @param cd change to delete.
+   * @param id change ID to delete.
    */
-  public void delete(ChangeData cd) throws IOException {
-    for (ChangeIndex i : getWriteIndexes()) {
-      i.delete(cd);
-    }
-  }
-
-  /**
-   * Synchronously delete a change by id.
-   *
-   * @param id change to delete.
-   */
-  public void delete(int id) throws IOException {
-    for (ChangeIndex i : getWriteIndexes()) {
-      i.delete(id);
-    }
-  }
-
-  /**
-   * Synchronously delete a change.
-   *
-   * @param change change to delete.
-   * @param db review database.
-   */
-  public void delete(ReviewDb db, Change change) throws IOException {
-    delete(changeDataFactory.create(db, change));
+  public void delete(Change.Id id) throws IOException {
+    new DeleteTask(id).call();
   }
 
   private Collection<ChangeIndex> getWriteIndexes() {
@@ -197,13 +174,11 @@
     return Futures.makeChecked(executor.submit(task), MAPPER);
   }
 
-  private class Task implements Callable<Void> {
+  private class IndexTask implements Callable<Void> {
     private final Change.Id id;
-    private final boolean delete;
 
-    private Task(Change.Id id, boolean delete) {
+    private IndexTask(Change.Id id) {
       this.id = id;
-      this.delete = delete;
     }
 
     @Override
@@ -238,14 +213,8 @@
         try {
           ChangeData cd = changeDataFactory.create(
               newCtx.getReviewDbProvider().get(), id);
-          if (delete) {
-            for (ChangeIndex i : getWriteIndexes()) {
-              i.delete(cd);
-            }
-          } else {
-            for (ChangeIndex i : getWriteIndexes()) {
-              i.replace(cd);
-            }
+          for (ChangeIndex i : getWriteIndexes()) {
+            i.replace(cd);
           }
           return null;
         } finally  {
@@ -266,4 +235,23 @@
       return "index-change-" + id.get();
     }
   }
+
+  private class DeleteTask implements Callable<Void> {
+    private final Change.Id id;
+
+    private DeleteTask(Change.Id id) {
+      this.id = id;
+    }
+
+    @Override
+    public Void call() throws IOException {
+      // Don't bother setting a RequestContext to provide the DB.
+      // Implementations should not need to access the DB in order to delete a
+      // change ID.
+      for (ChangeIndex i : getWriteIndexes()) {
+        i.delete(id);
+      }
+      return null;
+    }
+  }
 }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/DummyIndex.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/DummyIndex.java
index ff8f843..4f057c5 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/DummyIndex.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/DummyIndex.java
@@ -14,6 +14,7 @@
 
 package com.google.gerrit.server.index;
 
+import com.google.gerrit.reviewdb.client.Change;
 import com.google.gerrit.server.query.Predicate;
 import com.google.gerrit.server.query.QueryParseException;
 import com.google.gerrit.server.query.change.ChangeData;
@@ -22,7 +23,6 @@
 import java.io.IOException;
 
 public class DummyIndex implements ChangeIndex {
-
   @Override
   public Schema<ChangeData> getSchema() {
     throw new UnsupportedOperationException();
@@ -37,7 +37,7 @@
   }
 
   @Override
-  public void delete(ChangeData cd) throws IOException {
+  public void delete(Change.Id id) throws IOException {
   }
 
   @Override
@@ -53,8 +53,4 @@
   @Override
   public void markReady(boolean ready) throws IOException {
   }
-
-  @Override
-  public void delete(int id) throws IOException {
-  }
 }
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/index/FakeIndex.java b/gerrit-server/src/test/java/com/google/gerrit/server/index/FakeIndex.java
index cb8d7e5..393b36c 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/index/FakeIndex.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/index/FakeIndex.java
@@ -15,6 +15,7 @@
 package com.google.gerrit.server.index;
 
 import com.google.common.collect.ImmutableList;
+import com.google.gerrit.reviewdb.client.Change;
 import com.google.gerrit.server.query.Predicate;
 import com.google.gerrit.server.query.QueryParseException;
 import com.google.gerrit.server.query.change.ChangeData;
@@ -22,8 +23,6 @@
 import com.google.gwtorm.server.OrmException;
 import com.google.gwtorm.server.ResultSet;
 
-import java.io.IOException;
-
 class FakeIndex implements ChangeIndex {
   static Schema<ChangeData> V1 = new Schema<>(1, false,
     ImmutableList.<FieldDef<ChangeData, ?>> of(
@@ -75,7 +74,7 @@
   }
 
   @Override
-  public void delete(ChangeData cd) {
+  public void delete(Change.Id id) {
     throw new UnsupportedOperationException();
   }
 
@@ -103,8 +102,4 @@
   public void markReady(boolean ready) {
     throw new UnsupportedOperationException();
   }
-
-  @Override
-  public void delete(int id) throws IOException {
-  }
 }
diff --git a/gerrit-solr/src/main/java/com/google/gerrit/solr/SolrChangeIndex.java b/gerrit-solr/src/main/java/com/google/gerrit/solr/SolrChangeIndex.java
index c656f6ce..2e998af 100644
--- a/gerrit-solr/src/main/java/com/google/gerrit/solr/SolrChangeIndex.java
+++ b/gerrit-solr/src/main/java/com/google/gerrit/solr/SolrChangeIndex.java
@@ -160,22 +160,8 @@
   }
 
   @Override
-  public void delete(ChangeData cd) throws IOException {
-    String id = cd.getId().toString();
-    try {
-      if (cd.change().getStatus().isOpen()) {
-        delete(id, openIndex);
-      } else {
-        delete(id, closedIndex);
-      }
-    } catch (OrmException e) {
-      throw new IOException(e);
-    }
-  }
-
-  @Override
-  public void delete(int id) throws IOException {
-    String idString = Integer.toString(id);
+  public void delete(Change.Id id) throws IOException {
+    String idString = Integer.toString(id.get());
     delete(idString, openIndex);
     delete(idString, closedIndex);
   }