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/04 03:53:16 UTC

[phoenix] branch master updated: PHOENIX-6126 : All createViewAddChildLink requests should go to corresponding region of SYSTEM.CHILD_LINK

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 337d795  PHOENIX-6126 : All createViewAddChildLink requests should go to corresponding region of SYSTEM.CHILD_LINK
337d795 is described below

commit 337d79576544675dd8321a0bbcfa8995ec26a902
Author: Viraj Jasani <vj...@apache.org>
AuthorDate: Fri Oct 30 00:21:39 2020 +0530

    PHOENIX-6126 : All createViewAddChildLink requests should go to corresponding region of SYSTEM.CHILD_LINK
    
    Signed-off-by: Xinyi Yan <ya...@apache.org>
---
 .../query/ChildLinkMetaDataServiceCallBack.java    | 68 ++++++++++++++++++++++
 .../phoenix/query/ConnectionQueryServicesImpl.java | 35 ++++-------
 .../java/org/apache/phoenix/util/SchemaUtil.java   |  6 --
 3 files changed, 79 insertions(+), 30 deletions(-)

diff --git a/phoenix-core/src/main/java/org/apache/phoenix/query/ChildLinkMetaDataServiceCallBack.java b/phoenix-core/src/main/java/org/apache/phoenix/query/ChildLinkMetaDataServiceCallBack.java
new file mode 100644
index 0000000..73373ef
--- /dev/null
+++ b/phoenix-core/src/main/java/org/apache/phoenix/query/ChildLinkMetaDataServiceCallBack.java
@@ -0,0 +1,68 @@
+/*
+ * 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.query;
+
+import org.apache.hadoop.hbase.client.Mutation;
+import org.apache.hadoop.hbase.client.coprocessor.Batch;
+import org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.BlockingRpcCallback;
+import org.apache.hadoop.hbase.ipc.ServerRpcController;
+import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.MutationProto;
+import org.apache.phoenix.coprocessor.generated.ChildLinkMetaDataProtos
+    .ChildLinkMetaDataService;
+import org.apache.phoenix.coprocessor.generated.ChildLinkMetaDataProtos
+    .CreateViewAddChildLinkRequest;
+import org.apache.phoenix.coprocessor.generated.MetaDataProtos.MetaDataResponse;
+import org.apache.phoenix.protobuf.ProtobufUtil;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * Callable implementation for coprocessor endpoint associated with
+ * SYSTEM.CHILD_LINK
+ */
+class ChildLinkMetaDataServiceCallBack
+    implements Batch.Call<ChildLinkMetaDataService, MetaDataResponse> {
+
+    private final List<Mutation> childLinkMutations;
+
+    public ChildLinkMetaDataServiceCallBack(List<Mutation> childLinkMutations) {
+        this.childLinkMutations = childLinkMutations;
+    }
+
+    @Override
+    public MetaDataResponse call(ChildLinkMetaDataService instance)
+            throws IOException {
+        ServerRpcController controller = new ServerRpcController();
+        BlockingRpcCallback<MetaDataResponse> rpcCallback =
+            new BlockingRpcCallback<>();
+        CreateViewAddChildLinkRequest.Builder builder =
+            CreateViewAddChildLinkRequest.newBuilder();
+        for (Mutation mutation : childLinkMutations) {
+            MutationProto mp = ProtobufUtil.toProto(mutation);
+            builder.addTableMetadataMutations(mp.toByteString());
+        }
+        CreateViewAddChildLinkRequest build = builder.build();
+        instance.createViewAddChildLink(controller, build, rpcCallback);
+        if (controller.getFailedOn() != null) {
+            throw controller.getFailedOn();
+        }
+        return rpcCallback.get();
+    }
+}
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 03e7ebf..62c531b 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
@@ -84,6 +84,7 @@ import java.lang.ref.WeakReference;
 import java.sql.PreparedStatement;
 import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
+import java.sql.Statement;
 import java.sql.Types;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -1892,28 +1893,12 @@ public class ConnectionQueryServicesImpl extends DelegateQueryServices implement
         // Avoid the client-server RPC if this is not a view creation
         if (!childLinkMutations.isEmpty()) {
             // Send mutations for parent-child links to SYSTEM.CHILD_LINK
-            // We invoke this using the parent table's key since child links are keyed by parent
-            final MetaDataMutationResult result = childLinkMetaDataCoprocessorExec(SchemaUtil.getTableKey(parentTable),
-                    new Batch.Call<ChildLinkMetaDataService, MetaDataResponse>() {
-                        @Override
-                        public MetaDataResponse call(ChildLinkMetaDataService instance) throws IOException {
-                            ServerRpcController controller = new ServerRpcController();
-                            BlockingRpcCallback<MetaDataResponse> rpcCallback =
-                                    new BlockingRpcCallback<>();
-                            CreateViewAddChildLinkRequest.Builder builder =
-                                    CreateViewAddChildLinkRequest.newBuilder();
-                            for (Mutation m: childLinkMutations) {
-                                MutationProto mp = ProtobufUtil.toProto(m);
-                                builder.addTableMetadataMutations(mp.toByteString());
-                            }
-                            CreateViewAddChildLinkRequest build = builder.build();
-                            instance.createViewAddChildLink(controller, build, rpcCallback);
-                            if (controller.getFailedOn() != null) {
-                                throw controller.getFailedOn();
-                            }
-                            return rpcCallback.get();
-                        }
-                    } );
+            // We invoke this using rowKey available in the first element
+            // of childLinkMutations.
+            final byte[] rowKey = childLinkMutations.get(0).getRow();
+            final MetaDataMutationResult result =
+                childLinkMetaDataCoprocessorExec(rowKey,
+                    new ChildLinkMetaDataServiceCallBack(childLinkMutations));
 
             switch (result.getMutationCode()) {
                 case UNABLE_TO_CREATE_CHILD_LINK:
@@ -3216,9 +3201,11 @@ public class ConnectionQueryServicesImpl extends DelegateQueryServices implement
                             String globalUrl = JDBCUtil.removeProperty(url, PhoenixRuntime.TENANT_ID_ATTRIB);
                             try (PhoenixConnection metaConnection = new PhoenixConnection(ConnectionQueryServicesImpl.this, globalUrl,
                                          scnProps, newEmptyMetaData())) {
-                                try {
+                                try (Statement statement =
+                                        metaConnection.createStatement()) {
                                     metaConnection.setRunningUpgrade(true);
-                                    metaConnection.createStatement().executeUpdate(getSystemCatalogTableDDL());
+                                    statement.executeUpdate(
+                                        getSystemCatalogTableDDL());
                                 } catch (NewerTableAlreadyExistsException ignore) {
                                     // Ignore, as this will happen if the SYSTEM.CATALOG already exists at this fixed
                                     // timestamp. A TableAlreadyExistsException is not thrown, since the table only exists
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/util/SchemaUtil.java b/phoenix-core/src/main/java/org/apache/phoenix/util/SchemaUtil.java
index ff055bf..c1b75d7 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/util/SchemaUtil.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/util/SchemaUtil.java
@@ -1051,12 +1051,6 @@ public class SchemaUtil {
     	return table.getRowTimestampColPos()>0;
     }
 
-    public static byte[] getTableKey(PTable dataTable) {
-        PName tenantId = dataTable.getTenantId();
-        PName schemaName = dataTable.getSchemaName();
-        return getTableKey(tenantId == null ? ByteUtil.EMPTY_BYTE_ARRAY : tenantId.getBytes(), schemaName == null ? ByteUtil.EMPTY_BYTE_ARRAY : schemaName.getBytes(), dataTable.getTableName().getBytes());
-    }
-
     public static byte[] getSchemaKey(String schemaName) {
         return SchemaUtil.getTableKey(null, schemaName, MetaDataClient.EMPTY_TABLE);
     }