You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by la...@apache.org on 2019/10/24 15:48:33 UTC

[phoenix] branch 4.x-HBase-1.4 updated: PHOENIX-5533 Creating a view or index with a 4.14 client and 4.15.0 server fails with a NullPointerException.

This is an automated email from the ASF dual-hosted git repository.

larsh pushed a commit to branch 4.x-HBase-1.4
in repository https://gitbox.apache.org/repos/asf/phoenix.git


The following commit(s) were added to refs/heads/4.x-HBase-1.4 by this push:
     new dd662b1  PHOENIX-5533 Creating a view or index with a 4.14 client and 4.15.0 server fails with a NullPointerException.
dd662b1 is described below

commit dd662b1b92971ed3a377f49736759f375164e445
Author: Lars Hofhansl <la...@apache.org>
AuthorDate: Thu Oct 24 08:47:44 2019 -0700

    PHOENIX-5533 Creating a view or index with a 4.14 client and 4.15.0 server fails with a NullPointerException.
---
 .../phoenix/coprocessor/MetaDataEndpointImpl.java  | 46 ++++++++++++++++++++++
 1 file changed, 46 insertions(+)

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 6df5bf8..7558b8d 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
@@ -1730,6 +1730,45 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso
                 byte[][] parentPhysicalSchemaTableNames = new byte[3][];
                 getParentAndPhysicalNames(tableMetadata, parentSchemaTableNames, parentPhysicalSchemaTableNames);
                 if (parentPhysicalSchemaTableNames[2] != null) {
+                    if (parentTable == null) {
+                        // This is needed when we connect with a 4.14 client to
+                        // a 4.15.0+ server.
+                        // In that case we need to resolve the parent table on
+                        // the server.
+                        parentTable = doGetTable(ByteUtil.EMPTY_BYTE_ARRAY,
+                                parentPhysicalSchemaTableNames[1],
+                                parentPhysicalSchemaTableNames[2], clientTimeStamp, clientVersion);
+                        if (parentTable == null) {
+                            builder.setReturnCode(
+                                    MetaDataProtos.MutationCode.PARENT_TABLE_NOT_FOUND);
+                            builder.setMutationTime(EnvironmentEdgeManager.currentTimeMillis());
+                            done.run(builder.build());
+                            return;
+                        }
+                        if (parentSchemaTableNames[2] != null
+                                && Bytes.compareTo(parentSchemaTableNames[2],
+                                        parentPhysicalSchemaTableNames[2]) != 0) {
+                            // if view is created on view
+                            byte[] tenantId = parentSchemaTableNames[0] == null
+                                    ? ByteUtil.EMPTY_BYTE_ARRAY
+                                    : parentSchemaTableNames[0];
+                            parentTable = doGetTable(tenantId, parentSchemaTableNames[1],
+                                    parentSchemaTableNames[2], clientTimeStamp, clientVersion);
+                            if (parentTable == null) {
+                                // it could be a global view
+                                parentTable = doGetTable(ByteUtil.EMPTY_BYTE_ARRAY,
+                                        parentSchemaTableNames[1], parentSchemaTableNames[2],
+                                        clientTimeStamp, clientVersion);
+                            }
+                        }
+                        if (parentTable == null) {
+                            builder.setReturnCode(
+                                    MetaDataProtos.MutationCode.PARENT_TABLE_NOT_FOUND);
+                            builder.setMutationTime(EnvironmentEdgeManager.currentTimeMillis());
+                            done.run(builder.build());
+                            return;
+                        }
+                    }
                     parentTableKey = SchemaUtil.getTableKey(ByteUtil.EMPTY_BYTE_ARRAY,
                             parentPhysicalSchemaTableNames[1], parentPhysicalSchemaTableNames[2]);
                     cParentPhysicalName = parentTable.getPhysicalName().getBytes();
@@ -1752,6 +1791,13 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso
                  */
                 parentTableName = MetaDataUtil.getParentTableName(tableMetadata);
                 parentTableKey = SchemaUtil.getTableKey(tenantIdBytes, parentSchemaName, parentTableName);
+                if (parentTable == null) {
+                    // This is needed when we connect with a 4.14 client to a 4.15.0+ server.
+                    // In that case we need to resolve the parent table on the server.
+                    parentTable =
+                            doGetTable(tenantIdBytes, parentSchemaName, parentTableName, clientTimeStamp, null,
+                                    request.getClientVersion());
+                }
                 if (IndexType.LOCAL == indexType) {
                     cPhysicalName = parentTable.getPhysicalName().getBytes();
                     cParentPhysicalName = parentTable.getPhysicalName().getBytes();