Index: metastore/src/test/org/apache/hadoop/hive/metastore/TestMetaStoreEventListener.java =================================================================== --- metastore/src/test/org/apache/hadoop/hive/metastore/TestMetaStoreEventListener.java (revision 1409952) +++ metastore/src/test/org/apache/hadoop/hive/metastore/TestMetaStoreEventListener.java (working copy) @@ -66,6 +66,10 @@ private HiveMetaStoreClient msc; private Driver driver; + private static final String dbName = "tmpdb"; + private static final String tblName = "tmptbl"; + private static final String renamed = "tmptbl2"; + private static class RunMS implements Runnable { @Override @@ -83,13 +87,16 @@ protected void setUp() throws Exception { super.setUp(); + System.setProperty("hive.metastore.event.listeners", DummyListener.class.getName()); System.setProperty("hive.metastore.pre.event.listeners", DummyPreListener.class.getName()); + Thread t = new Thread(new RunMS()); t.start(); Thread.sleep(40000); + hiveConf = new HiveConf(this.getClass()); hiveConf.setVar(HiveConf.ConfVars.METASTOREURIS, "thrift://localhost:" + msPort); hiveConf.setIntVar(HiveConf.ConfVars.METASTORETHRIFTRETRIES, 3); @@ -99,6 +106,11 @@ SessionState.start(new CliSessionState(hiveConf)); msc = new HiveMetaStoreClient(hiveConf, null); driver = new Driver(hiveConf); + + driver.run("drop database if exists " + dbName + " cascade"); + + DummyListener.notifyList.clear(); + DummyPreListener.notifyList.clear(); } @Override @@ -184,9 +196,6 @@ } public void testListener() throws Exception { - String dbName = "tmpdb"; - String tblName = "tmptbl"; - String renamed = "tmptbl2"; int listSize = 0; List notifyList = DummyListener.notifyList; Index: metastore/src/test/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java =================================================================== --- metastore/src/test/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java (revision 1409952) +++ metastore/src/test/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java (working copy) @@ -852,6 +852,53 @@ } } + public void testDatabaseLocationWithPermissionProblems() throws Exception { + + // Note: The following test will fail if you are running this test as root. Setting + // permission to '0' on the database folder will not preclude root from being able + // to create the necessary files. + + if (System.getProperty("user.name").equals("root")) { + System.err.println("Skipping test because you are running as root!"); + return; + } + + silentDropDatabase(TEST_DB1_NAME); + + Database db = new Database(); + db.setName(TEST_DB1_NAME); + String dbLocation = + HiveConf.getVar(hiveConf, HiveConf.ConfVars.METASTOREWAREHOUSE) + "/test/_testDB_create_"; + FileSystem fs = FileSystem.get(new Path(dbLocation).toUri(), hiveConf); + fs.mkdirs( + new Path(HiveConf.getVar(hiveConf, HiveConf.ConfVars.METASTOREWAREHOUSE) + "/test"), + new FsPermission((short) 0)); + db.setLocationUri(dbLocation); + + + boolean createFailed = false; + try { + client.createDatabase(db); + } catch (MetaException cantCreateDB) { + createFailed = true; + } finally { + // Cleanup + if (!createFailed) { + try { + client.dropDatabase(TEST_DB1_NAME); + } catch(Exception e) { + System.err.println("Failed to remove database in cleanup: " + e.getMessage()); + } + } + + fs.setPermission(new Path(HiveConf.getVar(hiveConf, HiveConf.ConfVars.METASTOREWAREHOUSE) + "/test"), + new FsPermission((short) 755)); + fs.delete(new Path(HiveConf.getVar(hiveConf, HiveConf.ConfVars.METASTOREWAREHOUSE) + "/test"), true); + } + + assertTrue("Database creation succeeded even with permission problem", createFailed); + } + public void testDatabaseLocation() throws Throwable { try { // clear up any existing databases @@ -874,24 +921,6 @@ client.dropDatabase(TEST_DB1_NAME); silentDropDatabase(TEST_DB1_NAME); - db = new Database(); - db.setName(TEST_DB1_NAME); - dbLocation = - HiveConf.getVar(hiveConf, HiveConf.ConfVars.METASTOREWAREHOUSE) + "/test/_testDB_create_"; - FileSystem fs = FileSystem.get(new Path(dbLocation).toUri(), hiveConf); - fs.mkdirs( - new Path(HiveConf.getVar(hiveConf, HiveConf.ConfVars.METASTOREWAREHOUSE) + "/test"), - new FsPermission((short) 0)); - db.setLocationUri(dbLocation); - - boolean createFailed = false; - try { - client.createDatabase(db); - } catch (MetaException cantCreateDB) { - createFailed = true; - } - assertTrue("Database creation succeeded even with permission problem", createFailed); - boolean objectNotExist = false; try { client.getDatabase(TEST_DB1_NAME); @@ -900,23 +929,16 @@ } assertTrue("Database " + TEST_DB1_NAME + " exists ", objectNotExist); - // Cleanup - fs.setPermission( - new Path(HiveConf.getVar(hiveConf, HiveConf.ConfVars.METASTOREWAREHOUSE) + "/test"), - new FsPermission((short) 755)); - fs.delete(new Path(HiveConf.getVar(hiveConf, HiveConf.ConfVars.METASTOREWAREHOUSE) + "/test"), true); - - db = new Database(); db.setName(TEST_DB1_NAME); dbLocation = HiveConf.getVar(hiveConf, HiveConf.ConfVars.METASTOREWAREHOUSE) + "/_testDB_file_"; - fs = FileSystem.get(new Path(dbLocation).toUri(), hiveConf); + FileSystem fs = FileSystem.get(new Path(dbLocation).toUri(), hiveConf); fs.createNewFile(new Path(dbLocation)); fs.deleteOnExit(new Path(dbLocation)); db.setLocationUri(dbLocation); - createFailed = false; + boolean createFailed = false; try { client.createDatabase(db); } catch (MetaException cantCreateDB) { @@ -2084,10 +2106,12 @@ * at least works correctly. */ public void testSynchronized() throws Exception { + int currentNumberOfDbs = client.getAllDatabases().size(); + IMetaStoreClient synchronizedClient = HiveMetaStoreClient.newSynchronizedClient(client); List databases = synchronizedClient.getAllDatabases(); - assertEquals(1, databases.size()); + assertEquals(currentNumberOfDbs, databases.size()); } public void testTableFilter() throws Exception {