private void logLockAcquisitionFailure(Map<LockDescriptor, LockClient> failedLocks) { final String logMessage = "Current holders of the first {} of {} total failed locks were: {}"; List<String> lockDescriptions = Lists.newArrayList(); Iterator<Entry<LockDescriptor, LockClient>> entries = failedLocks.entrySet().iterator(); for (int i = 0; i < MAX_FAILED_LOCKS_TO_LOG && entries.hasNext(); i++) { Entry<LockDescriptor, LockClient> entry = entries.next(); lockDescriptions.add( String.format("Lock: %s, Holder: %s", entry.getKey().toString(), entry.getValue().toString())); } requestLogger.trace( logMessage, SafeArg.of("numLocksLogged", Math.min(MAX_FAILED_LOCKS_TO_LOG, failedLocks.size())), SafeArg.of("numLocksFailed", failedLocks.size()), UnsafeArg.of("lockDescriptions", lockDescriptions)); }
if (log.isDebugEnabled() || isSlowLogEnabled()) { long responseTimeMillis = System.currentTimeMillis() - startTime; logSlowLockAcquisition(entry.getKey().toString(), currentHolder, responseTimeMillis);
@Test public void testDescriptors() throws Exception { List<File> files = LockServiceTestUtils.logStateDirFiles(); Optional<File> descriptorsFile = files.stream().filter( file -> file.getName().startsWith(LockServiceStateLogger.DESCRIPTORS_FILE_PREFIX)).findFirst(); Map<String, String> descriptorsMap = new Yaml().loadAs(new FileInputStream(descriptorsFile.get()), Map.class); Set<LockDescriptor> allDescriptors = getAllDescriptors(); for (LockDescriptor descriptor : allDescriptors) { assertTrue("Existing descriptor can't be found in dumped descriptors", descriptorsMap.values().stream().anyMatch(descriptorFromFile -> descriptorFromFile.equals(descriptor.toString()))); } }
private void testEncodedLockId(byte[] bytes) { assertThat(ByteArrayLockDescriptor.of(bytes).toString(), equalTo(expectedEncodedLockDescriptorToString(bytes))); }
private void testEncodedLockDescriptors(String lockId) { assertThat(StringLockDescriptor.of(lockId).toString(), equalTo(expectedEncodedLockDescriptorToString(lockId))); testEncodedLockId(stringToBytes(lockId)); }
@Test public void noRetryOnExpiredLockTokens() throws InterruptedException { HeldLocksToken expiredLockToken = getExpiredHeldLocksToken(); try { txManager.runTaskWithLocksWithRetry(ImmutableList.of(expiredLockToken), () -> null, (tx, locks) -> { tx.put(TABLE, ImmutableMap.of(TEST_CELL, PtBytes.toBytes("value"))); return null; }); fail(); } catch (TransactionLockTimeoutNonRetriableException e) { LockDescriptor descriptor = Iterables.getFirst(expiredLockToken.getLockDescriptors(), null); assertThat(e.getMessage(), containsString(descriptor.toString())); assertThat(e.getMessage(), containsString("Retry is not possible.")); } }