blob: 15af2af65b7fd307517051567d1531cf7a7d922c [file] [log] [blame]
/*
* 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.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import org.apache.hadoop.hbase.HBaseTestingUtility;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.RegionLocator;
import org.apache.phoenix.util.PhoenixRuntime;
import org.junit.After;
import org.junit.Test;
public class SystemCatalogIT {
private HBaseTestingUtility testUtil = null;
@After
public void cleanup() throws Exception {
if (null != testUtil) {
testUtil.shutdownMiniCluster();
testUtil = null;
}
}
/**
* Make sure that SYSTEM.CATALOG cannot be split, even with schemas and multi-tenant views
*/
@Test
public void testSystemTableSplit() throws Exception {
testUtil = new HBaseTestingUtility();
testUtil.startMiniCluster(1);
for (int i=0; i<10; i++) {
createTable("schema"+i+".table_"+i);
}
TableName systemCatalog = TableName.valueOf("SYSTEM.CATALOG");
RegionLocator rl = testUtil.getConnection().getRegionLocator(systemCatalog);
assertEquals(rl.getAllRegionLocations().size(), 1);
// now attempt to split SYSTEM.CATALOG
testUtil.getHBaseAdmin().split(systemCatalog);
// make sure the split finishes (there's no synchronous splitting before HBase 2.x)
testUtil.getHBaseAdmin().disableTable(systemCatalog);
testUtil.getHBaseAdmin().enableTable(systemCatalog);
// test again... Must still be exactly one region.
rl = testUtil.getConnection().getRegionLocator(systemCatalog);
assertEquals(1, rl.getAllRegionLocations().size());
}
private void createTable(String tableName) throws Exception {
try (Connection conn = DriverManager.getConnection(getJdbcUrl());
Statement stmt = conn.createStatement();) {
stmt.execute("DROP TABLE IF EXISTS " + tableName);
stmt.execute("CREATE TABLE " + tableName
+ " (TENANT_ID VARCHAR NOT NULL, PK1 VARCHAR NOT NULL, V1 VARCHAR CONSTRAINT PK PRIMARY KEY(TENANT_ID, PK1)) MULTI_TENANT=true");
try (Connection tenant1Conn = getTenantConnection("tenant1")) {
String view1DDL = "CREATE VIEW " + tableName + "_view AS SELECT * FROM " + tableName;
tenant1Conn.createStatement().execute(view1DDL);
}
conn.commit();
}
}
private String getJdbcUrl() {
return "jdbc:phoenix:localhost:" + testUtil.getZkCluster().getClientPort() + ":/hbase";
}
private Connection getTenantConnection(String tenantId) throws SQLException {
Properties tenantProps = new Properties();
tenantProps.setProperty(PhoenixRuntime.TENANT_ID_ATTRIB, tenantId);
return DriverManager.getConnection(getJdbcUrl(), tenantProps);
}
}