PHOENIX-1703 Fail connection when server minor version is less than client minor version
Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/4bc162d8 Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/4bc162d8 Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/4bc162d8 Branch: refs/heads/4.x-HBase-1.x Commit: 4bc162d8f254d01bfff71d429a124e5c2d146054 Parents: a29e163 Author: James Taylor <jtay...@salesforce.com> Authored: Thu Mar 19 22:23:20 2015 -0700 Committer: James Taylor <jtay...@salesforce.com> Committed: Sat Mar 21 11:10:04 2015 -0700 ---------------------------------------------------------------------- .../org/apache/phoenix/util/MetaDataUtil.java | 22 +++++++++++++------- .../apache/phoenix/util/MetaDataUtilTest.java | 18 +++++++++------- 2 files changed, 24 insertions(+), 16 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/4bc162d8/phoenix-core/src/main/java/org/apache/phoenix/util/MetaDataUtil.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/util/MetaDataUtil.java b/phoenix-core/src/main/java/org/apache/phoenix/util/MetaDataUtil.java index c1aa2cc..f916f5b 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/util/MetaDataUtil.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/util/MetaDataUtil.java @@ -49,16 +49,16 @@ import org.apache.phoenix.hbase.index.util.VersionUtil; import org.apache.phoenix.jdbc.PhoenixConnection; import org.apache.phoenix.jdbc.PhoenixDatabaseMetaData; import org.apache.phoenix.query.QueryConstants; -import org.apache.phoenix.schema.types.PBoolean; -import org.apache.phoenix.schema.types.PDataType; -import org.apache.phoenix.schema.types.PLong; import org.apache.phoenix.schema.PName; -import org.apache.phoenix.schema.types.PSmallint; import org.apache.phoenix.schema.PTable; import org.apache.phoenix.schema.PTableType; import org.apache.phoenix.schema.SequenceKey; import org.apache.phoenix.schema.SortOrder; import org.apache.phoenix.schema.TableNotFoundException; +import org.apache.phoenix.schema.types.PBoolean; +import org.apache.phoenix.schema.types.PDataType; +import org.apache.phoenix.schema.types.PLong; +import org.apache.phoenix.schema.types.PSmallint; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -79,21 +79,22 @@ public class MetaDataUtil { public static final String PARENT_TABLE_KEY = "PARENT_TABLE"; public static final byte[] PARENT_TABLE_KEY_BYTES = Bytes.toBytes("PARENT_TABLE"); - public static boolean areClientAndServerCompatible(long version) { + public static boolean areClientAndServerCompatible(long serverHBaseAndPhoenixVersion) { // As of 3.0, we allow a client and server to differ for the minor version. // Care has to be taken to upgrade the server before the client, as otherwise // the client may call expressions that don't yet exist on the server. // Differing by the patch version has always been allowed. // Only differing by the major version is not allowed. - return areClientAndServerCompatible(MetaDataUtil.decodePhoenixVersion(version), MetaDataProtocol.PHOENIX_MAJOR_VERSION); + return areClientAndServerCompatible(MetaDataUtil.decodePhoenixVersion(serverHBaseAndPhoenixVersion), MetaDataProtocol.PHOENIX_MAJOR_VERSION, MetaDataProtocol.PHOENIX_MINOR_VERSION); } // Default scope for testing - static boolean areClientAndServerCompatible(int version, int pMajor) { + static boolean areClientAndServerCompatible(int serverVersion, int clientMajorVersion, int clientMinorVersion) { // A server and client with the same major and minor version number must be compatible. // So it's important that we roll the PHOENIX_MAJOR_VERSION or PHOENIX_MINOR_VERSION // when we make an incompatible change. - return VersionUtil.encodeMaxMinorVersion(pMajor) >= version && VersionUtil.encodeMinMinorVersion(pMajor) <= version; + return VersionUtil.encodeMinPatchVersion(clientMajorVersion, clientMinorVersion) <= serverVersion && // Minor major and minor cannot be ahead of server + VersionUtil.encodeMaxMinorVersion(clientMajorVersion) >= serverVersion; // Major version must at least be up to server version } // Given the encoded integer representing the phoenix version in the encoded version value. @@ -129,6 +130,11 @@ public class MetaDataUtil { return major + "." + minor + "." + patch; } + public static int encodePhoenixVersion() { + return VersionUtil.encodeVersion(MetaDataProtocol.PHOENIX_MAJOR_VERSION, MetaDataProtocol.PHOENIX_MINOR_VERSION, + MetaDataProtocol.PHOENIX_PATCH_NUMBER); + } + public static long encodeHBaseAndPhoenixVersions(String hbaseVersion) { return (((long) VersionUtil.encodeVersion(hbaseVersion)) << (Byte.SIZE * 5)) | (((long) VersionUtil.encodeVersion(MetaDataProtocol.PHOENIX_MAJOR_VERSION, MetaDataProtocol.PHOENIX_MINOR_VERSION, http://git-wip-us.apache.org/repos/asf/phoenix/blob/4bc162d8/phoenix-core/src/test/java/org/apache/phoenix/util/MetaDataUtilTest.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/test/java/org/apache/phoenix/util/MetaDataUtilTest.java b/phoenix-core/src/test/java/org/apache/phoenix/util/MetaDataUtilTest.java index 427b3bf..9597b9c 100644 --- a/phoenix-core/src/test/java/org/apache/phoenix/util/MetaDataUtilTest.java +++ b/phoenix-core/src/test/java/org/apache/phoenix/util/MetaDataUtilTest.java @@ -45,14 +45,16 @@ public class MetaDataUtilTest { @Test public void testCompatibility() { - assertTrue(MetaDataUtil.areClientAndServerCompatible(VersionUtil.encodeVersion(1,2,1), 1)); - assertTrue(MetaDataUtil.areClientAndServerCompatible(VersionUtil.encodeVersion(1,2,10), 1)); - assertTrue(MetaDataUtil.areClientAndServerCompatible(VersionUtil.encodeVersion(1,2,0), 1)); - assertTrue(MetaDataUtil.areClientAndServerCompatible(VersionUtil.encodeVersion(1,2,255), 1)); - assertTrue(MetaDataUtil.areClientAndServerCompatible(VersionUtil.encodeVersion(2,2,0), 2)); - assertTrue(MetaDataUtil.areClientAndServerCompatible(VersionUtil.encodeVersion(2,10,36), 2)); - assertFalse(MetaDataUtil.areClientAndServerCompatible(VersionUtil.encodeVersion(3,1,10), 4)); - assertFalse(MetaDataUtil.areClientAndServerCompatible(VersionUtil.encodeVersion(3,1,10), 2)); + assertTrue(MetaDataUtil.areClientAndServerCompatible(VersionUtil.encodeVersion(1,2,1), 1, 2)); + assertTrue(MetaDataUtil.areClientAndServerCompatible(VersionUtil.encodeVersion(1,2,10), 1, 1)); + assertTrue(MetaDataUtil.areClientAndServerCompatible(VersionUtil.encodeVersion(1,2,0), 1, 2)); + assertTrue(MetaDataUtil.areClientAndServerCompatible(VersionUtil.encodeVersion(1,2,255), 1, 2)); + assertTrue(MetaDataUtil.areClientAndServerCompatible(VersionUtil.encodeVersion(2,2,0), 2, 0)); + assertTrue(MetaDataUtil.areClientAndServerCompatible(VersionUtil.encodeVersion(2,10,36), 2, 9)); + assertFalse(MetaDataUtil.areClientAndServerCompatible(VersionUtil.encodeVersion(3,1,10), 4, 0)); + assertFalse(MetaDataUtil.areClientAndServerCompatible(VersionUtil.encodeVersion(3,1,10), 2, 0)); + assertFalse(MetaDataUtil.areClientAndServerCompatible(VersionUtil.encodeVersion(3,1,10), 3, 2)); + assertFalse(MetaDataUtil.areClientAndServerCompatible(VersionUtil.encodeVersion(3,1,10), 3, 5)); } /**