| /* |
| * 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 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.assertTrue; |
| |
| import java.sql.DriverManager; |
| import java.util.HashMap; |
| import java.util.Map; |
| import java.util.Properties; |
| |
| import org.apache.hadoop.conf.Configuration; |
| import org.apache.hadoop.hbase.HBaseConfiguration; |
| import org.apache.hadoop.hbase.HBaseTestingUtility; |
| import org.apache.hadoop.hbase.HConstants; |
| import org.apache.hadoop.hbase.client.HConnection; |
| import org.apache.phoenix.coprocessor.MetaDataRegionObserver; |
| import org.apache.phoenix.jdbc.PhoenixConnection; |
| import org.apache.phoenix.jdbc.PhoenixDriver; |
| import org.apache.phoenix.jdbc.PhoenixEmbeddedDriver; |
| import org.apache.phoenix.query.ConnectionQueryServices; |
| import org.apache.phoenix.query.QueryServices; |
| import org.apache.phoenix.query.QueryServicesOptions; |
| import org.apache.phoenix.util.PhoenixRuntime; |
| import org.apache.phoenix.util.PropertiesUtil; |
| import org.apache.phoenix.util.ReadOnlyProps; |
| import org.junit.BeforeClass; |
| import org.junit.Test; |
| import org.mockito.internal.util.reflection.Whitebox; |
| |
| public class RebuildIndexConnectionPropsIT extends BaseUniqueNamesOwnClusterIT { |
| private static HBaseTestingUtility hbaseTestUtil; |
| private static String zkQuorum; |
| private static String url; |
| private static int NUM_RPC_RETRIES = 1; |
| |
| @BeforeClass |
| public static void doSetup() throws Exception { |
| Configuration conf = HBaseConfiguration.create(); |
| hbaseTestUtil = new HBaseTestingUtility(conf); |
| Map<String, String> serverProps = new HashMap<>(); |
| serverProps.put(QueryServices.EXTRA_JDBC_ARGUMENTS_ATTRIB, QueryServicesOptions.DEFAULT_EXTRA_JDBC_ARGUMENTS); |
| // need at least one retry otherwise test fails |
| serverProps.put(QueryServices.INDEX_REBUILD_RPC_RETRIES_COUNTER, Long.toString(NUM_RPC_RETRIES)); |
| setUpConfigForMiniCluster(conf, new ReadOnlyProps(serverProps.entrySet().iterator())); |
| hbaseTestUtil.startMiniCluster(); |
| // establish url and quorum. Need to use PhoenixDriver and not PhoenixTestDriver |
| zkQuorum = "localhost:" + hbaseTestUtil.getZkCluster().getClientPort(); |
| url = PhoenixRuntime.JDBC_PROTOCOL + PhoenixRuntime.JDBC_PROTOCOL_SEPARATOR + zkQuorum; |
| Properties driverProps = PropertiesUtil.deepCopy(TEST_PROPERTIES); |
| DriverManager.registerDriver(PhoenixDriver.INSTANCE); |
| try (PhoenixConnection phxConn = |
| DriverManager.getConnection(url, driverProps).unwrap(PhoenixConnection.class)) { |
| } |
| } |
| |
| @Test |
| public void testRebuildIndexConnectionProperties() throws Exception { |
| try (PhoenixConnection rebuildIndexConnection = |
| MetaDataRegionObserver.getRebuildIndexConnection(hbaseTestUtil.getMiniHBaseCluster().getConfiguration())) { |
| try (PhoenixConnection regularConnection = |
| DriverManager.getConnection(url).unwrap(PhoenixConnection.class)) { |
| String rebuildUrl = rebuildIndexConnection.getURL(); |
| // assert that we are working with non-test urls |
| assertFalse(PhoenixEmbeddedDriver.isTestUrl(url)); |
| assertFalse(PhoenixEmbeddedDriver.isTestUrl(rebuildUrl)); |
| // assert that the url ends with expected string |
| assertTrue( |
| rebuildUrl.contains(MetaDataRegionObserver.REBUILD_INDEX_APPEND_TO_URL_STRING)); |
| // assert that the url for regular connection vs the rebuild connection is different |
| assertFalse(rebuildUrl.equals(regularConnection.getURL())); |
| Configuration rebuildQueryServicesConfig = |
| rebuildIndexConnection.getQueryServices().getConfiguration(); |
| // assert that the properties are part of the query services config |
| assertEquals( |
| Long.toString(QueryServicesOptions.DEFAULT_INDEX_REBUILD_QUERY_TIMEOUT), |
| rebuildQueryServicesConfig.get(QueryServices.THREAD_TIMEOUT_MS_ATTRIB)); |
| assertEquals( |
| Long.toString( |
| QueryServicesOptions.DEFAULT_INDEX_REBUILD_CLIENT_SCANNER_TIMEOUT), |
| rebuildQueryServicesConfig.get(HConstants.HBASE_CLIENT_SCANNER_TIMEOUT_PERIOD)); |
| assertEquals(Long.toString(QueryServicesOptions.DEFAULT_INDEX_REBUILD_RPC_TIMEOUT), |
| rebuildQueryServicesConfig.get(HConstants.HBASE_RPC_TIMEOUT_KEY)); |
| assertEquals( |
| Long.toString(NUM_RPC_RETRIES), |
| rebuildQueryServicesConfig.get(HConstants.HBASE_CLIENT_RETRIES_NUMBER)); |
| ConnectionQueryServices rebuildQueryServices = rebuildIndexConnection.getQueryServices(); |
| HConnection rebuildIndexHConnection = |
| (HConnection) Whitebox.getInternalState(rebuildQueryServices, |
| "connection"); |
| HConnection regularHConnection = |
| (HConnection) Whitebox.getInternalState( |
| regularConnection.getQueryServices(), "connection"); |
| // assert that a new HConnection was created |
| assertFalse( |
| regularHConnection.toString().equals(rebuildIndexHConnection.toString())); |
| Configuration rebuildHConnectionConfig = rebuildIndexHConnection.getConfiguration(); |
| // assert that the HConnection has the desired properties needed for rebuilding |
| // indices |
| assertEquals( |
| Long.toString( |
| QueryServicesOptions.DEFAULT_INDEX_REBUILD_CLIENT_SCANNER_TIMEOUT), |
| rebuildHConnectionConfig.get(HConstants.HBASE_CLIENT_SCANNER_TIMEOUT_PERIOD)); |
| assertEquals(Long.toString(QueryServicesOptions.DEFAULT_INDEX_REBUILD_RPC_TIMEOUT), |
| rebuildHConnectionConfig.get(HConstants.HBASE_RPC_TIMEOUT_KEY)); |
| assertEquals( |
| Long.toString(NUM_RPC_RETRIES), |
| rebuildHConnectionConfig.get(HConstants.HBASE_CLIENT_RETRIES_NUMBER)); |
| } |
| } |
| } |
| } |