You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by ya...@apache.org on 2020/11/09 18:02:24 UTC
[phoenix] branch master updated: PHOENIX-5940 Pre-4.15 client
cannot connect to 4.15+ server after SYSTEM.CATALOG region has split
This is an automated email from the ASF dual-hosted git repository.
yanxinyi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/phoenix.git
The following commit(s) were added to refs/heads/master by this push:
new bf0cef7 PHOENIX-5940 Pre-4.15 client cannot connect to 4.15+ server after SYSTEM.CATALOG region has split
bf0cef7 is described below
commit bf0cef74f63f6d63bff889562e6bdb7a4d4236cb
Author: Xinyi Yan <xy...@salesforce.com>
AuthorDate: Sat Nov 7 14:07:24 2020 -0800
PHOENIX-5940 Pre-4.15 client cannot connect to 4.15+ server after SYSTEM.CATALOG region has split
Signed-off-by: Xinyi Yan <ya...@apache.org>
---
.../BackwardCompatibilityForSplitableSyscatIT.java | 95 ++++++
.../phoenix/end2end/BackwardCompatibilityIT.java | 375 +++------------------
.../end2end/BackwardCompatibilityTestUtil.java | 315 +++++++++++++++++
.../it/resources/gold_files/gold_query_delete.txt | 22 ++
.../gold_query_select_and_drop_table.txt | 22 ++
.../it/resources/sql_files/create_tmp_table.sql | 21 ++
.../src/it/resources/sql_files/query_delete.sql | 24 ++
.../sql_files/query_select_and_drop_table.sql | 21 ++
.../phoenix/coprocessor/MetaDataEndpointImpl.java | 27 +-
9 files changed, 596 insertions(+), 326 deletions(-)
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/BackwardCompatibilityForSplitableSyscatIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/BackwardCompatibilityForSplitableSyscatIT.java
new file mode 100644
index 0000000..c100930
--- /dev/null
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/BackwardCompatibilityForSplitableSyscatIT.java
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.phoenix.end2end;
+
+import org.apache.phoenix.util.PhoenixRuntime;
+import org.apache.phoenix.thirdparty.com.google.common.collect.Maps;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import java.util.Collection;
+import java.util.Map;
+
+import static org.apache.phoenix.end2end.BackwardCompatibilityTestUtil.CREATE_TMP_TABLE;
+import static org.apache.phoenix.end2end.BackwardCompatibilityTestUtil.QUERY_DELETE;
+import static org.apache.phoenix.end2end.BackwardCompatibilityTestUtil.QUERY_SELECT_AND_DROP_TABLE;
+import static org.apache.phoenix.end2end.BackwardCompatibilityTestUtil.assertExpectedOutput;
+import static org.apache.phoenix.end2end.BackwardCompatibilityTestUtil.checkForPreConditions;
+import static org.apache.phoenix.end2end.BackwardCompatibilityTestUtil.computeClientVersions;
+import static org.apache.phoenix.end2end.BackwardCompatibilityTestUtil.executeQueriesWithCurrentVersion;
+import static org.apache.phoenix.end2end.BackwardCompatibilityTestUtil.executeQueryWithClientVersion;
+import static org.apache.phoenix.end2end.BackwardCompatibilityTestUtil.UpgradeProps.NONE;
+
+/**
+ * This class is meant for specifically testing syscat with all compatible client versions.
+ */
+
+@RunWith(Parameterized.class)
+@Category(NeedsOwnMiniClusterTest.class)
+public class BackwardCompatibilityForSplitableSyscatIT extends SplitSystemCatalogIT {
+ private final String compatibleClientVersion;
+ private String zkQuorum;
+ private String url;
+
+ @Parameterized.Parameters(name = "BackwardCompatibilityForSplitableSyscatIT_compatibleClientVersion={0}")
+ public static synchronized Collection<String> data() throws Exception {
+ return computeClientVersions();
+ }
+
+ public BackwardCompatibilityForSplitableSyscatIT(String compatibleClientVersion) {
+ this.compatibleClientVersion = compatibleClientVersion;
+ }
+
+ @Before
+ public synchronized void setup() throws Exception {
+ Map<String, String> serverProps = Maps.newHashMapWithExpectedSize(1);
+ doSetup(serverProps);
+ zkQuorum = "localhost:" + getZKClientPort(config);
+ url = PhoenixRuntime.JDBC_PROTOCOL + PhoenixRuntime.JDBC_PROTOCOL_SEPARATOR + zkQuorum;
+ checkForPreConditions(compatibleClientVersion, config);
+ }
+
+ @Test
+ public void testSplittableSyscatWithOldClientForAddingDataAndDelete() throws Exception {
+ executeQueryWithClientVersion(compatibleClientVersion, QUERY_DELETE, zkQuorum);
+ assertExpectedOutput(QUERY_DELETE);
+ }
+
+ @Test
+ public void testSplittableSyscatWithNewClientForAddingDataAndDelete() throws Exception {
+ executeQueriesWithCurrentVersion(QUERY_DELETE, url, NONE);
+ assertExpectedOutput(QUERY_DELETE);
+ }
+
+ @Test
+ public void testSplittableSyscatWithOldClientLoadDataAndNewClientQueryAndDelete() throws Exception {
+ executeQueryWithClientVersion(compatibleClientVersion, CREATE_TMP_TABLE, zkQuorum);
+ executeQueriesWithCurrentVersion(QUERY_SELECT_AND_DROP_TABLE, url, NONE);
+ assertExpectedOutput(QUERY_SELECT_AND_DROP_TABLE);
+ }
+
+ @Test
+ public void testSplittableSyscatWithNewClientLoadDataAndOldClientQueryAndDelete() throws Exception {
+ executeQueriesWithCurrentVersion(CREATE_TMP_TABLE, url, NONE);
+ executeQueryWithClientVersion(compatibleClientVersion, QUERY_SELECT_AND_DROP_TABLE, zkQuorum);
+ assertExpectedOutput(QUERY_SELECT_AND_DROP_TABLE);
+ }
+}
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/BackwardCompatibilityIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/BackwardCompatibilityIT.java
index 8ca3db5..7e4f287 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/BackwardCompatibilityIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/BackwardCompatibilityIT.java
@@ -17,55 +17,39 @@
*/
package org.apache.phoenix.end2end;
+import static org.apache.phoenix.end2end.BackwardCompatibilityTestUtil.ADD_DATA;
+import static org.apache.phoenix.end2end.BackwardCompatibilityTestUtil.ADD_DELETE;
+import static org.apache.phoenix.end2end.BackwardCompatibilityTestUtil.CREATE_ADD;
+import static org.apache.phoenix.end2end.BackwardCompatibilityTestUtil.CREATE_DIVERGED_VIEW;
+import static org.apache.phoenix.end2end.BackwardCompatibilityTestUtil.QUERY_ADD_DATA;
+import static org.apache.phoenix.end2end.BackwardCompatibilityTestUtil.QUERY_ADD_DELETE;
+import static org.apache.phoenix.end2end.BackwardCompatibilityTestUtil.QUERY_CREATE_ADD;
+import static org.apache.phoenix.end2end.BackwardCompatibilityTestUtil.QUERY_CREATE_DIVERGED_VIEW;
+import static org.apache.phoenix.end2end.BackwardCompatibilityTestUtil.assertExpectedOutput;
+import static org.apache.phoenix.end2end.BackwardCompatibilityTestUtil.checkForPreConditions;
+import static org.apache.phoenix.end2end.BackwardCompatibilityTestUtil.computeClientVersions;
+import static org.apache.phoenix.end2end.BackwardCompatibilityTestUtil.executeQueriesWithCurrentVersion;
+import static org.apache.phoenix.end2end.BackwardCompatibilityTestUtil.executeQueryWithClientVersion;
+import static org.apache.phoenix.end2end.BackwardCompatibilityTestUtil.UpgradeProps.NONE;
+import static org.apache.phoenix.end2end.BackwardCompatibilityTestUtil.UpgradeProps.SET_MAX_LOOK_BACK_AGE;
import static org.apache.phoenix.query.BaseTest.setUpConfigForMiniCluster;
-import static org.apache.phoenix.util.TestUtil.TEST_PROPERTIES;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assume.assumeFalse;
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.URL;
import java.sql.Connection;
import java.sql.DriverManager;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.ResultSetMetaData;
import java.util.Collection;
-import java.util.List;
-import java.util.Properties;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HBaseTestingUtility;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
-import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.TableDescriptor;
-import org.apache.hadoop.hbase.util.VersionInfo;
-import org.apache.phoenix.compat.hbase.coprocessor.CompatBaseScannerRegionObserver;
-import org.apache.phoenix.coprocessor.MetaDataProtocol;
import org.apache.phoenix.jdbc.PhoenixDatabaseMetaData;
import org.apache.phoenix.jdbc.PhoenixDriver;
-import org.apache.phoenix.query.QueryConstants;
import org.apache.phoenix.query.QueryServices;
import org.apache.phoenix.query.QueryServicesOptions;
import org.apache.phoenix.schema.SystemTaskSplitPolicy;
import org.apache.phoenix.util.PhoenixRuntime;
-import org.apache.phoenix.util.PropertiesUtil;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -74,9 +58,6 @@ import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
-import org.apache.phoenix.thirdparty.com.google.common.collect.Lists;
-
-
/**
* This class is meant for testing all compatible client versions
* against the current server version. It runs SQL queries with given
@@ -87,28 +68,6 @@ import org.apache.phoenix.thirdparty.com.google.common.collect.Lists;
@Category(NeedsOwnMiniClusterTest.class)
public class BackwardCompatibilityIT {
- private static final String SQL_DIR = "sql_files/";
- private static final String RESULTS_AND_GOLD_FILES_DIR = "gold_files/";
- private static final String COMPATIBLE_CLIENTS_JSON =
- "compatible_client_versions.json";
- private static final String BASH = "/bin/bash";
- private static final String EXECUTE_QUERY_SH = "scripts/execute_query.sh";
- private static final String QUERY_PREFIX = "query_";
- private static final String RESULT_PREFIX = "result_";
- private static final String GOLD_PREFIX = "gold_";
- private static final String SQL_EXTENSION = ".sql";
- private static final String TEXT_EXTENSION = ".txt";
- private static final String CREATE_ADD = "create_add";
- private static final String CREATE_DIVERGED_VIEW = "create_diverged_view";
- private static final String ADD_DATA = "add_data";
- private static final String ADD_DELETE = "add_delete";
- private static final String QUERY_CREATE_ADD = QUERY_PREFIX + CREATE_ADD;
- private static final String QUERY_ADD_DATA = QUERY_PREFIX + ADD_DATA;
- private static final String QUERY_ADD_DELETE = QUERY_PREFIX + ADD_DELETE;
- private static final String QUERY_CREATE_DIVERGED_VIEW = QUERY_PREFIX + CREATE_DIVERGED_VIEW;
- private static final String MVN_HOME = "maven.home";
- private static final String JAVA_TMP_DIR = "java.io.tmpdir";
-
private final String compatibleClientVersion;
private static Configuration conf;
private static HBaseTestingUtility hbaseTestUtil;
@@ -116,11 +75,6 @@ public class BackwardCompatibilityIT {
private static String url;
private String tmpDir;
- private enum UpgradeProps {
- NONE,
- SET_MAX_LOOK_BACK_AGE
- }
-
public BackwardCompatibilityIT(String compatibleClientVersion) {
this.compatibleClientVersion = compatibleClientVersion;
}
@@ -141,7 +95,7 @@ public class BackwardCompatibilityIT {
zkQuorum = "localhost:" + hbaseTestUtil.getZkCluster().getClientPort();
url = PhoenixRuntime.JDBC_PROTOCOL + PhoenixRuntime.JDBC_PROTOCOL_SEPARATOR + zkQuorum;
DriverManager.registerDriver(PhoenixDriver.INSTANCE);
- checkForPreConditions();
+ checkForPreConditions(compatibleClientVersion, conf);
}
@After
@@ -153,29 +107,6 @@ public class BackwardCompatibilityIT {
}
System.setProperty("java.io.tmpdir", tmpDir);
}
-
- private static List<String> computeClientVersions() throws Exception {
- String hbaseVersion = VersionInfo.getVersion();
- Pattern p = Pattern.compile("\\d+\\.\\d+");
- Matcher m = p.matcher(hbaseVersion);
- String hbaseProfile = null;
- if (m.find()) {
- hbaseProfile = m.group();
- }
- List<String> clientVersions = Lists.newArrayList();
- ObjectMapper mapper = new ObjectMapper();
- mapper.configure(JsonParser.Feature.ALLOW_COMMENTS, true);
- try (InputStream inputStream = BackwardCompatibilityIT.class
- .getClassLoader().getResourceAsStream(COMPATIBLE_CLIENTS_JSON)) {
- assertNotNull(inputStream);
- JsonNode jsonNode = mapper.readTree(inputStream);
- JsonNode HBaseProfile = jsonNode.get(hbaseProfile);
- for (final JsonNode clientVersion : HBaseProfile) {
- clientVersions.add(clientVersion.textValue() + "-HBase-" + hbaseProfile);
- }
- }
- return clientVersions;
- }
/**
* Scenario:
@@ -188,16 +119,16 @@ public class BackwardCompatibilityIT {
@Test
public void testUpsertWithOldClient() throws Exception {
// Insert data with old client and read with new client
- executeQueryWithClientVersion(compatibleClientVersion, CREATE_ADD);
- executeQueriesWithCurrentVersion(QUERY_CREATE_ADD, UpgradeProps.NONE);
+ executeQueryWithClientVersion(compatibleClientVersion, CREATE_ADD, zkQuorum);
+ executeQueriesWithCurrentVersion(QUERY_CREATE_ADD, url, NONE);
assertExpectedOutput(QUERY_CREATE_ADD);
}
@Test
public void testCreateDivergedViewWithOldClientReadFromNewClient() throws Exception {
// Create a base table, view and make it diverge from an old client
- executeQueryWithClientVersion(compatibleClientVersion, CREATE_DIVERGED_VIEW);
- executeQueriesWithCurrentVersion(QUERY_CREATE_DIVERGED_VIEW, UpgradeProps.NONE);
+ executeQueryWithClientVersion(compatibleClientVersion, CREATE_DIVERGED_VIEW, zkQuorum);
+ executeQueriesWithCurrentVersion(QUERY_CREATE_DIVERGED_VIEW, url, NONE);
assertExpectedOutput(QUERY_CREATE_DIVERGED_VIEW);
}
@@ -205,17 +136,16 @@ public class BackwardCompatibilityIT {
public void testCreateDivergedViewWithOldClientReadWithMaxLookBackAge()
throws Exception {
// Create a base table, view and make it diverge from an old client
- executeQueryWithClientVersion(compatibleClientVersion, CREATE_DIVERGED_VIEW);
- executeQueriesWithCurrentVersion(QUERY_CREATE_DIVERGED_VIEW,
- UpgradeProps.SET_MAX_LOOK_BACK_AGE);
+ executeQueryWithClientVersion(compatibleClientVersion, CREATE_DIVERGED_VIEW, zkQuorum);
+ executeQueriesWithCurrentVersion(QUERY_CREATE_DIVERGED_VIEW, url, SET_MAX_LOOK_BACK_AGE);
assertExpectedOutput(QUERY_CREATE_DIVERGED_VIEW);
}
@Test
public void testCreateDivergedViewWithOldClientReadFromOldClient() throws Exception {
// Create a base table, view and make it diverge from an old client
- executeQueryWithClientVersion(compatibleClientVersion, CREATE_DIVERGED_VIEW);
- executeQueryWithClientVersion(compatibleClientVersion, QUERY_CREATE_DIVERGED_VIEW);
+ executeQueryWithClientVersion(compatibleClientVersion, CREATE_DIVERGED_VIEW, zkQuorum);
+ executeQueryWithClientVersion(compatibleClientVersion, QUERY_CREATE_DIVERGED_VIEW, zkQuorum);
assertExpectedOutput(QUERY_CREATE_DIVERGED_VIEW);
}
@@ -223,26 +153,26 @@ public class BackwardCompatibilityIT {
public void testCreateDivergedViewWithOldClientReadFromOldClientAfterUpgrade()
throws Exception {
// Create a base table, view and make it diverge from an old client
- executeQueryWithClientVersion(compatibleClientVersion, CREATE_DIVERGED_VIEW);
+ executeQueryWithClientVersion(compatibleClientVersion, CREATE_DIVERGED_VIEW, zkQuorum);
try (Connection conn = DriverManager.getConnection(url)) {
// Just connect with a new client to cause a metadata upgrade
}
// Query with an old client again
- executeQueryWithClientVersion(compatibleClientVersion, QUERY_CREATE_DIVERGED_VIEW);
+ executeQueryWithClientVersion(compatibleClientVersion, QUERY_CREATE_DIVERGED_VIEW, zkQuorum);
assertExpectedOutput(QUERY_CREATE_DIVERGED_VIEW);
}
@Test
public void testCreateDivergedViewWithNewClientReadFromOldClient() throws Exception {
- executeQueriesWithCurrentVersion(CREATE_DIVERGED_VIEW, UpgradeProps.NONE);
- executeQueryWithClientVersion(compatibleClientVersion, QUERY_CREATE_DIVERGED_VIEW);
+ executeQueriesWithCurrentVersion(CREATE_DIVERGED_VIEW, url, NONE);
+ executeQueryWithClientVersion(compatibleClientVersion, QUERY_CREATE_DIVERGED_VIEW, zkQuorum);
assertExpectedOutput(QUERY_CREATE_DIVERGED_VIEW);
}
@Test
public void testCreateDivergedViewWithNewClientReadFromNewClient() throws Exception {
- executeQueriesWithCurrentVersion(CREATE_DIVERGED_VIEW, UpgradeProps.NONE);
- executeQueriesWithCurrentVersion(QUERY_CREATE_DIVERGED_VIEW, UpgradeProps.NONE);
+ executeQueriesWithCurrentVersion(CREATE_DIVERGED_VIEW, url, NONE);
+ executeQueriesWithCurrentVersion(QUERY_CREATE_DIVERGED_VIEW, url, NONE);
assertExpectedOutput(QUERY_CREATE_DIVERGED_VIEW);
}
@@ -257,8 +187,8 @@ public class BackwardCompatibilityIT {
@Test
public void testSelectWithOldClient() throws Exception {
// Insert data with new client and read with old client
- executeQueriesWithCurrentVersion(CREATE_ADD, UpgradeProps.NONE);
- executeQueryWithClientVersion(compatibleClientVersion, QUERY_CREATE_ADD);
+ executeQueriesWithCurrentVersion(CREATE_ADD, url, NONE);
+ executeQueryWithClientVersion(compatibleClientVersion, QUERY_CREATE_ADD, zkQuorum);
assertExpectedOutput(QUERY_CREATE_ADD);
}
@@ -277,13 +207,13 @@ public class BackwardCompatibilityIT {
@Test
public void testSelectUpsertWithNewClientWithMaxLookBackAge() throws Exception {
// Insert data with old client and read with new client
- executeQueryWithClientVersion(compatibleClientVersion, CREATE_ADD);
- executeQueriesWithCurrentVersion(QUERY_CREATE_ADD, UpgradeProps.SET_MAX_LOOK_BACK_AGE);
+ executeQueryWithClientVersion(compatibleClientVersion, CREATE_ADD, zkQuorum);
+ executeQueriesWithCurrentVersion(QUERY_CREATE_ADD, url, SET_MAX_LOOK_BACK_AGE);
assertExpectedOutput(QUERY_CREATE_ADD);
// Insert more data with new client and read with old client
- executeQueriesWithCurrentVersion(ADD_DATA, UpgradeProps.SET_MAX_LOOK_BACK_AGE);
- executeQueryWithClientVersion(compatibleClientVersion, QUERY_ADD_DATA);
+ executeQueriesWithCurrentVersion(ADD_DATA, url, SET_MAX_LOOK_BACK_AGE);
+ executeQueryWithClientVersion(compatibleClientVersion, QUERY_ADD_DATA, zkQuorum);
assertExpectedOutput(QUERY_ADD_DATA);
}
@@ -300,13 +230,13 @@ public class BackwardCompatibilityIT {
@Test
public void testSelectUpsertWithNewClient() throws Exception {
// Insert data with old client and read with new client
- executeQueryWithClientVersion(compatibleClientVersion, CREATE_ADD);
- executeQueriesWithCurrentVersion(QUERY_CREATE_ADD, UpgradeProps.NONE);
+ executeQueryWithClientVersion(compatibleClientVersion, CREATE_ADD, zkQuorum);
+ executeQueriesWithCurrentVersion(QUERY_CREATE_ADD, url, NONE);
assertExpectedOutput(QUERY_CREATE_ADD);
// Insert more data with new client and read with old client
- executeQueriesWithCurrentVersion(ADD_DATA, UpgradeProps.NONE);
- executeQueryWithClientVersion(compatibleClientVersion, QUERY_ADD_DATA);
+ executeQueriesWithCurrentVersion(ADD_DATA, url, NONE);
+ executeQueryWithClientVersion(compatibleClientVersion, QUERY_ADD_DATA, zkQuorum);
assertExpectedOutput(QUERY_ADD_DATA);
}
@@ -323,13 +253,13 @@ public class BackwardCompatibilityIT {
@Test
public void testSelectUpsertWithOldClient() throws Exception {
// Insert data with new client and read with old client
- executeQueriesWithCurrentVersion(CREATE_ADD, UpgradeProps.NONE);
- executeQueryWithClientVersion(compatibleClientVersion, QUERY_CREATE_ADD);
+ executeQueriesWithCurrentVersion(CREATE_ADD, url, NONE);
+ executeQueryWithClientVersion(compatibleClientVersion, QUERY_CREATE_ADD, zkQuorum);
assertExpectedOutput(QUERY_CREATE_ADD);
// Insert more data with old client and read with new client
- executeQueryWithClientVersion(compatibleClientVersion, ADD_DATA);
- executeQueriesWithCurrentVersion(QUERY_ADD_DATA, UpgradeProps.NONE);
+ executeQueryWithClientVersion(compatibleClientVersion, ADD_DATA, zkQuorum);
+ executeQueriesWithCurrentVersion(QUERY_ADD_DATA, url, NONE);
assertExpectedOutput(QUERY_ADD_DATA);
}
@@ -345,13 +275,13 @@ public class BackwardCompatibilityIT {
@Test
public void testUpsertDeleteWithOldClient() throws Exception {
// Insert data with old client and read with new client
- executeQueryWithClientVersion(compatibleClientVersion, CREATE_ADD);
- executeQueriesWithCurrentVersion(QUERY_CREATE_ADD, UpgradeProps.NONE);
+ executeQueryWithClientVersion(compatibleClientVersion, CREATE_ADD, zkQuorum);
+ executeQueriesWithCurrentVersion(QUERY_CREATE_ADD, url, NONE);
assertExpectedOutput(QUERY_CREATE_ADD);
// Deletes with the old client
- executeQueryWithClientVersion(compatibleClientVersion, ADD_DELETE);
- executeQueryWithClientVersion(compatibleClientVersion, QUERY_ADD_DELETE);
+ executeQueryWithClientVersion(compatibleClientVersion, ADD_DELETE, zkQuorum);
+ executeQueryWithClientVersion(compatibleClientVersion, QUERY_ADD_DELETE, zkQuorum);
assertExpectedOutput(QUERY_ADD_DELETE);
}
@@ -367,22 +297,20 @@ public class BackwardCompatibilityIT {
@Test
public void testUpsertDeleteWithNewClient() throws Exception {
// Insert data with old client and read with new client
- executeQueriesWithCurrentVersion(CREATE_ADD, UpgradeProps.NONE);
- executeQueryWithClientVersion(compatibleClientVersion, QUERY_CREATE_ADD);
+ executeQueriesWithCurrentVersion(CREATE_ADD, url, NONE);
+ executeQueryWithClientVersion(compatibleClientVersion, QUERY_CREATE_ADD, zkQuorum);
assertExpectedOutput(QUERY_CREATE_ADD);
// Deletes with the new client
- executeQueriesWithCurrentVersion(ADD_DELETE, UpgradeProps.NONE);
- executeQueriesWithCurrentVersion(QUERY_ADD_DELETE, UpgradeProps.NONE);
+ executeQueriesWithCurrentVersion(ADD_DELETE,url, NONE);
+ executeQueriesWithCurrentVersion(QUERY_ADD_DELETE, url, NONE);
assertExpectedOutput(QUERY_ADD_DELETE);
}
@Test
public void testUpdatedSplitPolicyForSysTask() throws Exception {
- executeQueryWithClientVersion(compatibleClientVersion,
- CREATE_DIVERGED_VIEW);
- executeQueriesWithCurrentVersion(QUERY_CREATE_DIVERGED_VIEW,
- UpgradeProps.NONE);
+ executeQueryWithClientVersion(compatibleClientVersion, CREATE_DIVERGED_VIEW, zkQuorum);
+ executeQueriesWithCurrentVersion(QUERY_CREATE_DIVERGED_VIEW, url, NONE);
try (org.apache.hadoop.hbase.client.Connection conn =
hbaseTestUtil.getConnection(); Admin admin = conn.getAdmin()) {
TableDescriptor tableDescriptor = admin.getDescriptor(
@@ -394,199 +322,4 @@ public class BackwardCompatibilityIT {
}
assertExpectedOutput(QUERY_CREATE_DIVERGED_VIEW);
}
-
- private void checkForPreConditions() throws Exception {
- // For the first code cut of any major version, there wouldn't be any backward compatible
- // clients. Hence the test wouldn't run and just return true when the client
- // version to be tested is same as current version
- assumeFalse(compatibleClientVersion.contains(MetaDataProtocol.CURRENT_CLIENT_VERSION));
- // Make sure that cluster is clean before test execution with no system tables
- try (org.apache.hadoop.hbase.client.Connection conn =
- ConnectionFactory.createConnection(conf);
- Admin admin = conn.getAdmin()) {
- assertFalse(admin.tableExists(TableName.valueOf(QueryConstants.SYSTEM_SCHEMA_NAME,
- PhoenixDatabaseMetaData.SYSTEM_CATALOG_TABLE)));
- }
- }
-
- // Executes the queries listed in the operation file with a given client version
- private void executeQueryWithClientVersion(String clientVersion, String operation)
- throws Exception {
- List<String> cmdParams = Lists.newArrayList();
- cmdParams.add(BASH);
- // Note that auto-commit is true for queries executed via SQLline
- URL fileUrl = BackwardCompatibilityIT.class.getClassLoader().getResource(EXECUTE_QUERY_SH);
- assertNotNull(fileUrl);
- cmdParams.add(new File(fileUrl.getFile()).getAbsolutePath());
- cmdParams.add(zkQuorum);
- cmdParams.add(clientVersion);
-
- fileUrl = BackwardCompatibilityIT.class.getClassLoader()
- .getResource(SQL_DIR + operation + SQL_EXTENSION);
- assertNotNull(fileUrl);
- cmdParams.add(new File(fileUrl.getFile()).getAbsolutePath());
- fileUrl = BackwardCompatibilityIT.class.getClassLoader().getResource(
- RESULTS_AND_GOLD_FILES_DIR);
- assertNotNull(fileUrl);
- String resultFilePath = new File(fileUrl.getFile()).getAbsolutePath() + "/" +
- RESULT_PREFIX + operation + TEXT_EXTENSION;
- cmdParams.add(resultFilePath);
- cmdParams.add(System.getProperty(JAVA_TMP_DIR));
-
- if (System.getProperty(MVN_HOME) != null) {
- cmdParams.add(System.getProperty(MVN_HOME));
- }
-
- ProcessBuilder pb = new ProcessBuilder(cmdParams);
- final Process p = pb.start();
- final StringBuffer sb = new StringBuffer();
- //Capture the output stream if any from the execution of the script
- Thread outputStreamThread = new Thread() {
- @Override
- public void run() {
- try (BufferedReader reader = new BufferedReader(
- new InputStreamReader(p.getInputStream()))) {
- String line;
- while ((line = reader.readLine()) != null) {
- sb.append(line);
- }
- } catch (final Exception e) {
- sb.append(e.getMessage());
- }
- }
- };
- outputStreamThread.start();
- //Capture the error stream if any from the execution of the script
- Thread errorStreamThread = new Thread() {
- @Override
- public void run() {
- try (BufferedReader reader = new BufferedReader(
- new InputStreamReader(p.getErrorStream()))) {
- String line;
- while ((line = reader.readLine()) != null) {
- sb.append(line);
- }
- } catch (final Exception e) {
- sb.append(e.getMessage());
- }
- }
- };
- errorStreamThread.start();
- p.waitFor();
- assertEquals(String.format("Executing the query failed%s. Check the result file: %s",
- sb.length() > 0 ? sb.append(" with : ").toString() : "", resultFilePath),
- 0, p.exitValue());
- }
-
- // Executes the SQL commands listed in the given operation file from the sql_files directory
- private void executeQueriesWithCurrentVersion(String operation,
- UpgradeProps upgradeProps) throws Exception {
- Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
- if (UpgradeProps.SET_MAX_LOOK_BACK_AGE.equals(upgradeProps)) {
- // any value < 31 is enough to test relaxing the MaxLookBack age
- // checks during an upgrade because during upgrade, SCN for the
- // connection is set to be the phoenix version timestamp
- // (31 as of now: MIN_SYSTEM_TABLE_TIMESTAMP_4_16_0 / MIN_SYSTEM_TABLE_TIMESTAMP_5_1_0)
- // Hence, keeping value: 15
- props.put(CompatBaseScannerRegionObserver.PHOENIX_MAX_LOOKBACK_AGE_CONF_KEY,
- Integer.toString(15));
- }
-
- try (Connection conn = DriverManager.getConnection(url, props)) {
- StringBuilder sb = new StringBuilder();
- try (BufferedReader reader =
- getBufferedReaderForResource(SQL_DIR + operation + SQL_EXTENSION)) {
- String sqlCommand;
- while ((sqlCommand = reader.readLine()) != null) {
- sqlCommand = sqlCommand.trim();
- if (sqlCommand.length() == 0 || sqlCommand.startsWith("/")
- || sqlCommand.startsWith("*")) {
- continue;
- }
- sb.append(sqlCommand);
- }
- }
- ResultSet rs;
- String[] sqlCommands = sb.toString().split(";");
-
- URL fileUrl = BackwardCompatibilityIT.class.getClassLoader().getResource(
- RESULTS_AND_GOLD_FILES_DIR);
- assertNotNull(fileUrl);
- final String resultFile = new File(fileUrl.getFile()).getAbsolutePath() + "/" +
- RESULT_PREFIX + operation + TEXT_EXTENSION;
- try (BufferedWriter br = new BufferedWriter(new FileWriter(resultFile))) {
- for (String command : sqlCommands) {
- try (PreparedStatement stmt = conn.prepareStatement(command)) {
- stmt.execute();
- rs = stmt.getResultSet();
- if (rs != null) {
- saveResultSet(rs, br);
- }
- }
- conn.commit();
- }
- }
- }
- }
-
- // Saves the result set to a text file to be compared against the gold file for difference
- private void saveResultSet(ResultSet rs, BufferedWriter br) throws Exception {
- ResultSetMetaData rsm = rs.getMetaData();
- int columnCount = rsm.getColumnCount();
- StringBuilder row = new StringBuilder(formatStringWithQuotes(rsm.getColumnName(1)));
- for (int i = 2; i <= columnCount; i++) {
- row.append(",").append(formatStringWithQuotes(rsm.getColumnName(i)));
- }
- br.write(row.toString());
- br.write("\n");
- while (rs.next()) {
- row = new StringBuilder(formatStringWithQuotes(rs.getString(1)));
- for (int i = 2; i <= columnCount; i++) {
- row.append(",").append(formatStringWithQuotes(rs.getString(i)));
- }
- br.write(row.toString());
- br.write("\n");
- }
- }
-
- private String formatStringWithQuotes(String str) {
- return (str != null) ? String.format("\'%s\'", str) : "\'\'";
- }
-
- private BufferedReader getBufferedReaderForResource(String relativePath)
- throws FileNotFoundException {
- URL fileUrl = getClass().getClassLoader().getResource(relativePath);
- assertNotNull(fileUrl);
- return new BufferedReader(new FileReader(new File(fileUrl.getFile())));
- }
-
- // Compares the result file against the gold file to match for the expected output
- // for the given operation
- private void assertExpectedOutput(String result) throws Exception {
- List<String> resultFile = Lists.newArrayList();
- List<String> goldFile = Lists.newArrayList();
- String line;
- try (BufferedReader resultFileReader = getBufferedReaderForResource(
- RESULTS_AND_GOLD_FILES_DIR + RESULT_PREFIX + result + TEXT_EXTENSION)) {
- while ((line = resultFileReader.readLine()) != null) {
- resultFile.add(line.trim());
- }
- }
- try (BufferedReader goldFileReader = getBufferedReaderForResource(
- RESULTS_AND_GOLD_FILES_DIR + GOLD_PREFIX + result + TEXT_EXTENSION)) {
- while ((line = goldFileReader.readLine()) != null) {
- line = line.trim();
- if ( !(line.isEmpty() || line.startsWith("*") || line.startsWith("/"))) {
- goldFile.add(line);
- }
- }
- }
-
- // We take the first line in gold file and match against the result file to exclude any
- // other WARNING messages that comes as a result of the query execution
- int index = resultFile.indexOf(goldFile.get(0));
- assertNotEquals("Mismatch found between gold file and result file", -1, index);
- resultFile = resultFile.subList(index, resultFile.size());
- assertEquals(goldFile, resultFile);
- }
}
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/BackwardCompatibilityTestUtil.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/BackwardCompatibilityTestUtil.java
new file mode 100644
index 0000000..7689b30
--- /dev/null
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/BackwardCompatibilityTestUtil.java
@@ -0,0 +1,315 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.phoenix.end2end;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hbase.TableName;
+import org.apache.hadoop.hbase.client.Admin;
+import org.apache.hadoop.hbase.client.ConnectionFactory;
+import org.apache.hadoop.hbase.util.VersionInfo;
+import org.apache.phoenix.compat.hbase.coprocessor.CompatBaseScannerRegionObserver;
+import org.apache.phoenix.coprocessor.MetaDataProtocol;
+import org.apache.phoenix.jdbc.PhoenixDatabaseMetaData;
+import org.apache.phoenix.query.QueryConstants;
+import org.apache.phoenix.util.PropertiesUtil;
+import org.apache.phoenix.thirdparty.com.google.common.collect.Lists;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.util.List;
+import java.util.Properties;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import static org.apache.phoenix.util.TestUtil.TEST_PROPERTIES;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assume.assumeFalse;
+
+public final class BackwardCompatibilityTestUtil {
+ public static final String SQL_DIR = "sql_files/";
+ public static final String RESULTS_AND_GOLD_FILES_DIR = "gold_files/";
+ public static final String COMPATIBLE_CLIENTS_JSON =
+ "compatible_client_versions.json";
+ public static final String BASH = "/bin/bash";
+ public static final String EXECUTE_QUERY_SH = "scripts/execute_query.sh";
+ public static final String QUERY_PREFIX = "query_";
+ public static final String RESULT_PREFIX = "result_";
+ public static final String GOLD_PREFIX = "gold_";
+ public static final String SQL_EXTENSION = ".sql";
+ public static final String TEXT_EXTENSION = ".txt";
+ public static final String CREATE_ADD = "create_add";
+ public static final String CREATE_TMP_TABLE = "create_tmp_table";
+ public static final String CREATE_DIVERGED_VIEW = "create_diverged_view";
+ public static final String ADD_DATA = "add_data";
+ public static final String ADD_DELETE = "add_delete";
+ public static final String DELETE = "delete";
+ public static final String SELECT_AND_DROP_TABLE = "select_and_drop_table";
+ public static final String QUERY_CREATE_ADD = QUERY_PREFIX + CREATE_ADD;
+ public static final String QUERY_ADD_DATA = QUERY_PREFIX + ADD_DATA;
+ public static final String QUERY_ADD_DELETE = QUERY_PREFIX + ADD_DELETE;
+ public static final String QUERY_DELETE = QUERY_PREFIX + DELETE;
+ public static final String QUERY_SELECT_AND_DROP_TABLE = QUERY_PREFIX + SELECT_AND_DROP_TABLE;
+ public static final String QUERY_CREATE_DIVERGED_VIEW = QUERY_PREFIX + CREATE_DIVERGED_VIEW;
+ public static final String MVN_HOME = "maven.home";
+ public static final String JAVA_TMP_DIR = "java.io.tmpdir";
+
+ public enum UpgradeProps {
+ NONE,
+ SET_MAX_LOOK_BACK_AGE
+ }
+
+ private BackwardCompatibilityTestUtil() {
+ }
+
+ public static List<String> computeClientVersions() throws Exception {
+ String hbaseVersion = VersionInfo.getVersion();
+ Pattern p = Pattern.compile("\\d+\\.\\d+");
+ Matcher m = p.matcher(hbaseVersion);
+ String hbaseProfile = null;
+ if (m.find()) {
+ hbaseProfile = m.group();
+ }
+ List<String> clientVersions = Lists.newArrayList();
+ ObjectMapper mapper = new ObjectMapper();
+ mapper.configure(JsonParser.Feature.ALLOW_COMMENTS, true);
+ try (InputStream inputStream = BackwardCompatibilityIT.class
+ .getClassLoader().getResourceAsStream(COMPATIBLE_CLIENTS_JSON)) {
+ assertNotNull(inputStream);
+ JsonNode jsonNode = mapper.readTree(inputStream);
+ JsonNode HBaseProfile = jsonNode.get(hbaseProfile);
+ for (final JsonNode clientVersion : HBaseProfile) {
+ clientVersions.add(clientVersion.textValue() + "-HBase-" + hbaseProfile);
+ }
+ }
+ return clientVersions;
+ }
+
+ // Executes the queries listed in the operation file with a given client version
+ public static void executeQueryWithClientVersion(String clientVersion, String operation,
+ String zkQuorum) throws Exception {
+ List<String> cmdParams = Lists.newArrayList();
+ cmdParams.add(BASH);
+ // Note that auto-commit is true for queries executed via SQLline
+ URL fileUrl = BackwardCompatibilityIT.class.getClassLoader().getResource(EXECUTE_QUERY_SH);
+ assertNotNull(fileUrl);
+ cmdParams.add(new File(fileUrl.getFile()).getAbsolutePath());
+ cmdParams.add(zkQuorum);
+ cmdParams.add(clientVersion);
+
+ fileUrl = BackwardCompatibilityIT.class.getClassLoader()
+ .getResource(SQL_DIR + operation + SQL_EXTENSION);
+ assertNotNull(fileUrl);
+ cmdParams.add(new File(fileUrl.getFile()).getAbsolutePath());
+ fileUrl = BackwardCompatibilityIT.class.getClassLoader().getResource(
+ RESULTS_AND_GOLD_FILES_DIR);
+ assertNotNull(fileUrl);
+ String resultFilePath = new File(fileUrl.getFile()).getAbsolutePath() + "/" +
+ RESULT_PREFIX + operation + TEXT_EXTENSION;
+ cmdParams.add(resultFilePath);
+ cmdParams.add(System.getProperty(JAVA_TMP_DIR));
+
+ if (System.getProperty(MVN_HOME) != null) {
+ cmdParams.add(System.getProperty(MVN_HOME));
+ }
+
+ ProcessBuilder pb = new ProcessBuilder(cmdParams);
+ final Process p = pb.start();
+ final StringBuffer sb = new StringBuffer();
+ //Capture the output stream if any from the execution of the script
+ Thread outputStreamThread = new Thread() {
+ @Override
+ public void run() {
+ try (BufferedReader reader = new BufferedReader(
+ new InputStreamReader(p.getInputStream()))) {
+ String line;
+ while ((line = reader.readLine()) != null) {
+ sb.append(line);
+ }
+ } catch (final Exception e) {
+ sb.append(e.getMessage());
+ }
+ }
+ };
+ outputStreamThread.start();
+ //Capture the error stream if any from the execution of the script
+ Thread errorStreamThread = new Thread() {
+ @Override
+ public void run() {
+ try (BufferedReader reader = new BufferedReader(
+ new InputStreamReader(p.getErrorStream()))) {
+ String line;
+ while ((line = reader.readLine()) != null) {
+ sb.append(line);
+ }
+ } catch (final Exception e) {
+ sb.append(e.getMessage());
+ }
+ }
+ };
+ errorStreamThread.start();
+ p.waitFor();
+ assertEquals(String.format("Executing the query failed%s. Check the result file: %s",
+ sb.length() > 0 ? sb.append(" with : ").toString() : "", resultFilePath),
+ 0, p.exitValue());
+ }
+
+
+ public static void checkForPreConditions(String compatibleClientVersion, Configuration conf) throws Exception {
+ // For the first code cut of any major version, there wouldn't be any backward compatible
+ // clients. Hence the test wouldn't run and just return true when the client
+ // version to be tested is same as current version
+ assumeFalse(compatibleClientVersion.contains(MetaDataProtocol.CURRENT_CLIENT_VERSION));
+ // Make sure that cluster is clean before test execution with no system tables
+ try (org.apache.hadoop.hbase.client.Connection conn =
+ ConnectionFactory.createConnection(conf);
+ Admin admin = conn.getAdmin()) {
+ assertFalse(admin.tableExists(TableName.valueOf(QueryConstants.SYSTEM_SCHEMA_NAME,
+ PhoenixDatabaseMetaData.SYSTEM_CATALOG_TABLE)));
+ }
+ }
+
+ // Saves the result set to a text file to be compared against the gold file for difference
+ private static void saveResultSet(ResultSet rs, BufferedWriter br) throws Exception {
+ ResultSetMetaData rsm = rs.getMetaData();
+ int columnCount = rsm.getColumnCount();
+ StringBuilder row = new StringBuilder(formatStringWithQuotes(rsm.getColumnName(1)));
+ for (int i = 2; i <= columnCount; i++) {
+ row.append(",").append(formatStringWithQuotes(rsm.getColumnName(i)));
+ }
+ br.write(row.toString());
+ br.write("\n");
+ while (rs.next()) {
+ row = new StringBuilder(formatStringWithQuotes(rs.getString(1)));
+ for (int i = 2; i <= columnCount; i++) {
+ row.append(",").append(formatStringWithQuotes(rs.getString(i)));
+ }
+ br.write(row.toString());
+ br.write("\n");
+ }
+ }
+
+ private static String formatStringWithQuotes(String str) {
+ return (str != null) ? String.format("\'%s\'", str) : "\'\'";
+ }
+
+ private static BufferedReader getBufferedReaderForResource(String relativePath)
+ throws FileNotFoundException {
+ URL fileUrl = BackwardCompatibilityTestUtil.class.getClassLoader().getResource(relativePath);
+ assertNotNull(fileUrl);
+ return new BufferedReader(new FileReader(new File(fileUrl.getFile())));
+ }
+
+ // Compares the result file against the gold file to match for the expected output
+ // for the given operation
+ public static void assertExpectedOutput(String result) throws Exception {
+ List<String> resultFile = Lists.newArrayList();
+ List<String> goldFile = Lists.newArrayList();
+ String line;
+ try (BufferedReader resultFileReader = getBufferedReaderForResource(
+ RESULTS_AND_GOLD_FILES_DIR + RESULT_PREFIX + result + TEXT_EXTENSION)) {
+ while ((line = resultFileReader.readLine()) != null) {
+ resultFile.add(line.trim());
+ }
+ }
+ try (BufferedReader goldFileReader = getBufferedReaderForResource(
+ RESULTS_AND_GOLD_FILES_DIR + GOLD_PREFIX + result + TEXT_EXTENSION)) {
+ while ((line = goldFileReader.readLine()) != null) {
+ line = line.trim();
+ if ( !(line.isEmpty() || line.startsWith("*") || line.startsWith("/"))) {
+ goldFile.add(line);
+ }
+ }
+ }
+
+ // We take the first line in gold file and match against the result file to exclude any
+ // other WARNING messages that comes as a result of the query execution
+ int index = resultFile.indexOf(goldFile.get(0));
+ assertNotEquals("Mismatch found between gold file and result file", -1, index);
+ resultFile = resultFile.subList(index, resultFile.size());
+ assertEquals(goldFile, resultFile);
+ }
+
+ // Executes the SQL commands listed in the given operation file from the sql_files directory
+ public static void executeQueriesWithCurrentVersion(String operation, String url,
+ UpgradeProps upgradeProps) throws Exception {
+ Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
+ if (UpgradeProps.SET_MAX_LOOK_BACK_AGE.equals(upgradeProps)) {
+ // any value < 31 is enough to test relaxing the MaxLookBack age
+ // checks during an upgrade because during upgrade, SCN for the
+ // connection is set to be the phoenix version timestamp
+ // (31 as of now: MIN_SYSTEM_TABLE_TIMESTAMP_4_16_0 / MIN_SYSTEM_TABLE_TIMESTAMP_5_1_0)
+ // Hence, keeping value: 15
+ props.put(CompatBaseScannerRegionObserver.PHOENIX_MAX_LOOKBACK_AGE_CONF_KEY,
+ Integer.toString(15));
+ }
+
+ try (Connection conn = DriverManager.getConnection(url, props)) {
+ StringBuilder sb = new StringBuilder();
+ try (BufferedReader reader =
+ getBufferedReaderForResource(SQL_DIR + operation + SQL_EXTENSION)) {
+ String sqlCommand;
+ while ((sqlCommand = reader.readLine()) != null) {
+ sqlCommand = sqlCommand.trim();
+ if (sqlCommand.length() == 0 || sqlCommand.startsWith("/")
+ || sqlCommand.startsWith("*")) {
+ continue;
+ }
+ sb.append(sqlCommand);
+ }
+ }
+ ResultSet rs;
+ String[] sqlCommands = sb.toString().split(";");
+
+ URL fileUrl = BackwardCompatibilityIT.class.getClassLoader().getResource(
+ RESULTS_AND_GOLD_FILES_DIR);
+ assertNotNull(fileUrl);
+ final String resultFile = new File(fileUrl.getFile()).getAbsolutePath() + "/" +
+ RESULT_PREFIX + operation + TEXT_EXTENSION;
+ try (BufferedWriter br = new BufferedWriter(new FileWriter(resultFile))) {
+ for (String command : sqlCommands) {
+ try (PreparedStatement stmt = conn.prepareStatement(command)) {
+ stmt.execute();
+ rs = stmt.getResultSet();
+ if (rs != null) {
+ saveResultSet(rs, br);
+ }
+ }
+ conn.commit();
+ }
+ }
+ }
+ }
+}
diff --git a/phoenix-core/src/it/resources/gold_files/gold_query_delete.txt b/phoenix-core/src/it/resources/gold_files/gold_query_delete.txt
new file mode 100644
index 0000000..3607c2b
--- /dev/null
+++ b/phoenix-core/src/it/resources/gold_files/gold_query_delete.txt
@@ -0,0 +1,22 @@
+ /*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+ 'COUNT(1)'
+'1'
+'ID','NAME'
+'a','a_name'
\ No newline at end of file
diff --git a/phoenix-core/src/it/resources/gold_files/gold_query_select_and_drop_table.txt b/phoenix-core/src/it/resources/gold_files/gold_query_select_and_drop_table.txt
new file mode 100644
index 0000000..36da41a
--- /dev/null
+++ b/phoenix-core/src/it/resources/gold_files/gold_query_select_and_drop_table.txt
@@ -0,0 +1,22 @@
+ /*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+ 'COUNT(1)'
+'1'
+'ID','NAME'
+'a','a_name'
diff --git a/phoenix-core/src/it/resources/sql_files/create_tmp_table.sql b/phoenix-core/src/it/resources/sql_files/create_tmp_table.sql
new file mode 100644
index 0000000..8723487
--- /dev/null
+++ b/phoenix-core/src/it/resources/sql_files/create_tmp_table.sql
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+CREATE TABLE if not exists my_schema.my_table_delete2
+ (id VARCHAR not null primary key, name VARCHAR) SALT_BUCKETS=4;
+UPSERT INTO my_schema.my_table_delete2 values ('a','a_name');
\ No newline at end of file
diff --git a/phoenix-core/src/it/resources/sql_files/query_delete.sql b/phoenix-core/src/it/resources/sql_files/query_delete.sql
new file mode 100644
index 0000000..d963c8e
--- /dev/null
+++ b/phoenix-core/src/it/resources/sql_files/query_delete.sql
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+CREATE TABLE if not exists my_schema.my_table_delete
+ (id VARCHAR not null primary key, name VARCHAR) SALT_BUCKETS=4;
+UPSERT INTO my_schema.my_table_delete values ('a','a_name');
+
+SELECT COUNT(*) from my_schema.my_table_delete;
+SELECT * from my_schema.my_table_delete;
diff --git a/phoenix-core/src/it/resources/sql_files/query_select_and_drop_table.sql b/phoenix-core/src/it/resources/sql_files/query_select_and_drop_table.sql
new file mode 100644
index 0000000..8de2410
--- /dev/null
+++ b/phoenix-core/src/it/resources/sql_files/query_select_and_drop_table.sql
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+SELECT COUNT(*) from my_schema.my_table_delete2;
+SELECT * from my_schema.my_table_delete2;
+DROP TABLE IF EXISTS my_schema.my_table_delete2;
\ No newline at end of file
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java b/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java
index 3f24f6b..fb77387 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java
@@ -3370,11 +3370,28 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements RegionCopr
PhoenixDatabaseMetaData.SYSTEM_CATALOG_TABLE_BYTES, HConstants.LATEST_TIMESTAMP, null,
request.getClientVersion());
} catch (Throwable t) {
- LOGGER.error("loading system catalog table inside getVersion failed", t);
- ProtobufUtil.setControllerException(controller,
- ServerUtil.createIOException(
- SchemaUtil.getPhysicalTableName(PhoenixDatabaseMetaData.SYSTEM_CATALOG_NAME_BYTES,
- isTablesMappingEnabled).toString(), t));
+ boolean isErrorSwallowed = false;
+ if (t instanceof SQLException &&
+ ((SQLException) t).getErrorCode() == SQLExceptionCode.GET_TABLE_ERROR.getErrorCode()) {
+ Region region = env.getRegion();
+ final byte[] key = SchemaUtil.getTableKey(
+ ByteUtil.EMPTY_BYTE_ARRAY,
+ PhoenixDatabaseMetaData.SYSTEM_CATALOG_SCHEMA_BYTES,
+ PhoenixDatabaseMetaData.SYSTEM_CATALOG_TABLE_BYTES);
+ if (!region.getRegionInfo().containsRow(key) &&
+ request.getClientVersion() < MIN_SPLITTABLE_SYSTEM_CATALOG) {
+ LOGGER.debug("The pre-4.15 client is trying to get SYSTEM.CATALOG " +
+ "region that contains head row");
+ isErrorSwallowed = true;
+ }
+ }
+ if (!isErrorSwallowed) {
+ LOGGER.error("loading system catalog table inside getVersion failed", t);
+ ProtobufUtil.setControllerException(controller,
+ ServerUtil.createIOException(
+ SchemaUtil.getPhysicalTableName(PhoenixDatabaseMetaData.SYSTEM_CATALOG_NAME_BYTES,
+ isTablesMappingEnabled).toString(), t));
+ }
}
// In case this is the first connection, system catalog does not exist, and so we don't
// set the optional system catalog timestamp.