in src/main/java/com/amazonaws/services/dynamodbv2/AmazonDynamoDBLockClient.java [584:620]
private LockItem upsertAndMonitorExpiredLock(AcquireLockOptions options, String key, Optional<String> sortKey, boolean deleteLockOnRelease,
Optional<SessionMonitor> sessionMonitor, Optional<LockItem> existingLock, Optional<ByteBuffer> newLockData, Map<String, AttributeValue> item, String recordVersionNumber) {
final String conditionalExpression;
final Map<String, AttributeValue> expressionAttributeValues = new HashMap<>();
final boolean updateExistingLockRecord = options.getUpdateExistingLockRecord();
expressionAttributeValues.put(RVN_VALUE_EXPRESSION_VARIABLE, AttributeValue.builder().s(existingLock.get().getRecordVersionNumber()).build());
final Map<String, String> expressionAttributeNames = new HashMap<>();
expressionAttributeNames.put(PK_PATH_EXPRESSION_VARIABLE, partitionKeyName);
expressionAttributeNames.put(RVN_PATH_EXPRESSION_VARIABLE, RECORD_VERSION_NUMBER);
if (this.sortKeyName.isPresent()) {
//We do not check the owner here because the lock is expired and it is OK to overwrite the owner
conditionalExpression = PK_EXISTS_AND_SK_EXISTS_AND_RVN_IS_THE_SAME_CONDITION;
expressionAttributeNames.put(SK_PATH_EXPRESSION_VARIABLE, sortKeyName.get());
} else {
conditionalExpression = PK_EXISTS_AND_RVN_IS_THE_SAME_CONDITION;
}
if (updateExistingLockRecord) {
item.remove(partitionKeyName);
if (sortKeyName.isPresent()) {
item.remove(sortKeyName.get());
}
final String updateExpression = getUpdateExpressionAndUpdateNameValueMaps(item, expressionAttributeNames, expressionAttributeValues);
final UpdateItemRequest updateItemRequest = UpdateItemRequest.builder().tableName(tableName).key(getItemKeys(existingLock.get()))
.updateExpression(updateExpression).expressionAttributeNames(expressionAttributeNames)
.expressionAttributeValues(expressionAttributeValues).conditionExpression(conditionalExpression).build();
logger.trace("Acquiring an existing lock whose revisionVersionNumber did not change for " + partitionKeyName + " partitionKeyName=" + key + ", " + this.sortKeyName + "=" + sortKey);
return updateItemAndStartSessionMonitor(options, key, sortKey, deleteLockOnRelease, sessionMonitor, newLockData, recordVersionNumber, updateItemRequest);
} else {
final PutItemRequest putItemRequest = PutItemRequest.builder().item(item).tableName(tableName).conditionExpression(conditionalExpression)
.expressionAttributeNames(expressionAttributeNames).expressionAttributeValues(expressionAttributeValues).build();
logger.trace("Acquiring an existing lock whose revisionVersionNumber did not change for " + partitionKeyName + " partitionKeyName=" + key + ", " + this.sortKeyName + "=" + sortKey);
return putLockItemAndStartSessionMonitor(options, key, sortKey, deleteLockOnRelease, sessionMonitor, newLockData, recordVersionNumber, putItemRequest);
}
}