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));
     }
 
   /**

Reply via email to