Repository: phoenix Updated Branches: refs/heads/master 2cf96db6e -> 0ef77b18c
PHOENIX-4130 Avoid server retries for mutable indexes (Addendum) Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/0ef77b18 Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/0ef77b18 Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/0ef77b18 Branch: refs/heads/master Commit: 0ef77b18cc200afe097ab803338af33997e3935d Parents: 2cf96db Author: Vincent Poon <[email protected]> Authored: Wed Jan 31 16:33:01 2018 -0800 Committer: Vincent Poon <[email protected]> Committed: Wed Jan 31 16:33:12 2018 -0800 ---------------------------------------------------------------------- .../end2end/index/PartialIndexRebuilderIT.java | 3 +-- .../index/exception/IndexWriteException.java | 21 +++++++++++--------- .../MultiIndexWriteFailureException.java | 14 +++++++++++-- .../SingleIndexWriteFailureException.java | 15 +++++++++++--- .../index/PhoenixIndexFailurePolicy.java | 18 +++++++++++++++++ 5 files changed, 55 insertions(+), 16 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/0ef77b18/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/PartialIndexRebuilderIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/PartialIndexRebuilderIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/PartialIndexRebuilderIT.java index dd986aa..3961d32 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/PartialIndexRebuilderIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/PartialIndexRebuilderIT.java @@ -1098,8 +1098,7 @@ public class PartialIndexRebuilderIT extends BaseUniqueNamesOwnClusterIT { conn.createStatement().execute("DELETE FROM " + fullTableName); fail(); } catch (SQLException e) { - // Expected - assertEquals(SQLExceptionCode.INDEX_WRITE_FAILURE.getErrorCode(), e.getErrorCode()); + // expected } assertTrue(TestUtil.checkIndexState(conn, fullIndexName, PIndexState.DISABLE, null)); } finally { http://git-wip-us.apache.org/repos/asf/phoenix/blob/0ef77b18/phoenix-core/src/main/java/org/apache/phoenix/hbase/index/exception/IndexWriteException.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/hbase/index/exception/IndexWriteException.java b/phoenix-core/src/main/java/org/apache/phoenix/hbase/index/exception/IndexWriteException.java index 531baa6..5dc6f60 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/hbase/index/exception/IndexWriteException.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/hbase/index/exception/IndexWriteException.java @@ -22,6 +22,8 @@ import java.util.regex.Pattern; import org.apache.hadoop.hbase.HBaseIOException; import org.apache.phoenix.query.QueryServicesOptions; +import com.google.common.base.Objects; + /** * Generic {@link Exception} that an index write has failed */ @@ -33,7 +35,7 @@ public class IndexWriteException extends HBaseIOException { * server side. */ private static final String DISABLE_INDEX_ON_FAILURE_MSG = "disableIndexOnFailure="; - private boolean disableIndexOnFailure; + private boolean disableIndexOnFailure = QueryServicesOptions.DEFAULT_INDEX_FAILURE_DISABLE_INDEX; public IndexWriteException() { super(); @@ -49,19 +51,15 @@ public class IndexWriteException extends HBaseIOException { super(message, cause); } - public IndexWriteException(String message, Throwable cause, boolean disableIndexOnFailure) { - super(prependDisableIndexMsg(message, disableIndexOnFailure), cause); + public IndexWriteException(Throwable cause, boolean disableIndexOnFailure) { + super(cause); + this.disableIndexOnFailure = disableIndexOnFailure; } - public IndexWriteException(String message, boolean disableIndexOnFailure) { - super(prependDisableIndexMsg(message, disableIndexOnFailure)); + public IndexWriteException(boolean disableIndexOnFailure) { this.disableIndexOnFailure = disableIndexOnFailure; } - private static String prependDisableIndexMsg(String message, boolean disableIndexOnFailure) { - return DISABLE_INDEX_ON_FAILURE_MSG + disableIndexOnFailure + " " + message; -} - public IndexWriteException(Throwable cause) { super(cause); } @@ -81,4 +79,9 @@ public IndexWriteException(Throwable cause) { public boolean isDisableIndexOnFailure() { return disableIndexOnFailure; } + + @Override + public String getMessage() { + return Objects.firstNonNull(super.getMessage(), "") + " " + DISABLE_INDEX_ON_FAILURE_MSG + disableIndexOnFailure + ","; + } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/0ef77b18/phoenix-core/src/main/java/org/apache/phoenix/hbase/index/exception/MultiIndexWriteFailureException.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/hbase/index/exception/MultiIndexWriteFailureException.java b/phoenix-core/src/main/java/org/apache/phoenix/hbase/index/exception/MultiIndexWriteFailureException.java index d593791..a14e8a5 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/hbase/index/exception/MultiIndexWriteFailureException.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/hbase/index/exception/MultiIndexWriteFailureException.java @@ -25,6 +25,7 @@ import org.apache.hadoop.hbase.util.Bytes; import org.apache.phoenix.hbase.index.table.HTableInterfaceReference; import org.apache.phoenix.hbase.index.util.ImmutableBytesPtr; +import com.google.common.base.Objects; import com.google.common.collect.Lists; /** @@ -40,7 +41,7 @@ public class MultiIndexWriteFailureException extends IndexWriteException { * @param failures the tables to which the index write did not succeed */ public MultiIndexWriteFailureException(List<HTableInterfaceReference> failures, boolean disableIndexOnFailure) { - super(FAILURE_MSG + failures, disableIndexOnFailure); + super(disableIndexOnFailure); this.failures = failures; } @@ -50,7 +51,7 @@ public class MultiIndexWriteFailureException extends IndexWriteException { * @param message detail message */ public MultiIndexWriteFailureException(String message) { - super(message, IndexWriteException.parseDisableIndexOnFailure(message)); + super(IndexWriteException.parseDisableIndexOnFailure(message)); Pattern p = Pattern.compile(FAILURE_MSG + "\\[(.*)\\]"); Matcher m = p.matcher(message); if (m.find()) { @@ -66,4 +67,13 @@ public class MultiIndexWriteFailureException extends IndexWriteException { public List<HTableInterfaceReference> getFailedTables() { return this.failures; } + + public void setFailedTables(List<HTableInterfaceReference> failedTables) { + this.failures = failedTables; + } + + @Override + public String getMessage() { + return Objects.firstNonNull(super.getMessage(),"") + " " + FAILURE_MSG + failures; + } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/0ef77b18/phoenix-core/src/main/java/org/apache/phoenix/hbase/index/exception/SingleIndexWriteFailureException.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/hbase/index/exception/SingleIndexWriteFailureException.java b/phoenix-core/src/main/java/org/apache/phoenix/hbase/index/exception/SingleIndexWriteFailureException.java index 610a82a..67dabba 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/hbase/index/exception/SingleIndexWriteFailureException.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/hbase/index/exception/SingleIndexWriteFailureException.java @@ -23,6 +23,8 @@ import java.util.regex.Pattern; import org.apache.hadoop.hbase.client.Mutation; +import com.google.common.base.Objects; + /** * Exception thrown if we cannot successfully write to an index table. */ @@ -31,6 +33,7 @@ public class SingleIndexWriteFailureException extends IndexWriteException { public static final String FAILED_MSG = "Failed to make index update:"; private String table; + private String mutationsMsg; /** * Cannot reach the index, but not sure of the table or the mutations that caused the failure @@ -49,9 +52,9 @@ public class SingleIndexWriteFailureException extends IndexWriteException { */ public SingleIndexWriteFailureException(String targetTableName, List<Mutation> mutations, Exception cause, boolean disableIndexOnFailure) { - super(FAILED_MSG + "\n\t table: " + targetTableName + "\n\t edits: " + mutations - + "\n\tcause: " + cause == null ? "UNKNOWN" : cause.getMessage(), cause, disableIndexOnFailure); + super(cause, disableIndexOnFailure); this.table = targetTableName; + this.mutationsMsg = mutations.toString(); } /** @@ -60,7 +63,7 @@ public class SingleIndexWriteFailureException extends IndexWriteException { * @param message detail message */ public SingleIndexWriteFailureException(String msg) { - super(msg, IndexWriteException.parseDisableIndexOnFailure(msg)); + super(IndexWriteException.parseDisableIndexOnFailure(msg)); Pattern pattern = Pattern.compile(FAILED_MSG + ".* table: ([\\S]*)\\s.*", Pattern.DOTALL); Matcher m = pattern.matcher(msg); if (m.find()) { @@ -75,4 +78,10 @@ public class SingleIndexWriteFailureException extends IndexWriteException { public String getTableName() { return this.table; } + + @Override + public String getMessage() { + return Objects.firstNonNull(super.getMessage(), "") + " " + FAILED_MSG + "\n\t table: " + this.table + "\n\t edits: " + mutationsMsg + + "\n\tcause: " + getCause() == null ? "UNKNOWN" : getCause().getMessage(); + } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/0ef77b18/phoenix-core/src/main/java/org/apache/phoenix/index/PhoenixIndexFailurePolicy.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/index/PhoenixIndexFailurePolicy.java b/phoenix-core/src/main/java/org/apache/phoenix/index/PhoenixIndexFailurePolicy.java index 7fd23e9..428124f 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/index/PhoenixIndexFailurePolicy.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/index/PhoenixIndexFailurePolicy.java @@ -26,6 +26,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import org.apache.commons.logging.Log; @@ -53,6 +54,7 @@ import org.apache.phoenix.hbase.index.exception.IndexWriteException; import org.apache.phoenix.hbase.index.exception.MultiIndexWriteFailureException; import org.apache.phoenix.hbase.index.exception.SingleIndexWriteFailureException; import org.apache.phoenix.hbase.index.table.HTableInterfaceReference; +import org.apache.phoenix.hbase.index.util.ImmutableBytesPtr; import org.apache.phoenix.hbase.index.write.DelegateIndexFailurePolicy; import org.apache.phoenix.hbase.index.write.KillServerOnFailurePolicy; import org.apache.phoenix.jdbc.PhoenixConnection; @@ -69,6 +71,9 @@ import org.apache.phoenix.util.ReadOnlyProps; import org.apache.phoenix.util.SchemaUtil; import org.apache.phoenix.util.ServerUtil; +import com.google.common.base.Function; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; import com.google.common.collect.Multimap; /** @@ -207,6 +212,19 @@ public class PhoenixIndexFailurePolicy extends DelegateIndexFailurePolicy { for (String tableName : getLocalIndexNames(ref, mutations)) { indexTableNames.put(tableName, minTimeStamp); } + // client disables the index, so we pass the index names in the thrown exception + if (cause instanceof MultiIndexWriteFailureException) { + List<HTableInterfaceReference> failedLocalIndexes = + Lists.newArrayList(Iterables.transform(indexTableNames.entrySet(), + new Function<Map.Entry<String, Long>, HTableInterfaceReference>() { + @Override + public HTableInterfaceReference apply(Entry<String, Long> input) { + return new HTableInterfaceReference(new ImmutableBytesPtr( + Bytes.toBytes(input.getKey()))); + } + })); + ((MultiIndexWriteFailureException) cause).setFailedTables(failedLocalIndexes); + } } else { indexTableNames.put(ref.getTableName(), minTimeStamp); }
