You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by ma...@apache.org on 2016/02/02 04:59:52 UTC
[18/50] [abbrv] phoenix git commit: PHOENIX-2616 Indexes over
immutable tables not marked as immutable
PHOENIX-2616 Indexes over immutable tables not marked as immutable
Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo
Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/c9669359
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/c9669359
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/c9669359
Branch: refs/heads/calcite
Commit: c966935921a85a0e6b5f4ba49d26e167f08349ed
Parents: 6911770
Author: James Taylor <ja...@apache.org>
Authored: Wed Jan 20 18:33:12 2016 -0800
Committer: James Taylor <ja...@apache.org>
Committed: Wed Jan 20 18:33:47 2016 -0800
----------------------------------------------------------------------
.../apache/phoenix/execute/MutationState.java | 18 ++++----
.../query/ConnectionQueryServicesImpl.java | 43 ++++++++++++++++----
.../apache/phoenix/schema/MetaDataClient.java | 5 ++-
.../phoenix/compile/QueryCompilerTest.java | 12 +++---
4 files changed, 54 insertions(+), 24 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/phoenix/blob/c9669359/phoenix-core/src/main/java/org/apache/phoenix/execute/MutationState.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/execute/MutationState.java b/phoenix-core/src/main/java/org/apache/phoenix/execute/MutationState.java
index f1a9c02..0a5b053 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/execute/MutationState.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/execute/MutationState.java
@@ -92,12 +92,6 @@ import org.apache.phoenix.util.TransactionUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.google.common.base.Predicate;
-import com.google.common.collect.Iterators;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-
import co.cask.tephra.Transaction;
import co.cask.tephra.Transaction.VisibilityLevel;
import co.cask.tephra.TransactionAware;
@@ -110,12 +104,16 @@ import co.cask.tephra.hbase11.TransactionAwareHTable;
import co.cask.tephra.visibility.FenceWait;
import co.cask.tephra.visibility.VisibilityFence;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterators;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+
/**
*
* Tracks the uncommitted state
*
- *
- * @since 0.1
*/
public class MutationState implements SQLCloseable {
private static final Logger logger = LoggerFactory.getLogger(MutationState.class);
@@ -1227,7 +1225,9 @@ public class MutationState implements SQLCloseable {
List<PTable> oldIndexes;
PTableRef ptableRef = cache.getTableRef(dataTable.getKey());
oldIndexes = ptableRef.getTable().getIndexes();
- MetaDataMutationResult result = client.updateCache(dataTable.getTenantId(), dataTable.getSchemaName().getString(), dataTable.getTableName().getString());
+ // Always check at server for metadata change, as it's possible that the table is configured to not check for metadata changes
+ // but in this case, the tx manager is telling us it's likely that there has been a change.
+ MetaDataMutationResult result = client.updateCache(dataTable.getTenantId(), dataTable.getSchemaName().getString(), dataTable.getTableName().getString(), true);
long timestamp = TransactionUtil.getResolvedTime(connection, result);
tableRef.setTimeStamp(timestamp);
PTable updatedDataTable = result.getTable();
http://git-wip-us.apache.org/repos/asf/phoenix/blob/c9669359/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java b/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java
index 4522cf8..73999b8 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java
@@ -187,6 +187,12 @@ import org.apache.twill.zookeeper.ZKClients;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import co.cask.tephra.TransactionSystemClient;
+import co.cask.tephra.TxConstants;
+import co.cask.tephra.distributed.PooledClientProvider;
+import co.cask.tephra.distributed.TransactionServiceClient;
+import co.cask.tephra.hbase11.coprocessor.TransactionProcessor;
+
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Joiner;
import com.google.common.base.Throwables;
@@ -199,12 +205,6 @@ import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
-import co.cask.tephra.TransactionSystemClient;
-import co.cask.tephra.TxConstants;
-import co.cask.tephra.distributed.PooledClientProvider;
-import co.cask.tephra.distributed.TransactionServiceClient;
-import co.cask.tephra.hbase11.coprocessor.TransactionProcessor;
-
public class ConnectionQueryServicesImpl extends DelegateQueryServices implements ConnectionQueryServices {
private static final Logger logger = LoggerFactory.getLogger(ConnectionQueryServicesImpl.class);
@@ -2423,6 +2423,7 @@ public class ConnectionQueryServicesImpl extends DelegateQueryServices implement
PhoenixDatabaseMetaData.TRANSACTIONAL + " " + PBoolean.INSTANCE.getSqlTypeName());
metaConnection = addColumnsIfNotExists(metaConnection, PhoenixDatabaseMetaData.SYSTEM_CATALOG, MetaDataProtocol.MIN_SYSTEM_TABLE_TIMESTAMP_4_7_0 - 1,
PhoenixDatabaseMetaData.UPDATE_CACHE_FREQUENCY + " " + PLong.INSTANCE.getSqlTypeName());
+ setImmutableTableIndexesImmutable(metaConnection);
// Drop old stats table so that new stats table is created
metaConnection = dropStatsTable(metaConnection,
MetaDataProtocol.MIN_SYSTEM_TABLE_TIMESTAMP_4_7_0);
@@ -2527,7 +2528,35 @@ public class ConnectionQueryServicesImpl extends DelegateQueryServices implement
}
}
- private PhoenixConnection dropStatsTable(PhoenixConnection oldMetaConnection, long timestamp)
+
+ /**
+ * Set IMMUTABLE_ROWS to true for all index tables over immutable tables.
+ * @param metaConnection connection over which to run the upgrade
+ * @throws SQLException
+ */
+ private static void setImmutableTableIndexesImmutable(PhoenixConnection metaConnection) throws SQLException {
+ boolean autoCommit = metaConnection.getAutoCommit();
+ try {
+ metaConnection.setAutoCommit(true);
+ metaConnection.createStatement().execute(
+ "UPSERT INTO SYSTEM.CATALOG(TENANT_ID, TABLE_SCHEM, TABLE_NAME, COLUMN_NAME, COLUMN_FAMILY, IMMUTABLE_ROWS)\n" +
+ "SELECT A.TENANT_ID, A.TABLE_SCHEM,B.COLUMN_FAMILY,null,null,true\n" +
+ "FROM SYSTEM.CATALOG A JOIN SYSTEM.CATALOG B ON (\n" +
+ " A.TENANT_ID = B.TENANT_ID AND \n" +
+ " A.TABLE_SCHEM = B.TABLE_SCHEM AND\n" +
+ " A.TABLE_NAME = B.TABLE_NAME AND\n" +
+ " A.COLUMN_NAME = B.COLUMN_NAME AND\n" +
+ " B.LINK_TYPE = 1\n" +
+ ")\n" +
+ "WHERE A.COLUMN_FAMILY IS NULL AND\n" +
+ " B.COLUMN_FAMILY IS NOT NULL AND\n" +
+ " A.IMMUTABLE_ROWS = TRUE;");
+ } finally {
+ metaConnection.setAutoCommit(autoCommit);
+ }
+ }
+
+ private PhoenixConnection dropStatsTable(PhoenixConnection oldMetaConnection, long timestamp)
throws SQLException, IOException {
Properties props = PropertiesUtil.deepCopy(oldMetaConnection.getClientInfo());
props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(timestamp-1));
http://git-wip-us.apache.org/repos/asf/phoenix/blob/c9669359/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java b/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java
index 064007f..d559842 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java
@@ -114,6 +114,8 @@ import java.util.Map;
import java.util.Properties;
import java.util.Set;
+import co.cask.tephra.TxConstants;
+
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HConstants;
@@ -216,8 +218,6 @@ import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.google.common.primitives.Ints;
-import co.cask.tephra.TxConstants;
-
public class MetaDataClient {
private static final Logger logger = LoggerFactory.getLogger(MetaDataClient.class);
@@ -1580,6 +1580,7 @@ public class MetaDataClient {
if (parent != null && tableType == PTableType.INDEX) {
timestamp = TransactionUtil.getTableTimestamp(connection, transactional);
storeNulls = parent.getStoreNulls();
+ isImmutableRows = parent.isImmutableRows();
// Index on view
// TODO: Can we support a multi-tenant index directly on a multi-tenant
// table instead of only a view? We don't have anywhere to put the link
http://git-wip-us.apache.org/repos/asf/phoenix/blob/c9669359/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryCompilerTest.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryCompilerTest.java b/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryCompilerTest.java
index 6d6dcdf..b3baa73 100644
--- a/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryCompilerTest.java
+++ b/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryCompilerTest.java
@@ -1189,7 +1189,7 @@ public class QueryCompilerTest extends BaseConnectionlessQueryTest {
conn.createStatement().execute(ddl);
assertImmutableRows(conn, "T", true);
conn.createStatement().execute(indexDDL);
- assertImmutableRows(conn, "T", true);
+ assertImmutableRows(conn, "I", true);
conn.createStatement().execute("DELETE FROM t WHERE v2 = 'foo'");
fail();
} catch (SQLException e) {
@@ -1209,13 +1209,13 @@ public class QueryCompilerTest extends BaseConnectionlessQueryTest {
@Test
public void testInvalidNegativeArrayIndex() throws Exception {
- String query = "SELECT a_double_array[-20] FROM table_with_array";
- Connection conn = DriverManager.getConnection(getUrl());
+ String query = "SELECT a_double_array[-20] FROM table_with_array";
+ Connection conn = DriverManager.getConnection(getUrl());
try {
conn.createStatement().execute(query);
fail();
} catch (Exception e) {
-
+
}
}
@Test
@@ -1232,8 +1232,8 @@ public class QueryCompilerTest extends BaseConnectionlessQueryTest {
@Test
public void testNonArrayColumnWithIndex() throws Exception {
- String query = "SELECT a_float[1] FROM table_with_array";
- Connection conn = DriverManager.getConnection(getUrl());
+ String query = "SELECT a_float[1] FROM table_with_array";
+ Connection conn = DriverManager.getConnection(getUrl());
try {
conn.createStatement().execute(query);
fail();