private List<String> isNamesAvailable(Collection<String> reducedNames) { if (reducedNames.size() == 0) return new ArrayList<>(); List<String> unavailableNamesCache = nameCache.lockNameList(reducedNames); if (unavailableNamesCache.size() > 0) { return unavailableNamesCache; } List<String> unavailableNamesLedger = ledger.isAllNameRecordsAvailable(reducedNames); if (unavailableNamesLedger.size() > 0) { nameCache.unlockNameList(reducedNames); return unavailableNamesLedger; } return new ArrayList<>(); }
@Override public List<ErrorRecord> tryAllocate(Collection<String> reducedNamesToAllocate, Collection<HashId> originsToAllocate, Collection<String> addressesToAllocate) { List<String> namesErrors = isNamesAvailable(reducedNamesToAllocate); List<String> originsErrors = isOriginsAvailable(originsToAllocate); List<String> addressesErros = isAddressesAvailable(addressesToAllocate); boolean checkResult = namesErrors.isEmpty() && originsErrors.isEmpty() && addressesErros.isEmpty(); if (!checkResult) { if (namesErrors.isEmpty()) nameCache.unlockNameList(reducedNamesToAllocate); if (originsErrors.isEmpty()) nameCache.unlockOriginList(originsToAllocate); if (addressesErros.isEmpty()) nameCache.unlockAddressList(addressesToAllocate); } List<ErrorRecord> res = new ArrayList<>(); for (String s : namesErrors) res.add(new ErrorRecord(Errors.FAILED_CHECK, "names", "name '"+s+"' is not available")); for (String s : originsErrors) res.add(new ErrorRecord(Errors.FAILED_CHECK, "origins", "origin '"+s+"' is not available")); for (String s : addressesErros) res.add(new ErrorRecord(Errors.FAILED_CHECK, "addresses", "address '"+s+"' is not available")); return res; }
@Test public void busyTest() throws Exception { NameCache nameCache = new NameCache(Duration.ofMillis(10)); String testName = "testName"; assertEquals(true, nameCache.lockNameList(Arrays.asList(testName)).isEmpty()); assertEquals(false, nameCache.lockNameList(Arrays.asList(testName)).isEmpty()); Thread.sleep(15); nameCache.cleanUp(); assertEquals(true, nameCache.lockNameList(Arrays.asList(testName)).isEmpty()); nameCache.unlockNameList(Arrays.asList(testName)); assertEquals(true, nameCache.lockNameList(Arrays.asList(testName)).isEmpty()); }
nameCache.unlockNameList(nameList); nameCache.unlockOriginList(originsList);
assertTrue(nameCache.lockAddressList(values2).isEmpty()); nameCache.unlockNameList(values1); nameCache.unlockOriginList(values1hashes); nameCache.unlockAddressList(values1); assertFalse(nameCache.lockAddressList(valuesEx).isEmpty()); nameCache.unlockNameList(values2); nameCache.unlockOriginList(values2hashes); nameCache.unlockAddressList(values2);