Java tutorial
/* * 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.util; import static org.junit.Assert.assertTrue; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HRegionInfo; import org.apache.hadoop.hbase.MiniHBaseCluster; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.HBaseAdmin; import org.apache.hadoop.hbase.regionserver.HRegionServer; import org.apache.phoenix.end2end.BaseUniqueNamesOwnClusterIT; import org.junit.BeforeClass; import org.junit.Test; /* * This test is wrt to https://issues.apache.org/jira/browse/PHOENIX-4993.Test checks region * close should not close the shared connections */ public class CoprocessorHConnectionTableFactoryTest extends BaseUniqueNamesOwnClusterIT { private static String ORG_PREFIX = "ORG"; private static final Log LOG = LogFactory.getLog(CoprocessorHConnectionTableFactoryTest.class); @BeforeClass public static final void doSetup() throws Exception { setUpTestDriver(ReadOnlyProps.EMPTY_PROPS); } static String getOrgId(long id) { return ORG_PREFIX + "-" + id; } static String getRandomOrgId(int maxOrgId) { return getOrgId(Math.round(Math.random() * maxOrgId)); } static void writeToTable(String tableName, Connection conn, int maxOrgId) throws SQLException { try { String orgId = getRandomOrgId(maxOrgId); Statement stmt = conn.createStatement(); for (int i = 0; i < 10; i++) { stmt.executeUpdate("UPSERT INTO " + tableName + " VALUES('" + orgId + "'," + i + "," + (i + 1) + "," + (i + 2) + ")"); } conn.commit(); } catch (Exception e) { LOG.error("Client side exception:" + e); } } static int getActiveConnections(HRegionServer regionServer, Configuration conf) throws Exception { return ServerUtil.ConnectionFactory.getConnectionsCount(); } @Test public void testCachedConnections() throws Exception { final String tableName = generateUniqueName(); final String index1Name = generateUniqueName(); final Connection conn = DriverManager.getConnection(getUrl()); final HBaseAdmin admin = getUtility().getHBaseAdmin(); final MiniHBaseCluster cluster = getUtility().getHBaseCluster(); final HRegionServer regionServer = cluster.getRegionServer(0); Configuration conf = admin.getConfiguration(); final int noOfOrgs = 20; final AtomicBoolean flag = new AtomicBoolean(); flag.set(false); // create table and indices String createTableSql = "CREATE TABLE " + tableName + "(org_id VARCHAR NOT NULL PRIMARY KEY, v1 INTEGER, v2 INTEGER, v3 INTEGER) VERSIONS=1 SPLIT ON ('" + ORG_PREFIX + "-" + noOfOrgs / 2 + "')"; conn.createStatement().execute(createTableSql); conn.createStatement().execute("CREATE INDEX " + index1Name + " ON " + tableName + "(v1)"); List<HRegionInfo> regions = admin.getTableRegions(TableName.valueOf(tableName)); final HRegionInfo regionInfo = regions.get(0); writeToTable(tableName, conn, noOfOrgs); int beforeRegionCloseCount = getActiveConnections(regionServer, conf); int regionsCount = admin.getOnlineRegions(regionServer.getServerName()).size(); admin.unassign(regionInfo.getEncodedNameAsBytes(), true); while (!(admin.getOnlineRegions(regionServer.getServerName()).size() < regionsCount)) ; int afterRegionCloseCount = getActiveConnections(regionServer, conf); assertTrue("Cached connections not closed when region closes: ", afterRegionCloseCount == beforeRegionCloseCount && afterRegionCloseCount > 0); } }