/** * 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.hadoop.hive.ql.lockmgr; import junit.framework.TestCase; import org.apache.hadoop.hive.conf.HiveConf; import org.apache.hadoop.hive.ql.lockmgr.HiveLockObject.HiveLockObjectData; import org.junit.Assert; public class TestEmbeddedLockManager extends TestCase { private int counter; private HiveConf conf = new HiveConf(); public void testLocking() throws LockException { HiveConf conf = new HiveConf(); conf.set("hive.lock.numretries", "0"); conf.set("hive.unlock.numretries", "0"); EmbeddedLockManager manager = new EmbeddedLockManager(); manager.setContext(new HiveLockManagerCtx(conf)); String path1 = "database1/table1/x=100"; String path2 = "database1/table1/x=200"; String path3 = "database1/table2"; String path4 = "database2"; HiveLockObject path1sel1 = lockObj(path1, "select"); HiveLock path1sel1Lock = manager.lock(path1sel1, HiveLockMode.SHARED, false); Assert.assertNotNull(path1sel1Lock); Assert.assertEquals(1, manager.getLocks(path1sel1, false, false).size()); Assert.assertEquals(1, manager.getLocks(path1sel1, false, true).size()); Assert.assertEquals(1, manager.getLocks(false, true).size()); HiveLockObject path1up1 = lockObj(path1, "update"); Assert.assertNull(manager.lock(path1up1, HiveLockMode.EXCLUSIVE, false)); HiveLockObject path1sel2 = lockObj(path1, "select"); HiveLock path1sel2Lock = manager.lock(path1sel2, HiveLockMode.SHARED, false); Assert.assertNotNull(path1sel2Lock); Assert.assertEquals(1, manager.getLocks(path1sel1, false, false).size()); Assert.assertEquals(2, manager.getLocks(path1sel1, false, true).size()); Assert.assertEquals(2, manager.getLocks(path1sel2, false, true).size()); Assert.assertEquals(2, manager.getLocks(false, true).size()); HiveLockObject path1up2 = lockObj(path1, "update"); Assert.assertNull(manager.lock(path1up2, HiveLockMode.EXCLUSIVE, false)); HiveLockObject path2sel1 = lockObj(path2, "select"); HiveLock path2sel1Lock = manager.lock(path2sel1, HiveLockMode.SHARED, false); Assert.assertNotNull(path2sel1Lock); Assert.assertEquals(1, manager.getLocks(path1sel1, false, false).size()); Assert.assertEquals(2, manager.getLocks(path1sel1, false, true).size()); Assert.assertEquals(2, manager.getLocks(path1sel2, false, true).size()); Assert.assertEquals(1, manager.getLocks(path2sel1, false, true).size()); Assert.assertEquals(3, manager.getLocks(false, true).size()); HiveLockObject path3sel = lockObj(path3, "select"); HiveLock path3selLock = manager.lock(path3sel, HiveLockMode.SHARED, false); Assert.assertNotNull(path3selLock); Assert.assertEquals(1, manager.getLocks(path1sel1, false, false).size()); Assert.assertEquals(2, manager.getLocks(path1sel1, false, true).size()); Assert.assertEquals(2, manager.getLocks(path1sel2, false, true).size()); Assert.assertEquals(1, manager.getLocks(path2sel1, false, true).size()); Assert.assertEquals(1, manager.getLocks(path3sel, false, true).size()); Assert.assertEquals(4, manager.getLocks(false, true).size()); manager.unlock(path1sel1Lock); Assert.assertEquals(1, manager.getLocks(path1sel1, false, false).size()); Assert.assertEquals(1, manager.getLocks(path1sel1, false, true).size()); Assert.assertEquals(1, manager.getLocks(path1sel2, false, true).size()); Assert.assertEquals(1, manager.getLocks(path2sel1, false, true).size()); Assert.assertEquals(1, manager.getLocks(path3sel, false, true).size()); Assert.assertEquals(3, manager.getLocks(false, true).size()); manager.unlock(path1sel2Lock); Assert.assertEquals(1, manager.getLocks(path2sel1, false, true).size()); Assert.assertEquals(1, manager.getLocks(path3sel, false, true).size()); Assert.assertEquals(2, manager.getLocks(false, true).size()); manager.unlock(path2sel1Lock); Assert.assertEquals(1, manager.getLocks(path3sel, false, true).size()); Assert.assertEquals(1, manager.getLocks(false, true).size()); manager.unlock(path3selLock); Assert.assertEquals(0, manager.getLocks(false, true).size()); HiveLockObject path2up1 = lockObj(path2, "update"); HiveLock path2up1Lock = manager.lock(path2up1, HiveLockMode.EXCLUSIVE, false); Assert.assertNotNull(path2up1Lock); Assert.assertEquals(1, manager.getLocks(path2up1, false, true).size()); Assert.assertEquals(1, manager.getLocks(false, true).size()); Assert.assertNull(manager.lock(path2up1, HiveLockMode.EXCLUSIVE, false)); HiveLockObject path1sel3 = lockObj(path1, "select"); HiveLockObject path2sel2 = lockObj(path2, "select"); Assert.assertNotNull(manager.lock(path1sel3, HiveLockMode.SHARED, false)); Assert.assertNull(manager.lock(path2sel2, HiveLockMode.SHARED, false)); Assert.assertEquals(1, manager.getLocks(path2up1, false, true).size()); Assert.assertEquals(1, manager.getLocks(path1sel3, false, true).size()); Assert.assertEquals(2, manager.getLocks(false, true).size()); } private HiveLockObject lockObj(String path, String query) { HiveLockObjectData data = new HiveLockObjectData(String.valueOf(++counter), null, null, query, conf); return new HiveLockObject(path.split("/"), data); } }