public SchemaLocking(Function<Long, Procedure<?>> procedureRetriever) { this.procedureRetriever = procedureRetriever; this.metaLock = new LockAndQueue(procedureRetriever); }
private <T> LockAndQueue getLock(Map<T, LockAndQueue> map, T key) { LockAndQueue lock = map.get(key); if (lock == null) { lock = new LockAndQueue(procedureRetriever); map.put(key, lock); } return lock; }
@Test public void testHasLockAccess() { Map<Long, NoopProcedure<Void>> procMap = new HashMap<>(); for (long i = 1; i <= 10; i++) { NoopProcedure<Void> proc = new NoopProcedure<>(); proc.setProcId(i); if (i > 1) { proc.setParentProcId(i - 1); proc.setRootProcId(1); } procMap.put(i, proc); } LockAndQueue laq = new LockAndQueue(procMap::get); for (long i = 1; i <= 10; i++) { assertFalse(laq.hasLockAccess(procMap.get(i))); } for (long i = 1; i <= 10; i++) { NoopProcedure<Void> procHasLock = procMap.get(i); laq.tryExclusiveLock(procHasLock); for (long j = 1; j < i; j++) { assertFalse(laq.hasLockAccess(procMap.get(j))); } for (long j = i; j <= 10; j++) { assertTrue(laq.hasLockAccess(procMap.get(j))); } laq.releaseExclusiveLock(procHasLock); } } }
@Test public void testHasLockAccess() { Map<Long, NoopProcedure<Void>> procMap = new HashMap<>(); for (long i = 1; i <= 10; i++) { NoopProcedure<Void> proc = new NoopProcedure<>(); proc.setProcId(i); if (i > 1) { proc.setParentProcId(i - 1); proc.setRootProcId(1); } procMap.put(i, proc); } LockAndQueue laq = new LockAndQueue(procMap::get); for (long i = 1; i <= 10; i++) { assertFalse(laq.hasLockAccess(procMap.get(i))); } for (long i = 1; i <= 10; i++) { NoopProcedure<Void> procHasLock = procMap.get(i); laq.tryExclusiveLock(procHasLock); for (long j = 1; j < i; j++) { assertFalse(laq.hasLockAccess(procMap.get(j))); } for (long j = i; j <= 10; j++) { assertTrue(laq.hasLockAccess(procMap.get(j))); } laq.releaseExclusiveLock(procHasLock); } } }