Throw StorageException instead of IOException from Index
Change-Id: I6b2c4442afbdbb678b5a8f1bc00f83b99f759734
This commit is contained in:
		| @@ -22,7 +22,6 @@ import com.google.gerrit.index.query.QueryParseException; | ||||
| import com.google.gerrit.reviewdb.client.Change; | ||||
| import com.google.gerrit.server.index.change.ChangeIndex; | ||||
| import com.google.gerrit.server.query.change.ChangeData; | ||||
| import java.io.IOException; | ||||
| import java.util.Optional; | ||||
|  | ||||
| /** | ||||
| @@ -53,17 +52,17 @@ public class DisabledChangeIndex implements ChangeIndex { | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public void replace(ChangeData obj) throws IOException { | ||||
|   public void replace(ChangeData obj) { | ||||
|     throw new UnsupportedOperationException("ChangeIndex is disabled"); | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public void delete(Change.Id key) throws IOException { | ||||
|   public void delete(Change.Id key) { | ||||
|     throw new UnsupportedOperationException("ChangeIndex is disabled"); | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public void deleteAll() throws IOException { | ||||
|   public void deleteAll() { | ||||
|     throw new UnsupportedOperationException("ChangeIndex is disabled"); | ||||
|   } | ||||
|  | ||||
| @@ -74,12 +73,12 @@ public class DisabledChangeIndex implements ChangeIndex { | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public void markReady(boolean ready) throws IOException { | ||||
|   public void markReady(boolean ready) { | ||||
|     throw new UnsupportedOperationException("ChangeIndex is disabled"); | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public Optional<ChangeData> get(Change.Id key, QueryOptions opts) throws IOException { | ||||
|   public Optional<ChangeData> get(Change.Id key, QueryOptions opts) { | ||||
|     throw new UnsupportedOperationException("ChangeIndex is disabled"); | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -22,7 +22,6 @@ import com.google.gerrit.index.query.QueryParseException; | ||||
| import com.google.gerrit.reviewdb.client.Change; | ||||
| import com.google.gerrit.server.index.change.ChangeIndex; | ||||
| import com.google.gerrit.server.query.change.ChangeData; | ||||
| import java.io.IOException; | ||||
|  | ||||
| class ReadOnlyChangeIndex implements ChangeIndex { | ||||
|   private final ChangeIndex index; | ||||
| @@ -46,17 +45,17 @@ class ReadOnlyChangeIndex implements ChangeIndex { | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public void replace(ChangeData obj) throws IOException { | ||||
|   public void replace(ChangeData obj) { | ||||
|     // do nothing | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public void delete(Change.Id key) throws IOException { | ||||
|   public void delete(Change.Id key) { | ||||
|     // do nothing | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public void deleteAll() throws IOException { | ||||
|   public void deleteAll() { | ||||
|     // do nothing | ||||
|   } | ||||
|  | ||||
| @@ -67,7 +66,7 @@ class ReadOnlyChangeIndex implements ChangeIndex { | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public void markReady(boolean ready) throws IOException { | ||||
|   public void markReady(boolean ready) { | ||||
|     // do nothing | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -167,23 +167,23 @@ abstract class AbstractElasticIndex<K, V> implements Index<K, V> { | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public void markReady(boolean ready) throws IOException { | ||||
|   public void markReady(boolean ready) { | ||||
|     IndexUtils.setReady(sitePaths, indexNameRaw, schema.getVersion(), ready); | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public void delete(K id) throws IOException { | ||||
|   public void delete(K id) { | ||||
|     String uri = getURI(type, BULK); | ||||
|     Response response = postRequest(uri, getDeleteActions(id), getRefreshParam()); | ||||
|     int statusCode = response.getStatusLine().getStatusCode(); | ||||
|     if (statusCode != HttpStatus.SC_OK) { | ||||
|       throw new IOException( | ||||
|       throw new StorageException( | ||||
|           String.format("Failed to delete %s from index %s: %s", id, indexName, statusCode)); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public void deleteAll() throws IOException { | ||||
|   public void deleteAll() { | ||||
|     // Delete the index, if it exists. | ||||
|     String endpoint = indexName + client.adapter().indicesExistParam(); | ||||
|     Response response = performRequest("HEAD", endpoint); | ||||
| @@ -192,7 +192,7 @@ abstract class AbstractElasticIndex<K, V> implements Index<K, V> { | ||||
|       response = performRequest("DELETE", indexName); | ||||
|       statusCode = response.getStatusLine().getStatusCode(); | ||||
|       if (statusCode != HttpStatus.SC_OK) { | ||||
|         throw new IOException( | ||||
|         throw new StorageException( | ||||
|             String.format("Failed to delete index %s: %s", indexName, statusCode)); | ||||
|       } | ||||
|     } | ||||
| @@ -205,7 +205,7 @@ abstract class AbstractElasticIndex<K, V> implements Index<K, V> { | ||||
|     statusCode = response.getStatusLine().getStatusCode(); | ||||
|     if (statusCode != HttpStatus.SC_OK) { | ||||
|       String error = String.format("Failed to create index %s: %s", indexName, statusCode); | ||||
|       throw new IOException(error); | ||||
|       throw new StorageException(error); | ||||
|     } | ||||
|   } | ||||
|  | ||||
| @@ -307,21 +307,24 @@ abstract class AbstractElasticIndex<K, V> implements Index<K, V> { | ||||
|     return sortArray; | ||||
|   } | ||||
|  | ||||
|   protected String getURI(String type, String request) throws UnsupportedEncodingException { | ||||
|   protected String getURI(String type, String request) { | ||||
|     try { | ||||
|       String encodedIndexName = URLEncoder.encode(indexName, UTF_8.toString()); | ||||
|       if (SEARCH.equals(request) && client.adapter().omitTypeFromSearch()) { | ||||
|         return encodedIndexName + "/" + request; | ||||
|       } | ||||
|       String encodedType = URLEncoder.encode(type, UTF_8.toString()); | ||||
|       return encodedIndexName + "/" + encodedType + "/" + request; | ||||
|     } catch (UnsupportedEncodingException e) { | ||||
|       throw new StorageException(e); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   protected Response postRequest(String uri, Object payload) throws IOException { | ||||
|   protected Response postRequest(String uri, Object payload) { | ||||
|     return performRequest("POST", uri, payload); | ||||
|   } | ||||
|  | ||||
|   protected Response postRequest(String uri, Object payload, Map<String, String> params) | ||||
|       throws IOException { | ||||
|   protected Response postRequest(String uri, Object payload, Map<String, String> params) { | ||||
|     return performRequest("POST", uri, payload, params); | ||||
|   } | ||||
|  | ||||
| @@ -329,18 +332,16 @@ abstract class AbstractElasticIndex<K, V> implements Index<K, V> { | ||||
|     return target.substring(0, target.length() - 1) + "," + addition.substring(1); | ||||
|   } | ||||
|  | ||||
|   private Response performRequest(String method, String uri) throws IOException { | ||||
|   private Response performRequest(String method, String uri) { | ||||
|     return performRequest(method, uri, null); | ||||
|   } | ||||
|  | ||||
|   private Response performRequest(String method, String uri, @Nullable Object payload) | ||||
|       throws IOException { | ||||
|   private Response performRequest(String method, String uri, @Nullable Object payload) { | ||||
|     return performRequest(method, uri, payload, Collections.emptyMap()); | ||||
|   } | ||||
|  | ||||
|   private Response performRequest( | ||||
|       String method, String uri, @Nullable Object payload, Map<String, String> params) | ||||
|       throws IOException { | ||||
|       String method, String uri, @Nullable Object payload, Map<String, String> params) { | ||||
|     Request request = new Request(method, uri.startsWith("/") ? uri : "/" + uri); | ||||
|     if (payload != null) { | ||||
|       String payloadStr = payload instanceof String ? (String) payload : payload.toString(); | ||||
| @@ -349,7 +350,11 @@ abstract class AbstractElasticIndex<K, V> implements Index<K, V> { | ||||
|     for (Map.Entry<String, String> entry : params.entrySet()) { | ||||
|       request.addParameter(entry.getKey(), entry.getValue()); | ||||
|     } | ||||
|     try { | ||||
|       return client.get().performRequest(request); | ||||
|     } catch (IOException e) { | ||||
|       throw new StorageException(e); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   protected class ElasticQuerySource implements DataSource<V> { | ||||
|   | ||||
| @@ -20,6 +20,7 @@ import com.google.gerrit.elasticsearch.ElasticMapping.MappingProperties; | ||||
| import com.google.gerrit.elasticsearch.bulk.BulkRequest; | ||||
| import com.google.gerrit.elasticsearch.bulk.IndexRequest; | ||||
| import com.google.gerrit.elasticsearch.bulk.UpdateRequest; | ||||
| import com.google.gerrit.exceptions.StorageException; | ||||
| import com.google.gerrit.index.QueryOptions; | ||||
| import com.google.gerrit.index.Schema; | ||||
| import com.google.gerrit.index.query.DataSource; | ||||
| @@ -38,7 +39,6 @@ import com.google.gson.JsonObject; | ||||
| import com.google.inject.Inject; | ||||
| import com.google.inject.Provider; | ||||
| import com.google.inject.assistedinject.Assisted; | ||||
| import java.io.IOException; | ||||
| import java.util.Set; | ||||
| import org.apache.http.HttpStatus; | ||||
| import org.elasticsearch.client.Response; | ||||
| @@ -73,7 +73,7 @@ public class ElasticAccountIndex extends AbstractElasticIndex<Account.Id, Accoun | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public void replace(AccountState as) throws IOException { | ||||
|   public void replace(AccountState as) { | ||||
|     BulkRequest bulk = | ||||
|         new IndexRequest(getId(as), indexName, type, client.adapter()) | ||||
|             .add(new UpdateRequest<>(schema, as)); | ||||
| @@ -82,7 +82,7 @@ public class ElasticAccountIndex extends AbstractElasticIndex<Account.Id, Accoun | ||||
|     Response response = postRequest(uri, bulk, getRefreshParam()); | ||||
|     int statusCode = response.getStatusLine().getStatusCode(); | ||||
|     if (statusCode != HttpStatus.SC_OK) { | ||||
|       throw new IOException( | ||||
|       throw new StorageException( | ||||
|           String.format( | ||||
|               "Failed to replace account %s in index %s: %s", | ||||
|               as.getAccount().getId(), indexName, statusCode)); | ||||
|   | ||||
| @@ -33,6 +33,7 @@ import com.google.gerrit.elasticsearch.bulk.BulkRequest; | ||||
| import com.google.gerrit.elasticsearch.bulk.DeleteRequest; | ||||
| import com.google.gerrit.elasticsearch.bulk.IndexRequest; | ||||
| import com.google.gerrit.elasticsearch.bulk.UpdateRequest; | ||||
| import com.google.gerrit.exceptions.StorageException; | ||||
| import com.google.gerrit.index.QueryOptions; | ||||
| import com.google.gerrit.index.Schema; | ||||
| import com.google.gerrit.index.query.DataSource; | ||||
| @@ -59,7 +60,6 @@ import com.google.gson.JsonElement; | ||||
| import com.google.gson.JsonObject; | ||||
| import com.google.inject.Inject; | ||||
| import com.google.inject.assistedinject.Assisted; | ||||
| import java.io.IOException; | ||||
| import java.util.Collections; | ||||
| import java.util.List; | ||||
| import java.util.Optional; | ||||
| @@ -106,7 +106,7 @@ class ElasticChangeIndex extends AbstractElasticIndex<Change.Id, ChangeData> | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public void replace(ChangeData cd) throws IOException { | ||||
|   public void replace(ChangeData cd) { | ||||
|     String deleteIndex; | ||||
|     String insertIndex; | ||||
|  | ||||
| @@ -130,7 +130,7 @@ class ElasticChangeIndex extends AbstractElasticIndex<Change.Id, ChangeData> | ||||
|     Response response = postRequest(uri, bulk, getRefreshParam()); | ||||
|     int statusCode = response.getStatusLine().getStatusCode(); | ||||
|     if (statusCode != HttpStatus.SC_OK) { | ||||
|       throw new IOException( | ||||
|       throw new StorageException( | ||||
|           String.format( | ||||
|               "Failed to replace change %s in index %s: %s", cd.getId(), indexName, statusCode)); | ||||
|     } | ||||
|   | ||||
| @@ -18,6 +18,7 @@ import com.google.gerrit.elasticsearch.ElasticMapping.MappingProperties; | ||||
| import com.google.gerrit.elasticsearch.bulk.BulkRequest; | ||||
| import com.google.gerrit.elasticsearch.bulk.IndexRequest; | ||||
| import com.google.gerrit.elasticsearch.bulk.UpdateRequest; | ||||
| import com.google.gerrit.exceptions.StorageException; | ||||
| import com.google.gerrit.index.QueryOptions; | ||||
| import com.google.gerrit.index.Schema; | ||||
| import com.google.gerrit.index.query.DataSource; | ||||
| @@ -36,7 +37,6 @@ import com.google.gson.JsonObject; | ||||
| import com.google.inject.Inject; | ||||
| import com.google.inject.Provider; | ||||
| import com.google.inject.assistedinject.Assisted; | ||||
| import java.io.IOException; | ||||
| import java.util.Set; | ||||
| import org.apache.http.HttpStatus; | ||||
| import org.elasticsearch.client.Response; | ||||
| @@ -71,7 +71,7 @@ public class ElasticGroupIndex extends AbstractElasticIndex<AccountGroup.UUID, I | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public void replace(InternalGroup group) throws IOException { | ||||
|   public void replace(InternalGroup group) { | ||||
|     BulkRequest bulk = | ||||
|         new IndexRequest(getId(group), indexName, type, client.adapter()) | ||||
|             .add(new UpdateRequest<>(schema, group)); | ||||
| @@ -80,7 +80,7 @@ public class ElasticGroupIndex extends AbstractElasticIndex<AccountGroup.UUID, I | ||||
|     Response response = postRequest(uri, bulk, getRefreshParam()); | ||||
|     int statusCode = response.getStatusLine().getStatusCode(); | ||||
|     if (statusCode != HttpStatus.SC_OK) { | ||||
|       throw new IOException( | ||||
|       throw new StorageException( | ||||
|           String.format( | ||||
|               "Failed to replace group %s in index %s: %s", | ||||
|               group.getGroupUUID().get(), indexName, statusCode)); | ||||
|   | ||||
| @@ -18,6 +18,7 @@ import com.google.gerrit.elasticsearch.ElasticMapping.MappingProperties; | ||||
| import com.google.gerrit.elasticsearch.bulk.BulkRequest; | ||||
| import com.google.gerrit.elasticsearch.bulk.IndexRequest; | ||||
| import com.google.gerrit.elasticsearch.bulk.UpdateRequest; | ||||
| import com.google.gerrit.exceptions.StorageException; | ||||
| import com.google.gerrit.index.QueryOptions; | ||||
| import com.google.gerrit.index.Schema; | ||||
| import com.google.gerrit.index.project.ProjectData; | ||||
| @@ -36,7 +37,6 @@ import com.google.gson.JsonObject; | ||||
| import com.google.inject.Inject; | ||||
| import com.google.inject.Provider; | ||||
| import com.google.inject.assistedinject.Assisted; | ||||
| import java.io.IOException; | ||||
| import java.util.Set; | ||||
| import org.apache.http.HttpStatus; | ||||
| import org.elasticsearch.client.Response; | ||||
| @@ -71,7 +71,7 @@ public class ElasticProjectIndex extends AbstractElasticIndex<Project.NameKey, P | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public void replace(ProjectData projectState) throws IOException { | ||||
|   public void replace(ProjectData projectState) { | ||||
|     BulkRequest bulk = | ||||
|         new IndexRequest(projectState.getProject().getName(), indexName, type, client.adapter()) | ||||
|             .add(new UpdateRequest<>(schema, projectState)); | ||||
| @@ -80,7 +80,7 @@ public class ElasticProjectIndex extends AbstractElasticIndex<Project.NameKey, P | ||||
|     Response response = postRequest(uri, bulk, getRefreshParam()); | ||||
|     int statusCode = response.getStatusLine().getStatusCode(); | ||||
|     if (statusCode != HttpStatus.SC_OK) { | ||||
|       throw new IOException( | ||||
|       throw new StorageException( | ||||
|           String.format( | ||||
|               "Failed to replace project %s in index %s: %s", | ||||
|               projectState.getProject().getName(), indexName, statusCode)); | ||||
|   | ||||
| @@ -21,7 +21,6 @@ import com.google.gerrit.index.query.FieldBundle; | ||||
| import com.google.gerrit.index.query.IndexPredicate; | ||||
| import com.google.gerrit.index.query.Predicate; | ||||
| import com.google.gerrit.index.query.QueryParseException; | ||||
| import java.io.IOException; | ||||
| import java.util.Optional; | ||||
|  | ||||
| /** | ||||
| @@ -48,24 +47,18 @@ public interface Index<K, V> { | ||||
|    * searchers, but should be visible within a reasonable amount of time. | ||||
|    * | ||||
|    * @param obj document object | ||||
|    * @throws IOException | ||||
|    */ | ||||
|   void replace(V obj) throws IOException; | ||||
|   void replace(V obj); | ||||
|  | ||||
|   /** | ||||
|    * Delete a document from the index by key. | ||||
|    * | ||||
|    * @param key document key | ||||
|    * @throws IOException | ||||
|    */ | ||||
|   void delete(K key) throws IOException; | ||||
|   void delete(K key); | ||||
|  | ||||
|   /** | ||||
|    * Delete all documents from the index. | ||||
|    * | ||||
|    * @throws IOException | ||||
|    */ | ||||
|   void deleteAll() throws IOException; | ||||
|   /** Delete all documents from the index. */ | ||||
|   void deleteAll(); | ||||
|  | ||||
|   /** | ||||
|    * Convert the given operator predicate into a source searching the index and returning only the | ||||
| @@ -91,20 +84,17 @@ public interface Index<K, V> { | ||||
|    * @param opts query options. Options that do not make sense in the context of a single document, | ||||
|    *     such as start, will be ignored. | ||||
|    * @return a single document if present. | ||||
|    * @throws IOException | ||||
|    */ | ||||
|   default Optional<V> get(K key, QueryOptions opts) throws IOException { | ||||
|   default Optional<V> get(K key, QueryOptions opts) { | ||||
|     opts = opts.withStart(0).withLimit(2); | ||||
|     ImmutableList<V> results; | ||||
|     try { | ||||
|       results = getSource(keyPredicate(key), opts).read().toList(); | ||||
|     } catch (QueryParseException e) { | ||||
|       throw new IOException("Unexpected QueryParseException during get()", e); | ||||
|     } catch (StorageException e) { | ||||
|       throw new IOException(e); | ||||
|       throw new StorageException("Unexpected QueryParseException during get()", e); | ||||
|     } | ||||
|     if (results.size() > 1) { | ||||
|       throw new IOException("Multiple results found in index for key " + key + ": " + results); | ||||
|       throw new StorageException("Multiple results found in index for key " + key + ": " + results); | ||||
|     } | ||||
|     return results.stream().findFirst(); | ||||
|   } | ||||
| @@ -116,20 +106,17 @@ public interface Index<K, V> { | ||||
|    * @param opts query options. Options that do not make sense in the context of a single document, | ||||
|    *     such as start, will be ignored. | ||||
|    * @return an abstraction of a raw index document to retrieve fields from. | ||||
|    * @throws IOException | ||||
|    */ | ||||
|   default Optional<FieldBundle> getRaw(K key, QueryOptions opts) throws IOException { | ||||
|   default Optional<FieldBundle> getRaw(K key, QueryOptions opts) { | ||||
|     opts = opts.withStart(0).withLimit(2); | ||||
|     ImmutableList<FieldBundle> results; | ||||
|     try { | ||||
|       results = getSource(keyPredicate(key), opts).readRaw().toList(); | ||||
|     } catch (QueryParseException e) { | ||||
|       throw new IOException("Unexpected QueryParseException during get()", e); | ||||
|     } catch (StorageException e) { | ||||
|       throw new IOException(e); | ||||
|       throw new StorageException("Unexpected QueryParseException during get()", e); | ||||
|     } | ||||
|     if (results.size() > 1) { | ||||
|       throw new IOException("Multiple results found in index for key " + key + ": " + results); | ||||
|       throw new StorageException("Multiple results found in index for key " + key + ": " + results); | ||||
|     } | ||||
|     return results.stream().findFirst(); | ||||
|   } | ||||
| @@ -146,7 +133,6 @@ public interface Index<K, V> { | ||||
|    * Mark whether this index is up-to-date and ready to serve reads. | ||||
|    * | ||||
|    * @param ready whether the index is ready | ||||
|    * @throws IOException | ||||
|    */ | ||||
|   void markReady(boolean ready) throws IOException; | ||||
|   void markReady(boolean ready); | ||||
| } | ||||
|   | ||||
| @@ -22,7 +22,6 @@ import com.google.common.collect.FluentIterable; | ||||
| import com.google.common.collect.ImmutableList; | ||||
| import com.google.common.collect.ImmutableMap; | ||||
| import com.google.common.flogger.FluentLogger; | ||||
| import com.google.gerrit.exceptions.StorageException; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Arrays; | ||||
| import java.util.Collections; | ||||
| @@ -179,7 +178,7 @@ public class Schema<T> { | ||||
|               Object v; | ||||
|               try { | ||||
|                 v = f.get(obj); | ||||
|               } catch (StorageException e) { | ||||
|               } catch (RuntimeException e) { | ||||
|                 logger.atSevere().withCause(e).log( | ||||
|                     "error getting field %s of %s", f.getName(), obj); | ||||
|                 return null; | ||||
|   | ||||
| @@ -213,7 +213,7 @@ public abstract class AbstractLuceneIndex<K, V> implements Index<K, V> { | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public void markReady(boolean ready) throws IOException { | ||||
|   public void markReady(boolean ready) { | ||||
|     IndexUtils.setReady(sitePaths, name, schema.getVersion(), ready); | ||||
|   } | ||||
|  | ||||
| @@ -287,8 +287,12 @@ public abstract class AbstractLuceneIndex<K, V> implements Index<K, V> { | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public void deleteAll() throws IOException { | ||||
|   public void deleteAll() { | ||||
|     try { | ||||
|       writer.deleteAll(); | ||||
|     } catch (IOException e) { | ||||
|       throw new StorageException(e); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   public IndexWriter getWriter() { | ||||
|   | ||||
| @@ -71,12 +71,12 @@ public class ChangeSubIndex extends AbstractLuceneIndex<Change.Id, ChangeData> | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public void replace(ChangeData obj) throws IOException { | ||||
|   public void replace(ChangeData obj) { | ||||
|     throw new UnsupportedOperationException("don't use ChangeSubIndex directly"); | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public void delete(Change.Id key) throws IOException { | ||||
|   public void delete(Change.Id key) { | ||||
|     throw new UnsupportedOperationException("don't use ChangeSubIndex directly"); | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -19,6 +19,7 @@ import static com.google.gerrit.server.index.account.AccountField.FULL_NAME; | ||||
| import static com.google.gerrit.server.index.account.AccountField.ID; | ||||
| import static com.google.gerrit.server.index.account.AccountField.PREFERRED_EMAIL_EXACT; | ||||
|  | ||||
| import com.google.gerrit.exceptions.StorageException; | ||||
| import com.google.gerrit.index.FieldDef; | ||||
| import com.google.gerrit.index.QueryOptions; | ||||
| import com.google.gerrit.index.Schema; | ||||
| @@ -120,20 +121,20 @@ public class LuceneAccountIndex extends AbstractLuceneIndex<Account.Id, AccountS | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public void replace(AccountState as) throws IOException { | ||||
|   public void replace(AccountState as) { | ||||
|     try { | ||||
|       replace(idTerm(as), toDocument(as)).get(); | ||||
|     } catch (ExecutionException | InterruptedException e) { | ||||
|       throw new IOException(e); | ||||
|       throw new StorageException(e); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public void delete(Account.Id key) throws IOException { | ||||
|   public void delete(Account.Id key) { | ||||
|     try { | ||||
|       delete(idTerm(key)).get(); | ||||
|     } catch (ExecutionException | InterruptedException e) { | ||||
|       throw new IOException(e); | ||||
|       throw new StorageException(e); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -200,7 +200,7 @@ public class LuceneChangeIndex implements ChangeIndex { | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public void replace(ChangeData cd) throws IOException { | ||||
|   public void replace(ChangeData cd) { | ||||
|     Term id = LuceneChangeIndex.idTerm(cd); | ||||
|     // toDocument is essentially static and doesn't depend on the specific | ||||
|     // sub-index, so just pick one. | ||||
| @@ -211,23 +211,23 @@ public class LuceneChangeIndex implements ChangeIndex { | ||||
|       } else { | ||||
|         Futures.allAsList(openIndex.delete(id), closedIndex.replace(id, doc)).get(); | ||||
|       } | ||||
|     } catch (StorageException | ExecutionException | InterruptedException e) { | ||||
|       throw new IOException(e); | ||||
|     } catch (ExecutionException | InterruptedException e) { | ||||
|       throw new StorageException(e); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public void delete(Change.Id id) throws IOException { | ||||
|   public void delete(Change.Id id) { | ||||
|     Term idTerm = LuceneChangeIndex.idTerm(id); | ||||
|     try { | ||||
|       Futures.allAsList(openIndex.delete(idTerm), closedIndex.delete(idTerm)).get(); | ||||
|     } catch (ExecutionException | InterruptedException e) { | ||||
|       throw new IOException(e); | ||||
|       throw new StorageException(e); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public void deleteAll() throws IOException { | ||||
|   public void deleteAll() { | ||||
|     openIndex.deleteAll(); | ||||
|     closedIndex.deleteAll(); | ||||
|   } | ||||
| @@ -247,7 +247,7 @@ public class LuceneChangeIndex implements ChangeIndex { | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public void markReady(boolean ready) throws IOException { | ||||
|   public void markReady(boolean ready) { | ||||
|     // Arbitrary done on open index, as ready bit is set | ||||
|     // per index and not sub index | ||||
|     openIndex.markReady(ready); | ||||
|   | ||||
| @@ -17,6 +17,7 @@ package com.google.gerrit.lucene; | ||||
| import static com.google.common.collect.Iterables.getOnlyElement; | ||||
| import static com.google.gerrit.server.index.group.GroupField.UUID; | ||||
|  | ||||
| import com.google.gerrit.exceptions.StorageException; | ||||
| import com.google.gerrit.index.FieldDef; | ||||
| import com.google.gerrit.index.QueryOptions; | ||||
| import com.google.gerrit.index.Schema; | ||||
| @@ -110,20 +111,20 @@ public class LuceneGroupIndex extends AbstractLuceneIndex<AccountGroup.UUID, Int | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public void replace(InternalGroup group) throws IOException { | ||||
|   public void replace(InternalGroup group) { | ||||
|     try { | ||||
|       replace(idTerm(group), toDocument(group)).get(); | ||||
|     } catch (ExecutionException | InterruptedException e) { | ||||
|       throw new IOException(e); | ||||
|       throw new StorageException(e); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public void delete(AccountGroup.UUID key) throws IOException { | ||||
|   public void delete(AccountGroup.UUID key) { | ||||
|     try { | ||||
|       delete(idTerm(key)).get(); | ||||
|     } catch (ExecutionException | InterruptedException e) { | ||||
|       throw new IOException(e); | ||||
|       throw new StorageException(e); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -17,6 +17,7 @@ package com.google.gerrit.lucene; | ||||
| import static com.google.common.collect.Iterables.getOnlyElement; | ||||
| import static com.google.gerrit.index.project.ProjectField.NAME; | ||||
|  | ||||
| import com.google.gerrit.exceptions.StorageException; | ||||
| import com.google.gerrit.index.FieldDef; | ||||
| import com.google.gerrit.index.QueryOptions; | ||||
| import com.google.gerrit.index.Schema; | ||||
| @@ -110,20 +111,20 @@ public class LuceneProjectIndex extends AbstractLuceneIndex<Project.NameKey, Pro | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public void replace(ProjectData projectState) throws IOException { | ||||
|   public void replace(ProjectData projectState) { | ||||
|     try { | ||||
|       replace(idTerm(projectState), toDocument(projectState)).get(); | ||||
|     } catch (ExecutionException | InterruptedException e) { | ||||
|       throw new IOException(e); | ||||
|       throw new StorageException(e); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public void delete(Project.NameKey nameKey) throws IOException { | ||||
|   public void delete(Project.NameKey nameKey) { | ||||
|     try { | ||||
|       delete(idTerm(nameKey)).get(); | ||||
|     } catch (ExecutionException | InterruptedException e) { | ||||
|       throw new IOException(e); | ||||
|       throw new StorageException(e); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -22,6 +22,7 @@ import com.google.common.base.Function; | ||||
| import com.google.common.collect.ImmutableMap; | ||||
| import com.google.common.collect.ImmutableSet; | ||||
| import com.google.common.collect.Sets; | ||||
| import com.google.gerrit.exceptions.StorageException; | ||||
| import com.google.gerrit.index.QueryOptions; | ||||
| import com.google.gerrit.index.project.ProjectField; | ||||
| import com.google.gerrit.server.CurrentUser; | ||||
| @@ -49,23 +50,22 @@ public final class IndexUtils { | ||||
|         } | ||||
|       }; | ||||
|  | ||||
|   public static void setReady(SitePaths sitePaths, String name, int version, boolean ready) | ||||
|       throws IOException { | ||||
|   public static void setReady(SitePaths sitePaths, String name, int version, boolean ready) { | ||||
|     try { | ||||
|       GerritIndexStatus cfg = new GerritIndexStatus(sitePaths); | ||||
|       cfg.setReady(name, version, ready); | ||||
|       cfg.save(); | ||||
|     } catch (ConfigInvalidException e) { | ||||
|       throw new IOException(e); | ||||
|     } catch (ConfigInvalidException | IOException e) { | ||||
|       throw new StorageException(e); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   public static boolean getReady(SitePaths sitePaths, String name, int version) throws IOException { | ||||
|   public static boolean getReady(SitePaths sitePaths, String name, int version) { | ||||
|     try { | ||||
|       GerritIndexStatus cfg = new GerritIndexStatus(sitePaths); | ||||
|       return cfg.getReady(name, version); | ||||
|     } catch (ConfigInvalidException e) { | ||||
|       throw new IOException(e); | ||||
|     } catch (ConfigInvalidException | IOException e) { | ||||
|       throw new StorageException(e); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -120,11 +120,7 @@ public class OnlineReindexer<K, V, I extends Index<K, V>> { | ||||
|   public void activateIndex() { | ||||
|     indexes.setSearchIndex(index); | ||||
|     logger.atInfo().log("Using %s schema version %s", name, version(index)); | ||||
|     try { | ||||
|     index.markReady(true); | ||||
|     } catch (IOException e) { | ||||
|       logger.atWarning().log("Error activating new %s schema version %s", name, version(index)); | ||||
|     } | ||||
|  | ||||
|     List<I> toRemove = Lists.newArrayListWithExpectedSize(1); | ||||
|     for (I i : indexes.getWriteIndexes()) { | ||||
| @@ -133,12 +129,8 @@ public class OnlineReindexer<K, V, I extends Index<K, V>> { | ||||
|       } | ||||
|     } | ||||
|     for (I i : toRemove) { | ||||
|       try { | ||||
|       i.markReady(false); | ||||
|       indexes.removeWriteIndex(version(i)); | ||||
|       } catch (IOException e) { | ||||
|         logger.atWarning().log("Error deactivating old %s schema version %s", name, version(i)); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -20,7 +20,6 @@ import com.google.gerrit.index.query.Predicate; | ||||
| import com.google.gerrit.reviewdb.client.Change; | ||||
| import com.google.gerrit.server.query.change.ChangeData; | ||||
| import com.google.gerrit.server.query.change.ChangeDataSource; | ||||
| import java.io.IOException; | ||||
|  | ||||
| public class DummyChangeIndex implements ChangeIndex { | ||||
|   @Override | ||||
| @@ -32,13 +31,13 @@ public class DummyChangeIndex implements ChangeIndex { | ||||
|   public void close() {} | ||||
|  | ||||
|   @Override | ||||
|   public void replace(ChangeData cd) throws IOException {} | ||||
|   public void replace(ChangeData cd) {} | ||||
|  | ||||
|   @Override | ||||
|   public void delete(Change.Id id) throws IOException {} | ||||
|   public void delete(Change.Id id) {} | ||||
|  | ||||
|   @Override | ||||
|   public void deleteAll() throws IOException {} | ||||
|   public void deleteAll() {} | ||||
|  | ||||
|   @Override | ||||
|   public ChangeDataSource getSource(Predicate<ChangeData> p, QueryOptions opts) { | ||||
| @@ -46,7 +45,7 @@ public class DummyChangeIndex implements ChangeIndex { | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public void markReady(boolean ready) throws IOException {} | ||||
|   public void markReady(boolean ready) {} | ||||
|  | ||||
|   public int getMaxLimit() { | ||||
|     return Integer.MAX_VALUE; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Dave Borowitz
					Dave Borowitz