private void addUnlockTransactionRecord(Data key, long version) { TxnUnlockOperation operation = new TxnUnlockOperation(name, key, version); tx.add(new MapTransactionLogRecord(name, key, getPartitionId(key), operation, version, tx.getOwnerUuid())); }
private void unlock(Data key, VersionedValue versionedValue) { try { TxnUnlockOperation unlockOperation = new TxnUnlockOperation(name, key, versionedValue.version); unlockOperation.setThreadId(ThreadUtil.getThreadId()); unlockOperation.setOwnerUuid(tx.getOwnerUuid()); int partitionId = partitionService.getPartitionId(key); Future<VersionedValue> future = operationService.invokeOnPartition(SERVICE_NAME, unlockOperation, partitionId); future.get(); valueMap.remove(key); } catch (Throwable t) { throw rethrow(t); } }
private void unlock(Data key, VersionedValue versionedValue) { try { TxnUnlockOperation unlockOperation = new TxnUnlockOperation(name, key, versionedValue.version); unlockOperation.setThreadId(ThreadUtil.getThreadId()); unlockOperation.setOwnerUuid(tx.getOwnerUuid()); int partitionId = partitionService.getPartitionId(key); Future<VersionedValue> future = operationService.invokeOnPartition(SERVICE_NAME, unlockOperation, partitionId); future.get(); valueMap.remove(key); } catch (Throwable t) { throw rethrow(t); } }
private void addUnlockTransactionRecord(Data key, long version) { TxnUnlockOperation operation = new TxnUnlockOperation(name, key, version); tx.add(new MapTransactionLogRecord(name, key, getPartitionId(key), operation, version, tx.getOwnerUuid())); }
private VersionedValue lockAndGet(Data key, long timeout, boolean shouldLoad) { VersionedValue versionedValue = valueMap.get(key); if (versionedValue != null) { return versionedValue; } boolean blockReads = tx.getTransactionType() == TransactionType.ONE_PHASE; MapOperation operation = operationProvider.createTxnLockAndGetOperation(name, key, timeout, timeout, tx.getOwnerUuid(), shouldLoad, blockReads); operation.setThreadId(ThreadUtil.getThreadId()); try { int partitionId = partitionService.getPartitionId(key); Future<VersionedValue> future = operationService.invokeOnPartition(SERVICE_NAME, operation, partitionId); versionedValue = future.get(); if (versionedValue == null) { throw new TransactionTimedOutException("Transaction couldn't obtain lock for the key: " + toObjectIfNeeded(key)); } valueMap.put(key, versionedValue); return versionedValue; } catch (Throwable t) { throw rethrow(t); } }
private VersionedValue lockAndGet(Data key, long timeout, boolean shouldLoad) { VersionedValue versionedValue = valueMap.get(key); if (versionedValue != null) { return versionedValue; } boolean blockReads = tx.getTransactionType() == TransactionType.ONE_PHASE; MapOperation operation = operationProvider.createTxnLockAndGetOperation(name, key, timeout, timeout, tx.getOwnerUuid(), shouldLoad, blockReads); operation.setThreadId(ThreadUtil.getThreadId()); try { int partitionId = partitionService.getPartitionId(key); Future<VersionedValue> future = operationService.invokeOnPartition(SERVICE_NAME, operation, partitionId); versionedValue = future.get(); if (versionedValue == null) { throw new TransactionTimedOutException("Transaction couldn't obtain lock for the key: " + toObjectIfNeeded(key)); } valueMap.put(key, versionedValue); return versionedValue; } catch (Throwable t) { throw rethrow(t); } }
Data removeInternal(Data key) { VersionedValue versionedValue = lockAndGet(key, tx.getTimeoutMillis()); tx.add(new MapTransactionLogRecord(name, key, getPartitionId(key), operationProvider.createTxnDeleteOperation(name, key, versionedValue.version), versionedValue.version, tx.getOwnerUuid())); return versionedValue.value; }
Data removeInternal(Data key) { VersionedValue versionedValue = lockAndGet(key, tx.getTimeoutMillis()); tx.add(new MapTransactionLogRecord(name, key, getPartitionId(key), operationProvider.createTxnDeleteOperation(name, key, versionedValue.version), versionedValue.version, tx.getOwnerUuid())); return versionedValue.value; }
Data replaceInternal(Data key, Data value) { boolean unlockImmediately = !valueMap.containsKey(key); VersionedValue versionedValue = lockAndGet(key, tx.getTimeoutMillis()); if (versionedValue.value == null) { if (unlockImmediately) { unlock(key, versionedValue); return null; } addUnlockTransactionRecord(key, versionedValue.version); return null; } MapOperation operation = operationProvider.createTxnSetOperation(name, key, value, versionedValue.version, -1); tx.add(new MapTransactionLogRecord(name, key, getPartitionId(key), operation, versionedValue.version, tx.getOwnerUuid())); return versionedValue.value; }
Data putIfAbsentInternal(Data key, Data value) { boolean unlockImmediately = !valueMap.containsKey(key); VersionedValue versionedValue = lockAndGet(key, tx.getTimeoutMillis()); if (versionedValue.value != null) { if (unlockImmediately) { unlock(key, versionedValue); return versionedValue.value; } addUnlockTransactionRecord(key, versionedValue.version); return versionedValue.value; } MapOperation operation = operationProvider.createTxnSetOperation(name, key, value, versionedValue.version, -1); tx.add(new MapTransactionLogRecord(name, key, getPartitionId(key), operation, versionedValue.version, tx.getOwnerUuid())); return versionedValue.value; }
Data putIfAbsentInternal(Data key, Data value) { boolean unlockImmediately = !valueMap.containsKey(key); VersionedValue versionedValue = lockAndGet(key, tx.getTimeoutMillis()); if (versionedValue.value != null) { if (unlockImmediately) { unlock(key, versionedValue); return versionedValue.value; } addUnlockTransactionRecord(key, versionedValue.version); return versionedValue.value; } MapOperation operation = operationProvider.createTxnSetOperation(name, key, value, versionedValue.version, -1); tx.add(new MapTransactionLogRecord(name, key, getPartitionId(key), operation, versionedValue.version, tx.getOwnerUuid())); return versionedValue.value; }
Data replaceInternal(Data key, Data value) { boolean unlockImmediately = !valueMap.containsKey(key); VersionedValue versionedValue = lockAndGet(key, tx.getTimeoutMillis()); if (versionedValue.value == null) { if (unlockImmediately) { unlock(key, versionedValue); return null; } addUnlockTransactionRecord(key, versionedValue.version); return null; } MapOperation operation = operationProvider.createTxnSetOperation(name, key, value, versionedValue.version, -1); tx.add(new MapTransactionLogRecord(name, key, getPartitionId(key), operation, versionedValue.version, tx.getOwnerUuid())); return versionedValue.value; }
Data putInternal(Data key, Data value, long ttl, TimeUnit timeUnit) { VersionedValue versionedValue = lockAndGet(key, tx.getTimeoutMillis()); long timeInMillis = getTimeInMillis(ttl, timeUnit); MapOperation operation = operationProvider.createTxnSetOperation(name, key, value, versionedValue.version, timeInMillis); tx.add(new MapTransactionLogRecord(name, key, getPartitionId(key), operation, versionedValue.version, tx.getOwnerUuid())); return versionedValue.value; }
boolean removeIfSameInternal(Data key, Object value) { boolean unlockImmediately = !valueMap.containsKey(key); VersionedValue versionedValue = lockAndGet(key, tx.getTimeoutMillis()); if (!isEquals(versionedValue.value, value)) { if (unlockImmediately) { unlock(key, versionedValue); return false; } addUnlockTransactionRecord(key, versionedValue.version); return false; } tx.add(new MapTransactionLogRecord(name, key, getPartitionId(key), operationProvider.createTxnDeleteOperation(name, key, versionedValue.version), versionedValue.version, tx.getOwnerUuid())); return true; }
Data putInternal(Data key, Data value, long ttl, TimeUnit timeUnit) { VersionedValue versionedValue = lockAndGet(key, tx.getTimeoutMillis()); long timeInMillis = getTimeInMillis(ttl, timeUnit); MapOperation operation = operationProvider.createTxnSetOperation(name, key, value, versionedValue.version, timeInMillis); tx.add(new MapTransactionLogRecord(name, key, getPartitionId(key), operation, versionedValue.version, tx.getOwnerUuid())); return versionedValue.value; }
boolean replaceIfSameInternal(Data key, Object oldValue, Data newValue) { boolean unlockImmediately = !valueMap.containsKey(key); VersionedValue versionedValue = lockAndGet(key, tx.getTimeoutMillis()); if (!isEquals(oldValue, versionedValue.value)) { if (unlockImmediately) { unlock(key, versionedValue); return false; } addUnlockTransactionRecord(key, versionedValue.version); return false; } MapOperation operation = operationProvider.createTxnSetOperation(name, key, newValue, versionedValue.version, -1); tx.add(new MapTransactionLogRecord(name, key, getPartitionId(key), operation, versionedValue.version, tx.getOwnerUuid())); return true; }
boolean replaceIfSameInternal(Data key, Object oldValue, Data newValue) { boolean unlockImmediately = !valueMap.containsKey(key); VersionedValue versionedValue = lockAndGet(key, tx.getTimeoutMillis()); if (!isEquals(oldValue, versionedValue.value)) { if (unlockImmediately) { unlock(key, versionedValue); return false; } addUnlockTransactionRecord(key, versionedValue.version); return false; } MapOperation operation = operationProvider.createTxnSetOperation(name, key, newValue, versionedValue.version, -1); tx.add(new MapTransactionLogRecord(name, key, getPartitionId(key), operation, versionedValue.version, tx.getOwnerUuid())); return true; }
boolean removeIfSameInternal(Data key, Object value) { boolean unlockImmediately = !valueMap.containsKey(key); VersionedValue versionedValue = lockAndGet(key, tx.getTimeoutMillis()); if (!isEquals(versionedValue.value, value)) { if (unlockImmediately) { unlock(key, versionedValue); return false; } addUnlockTransactionRecord(key, versionedValue.version); return false; } tx.add(new MapTransactionLogRecord(name, key, getPartitionId(key), operationProvider.createTxnDeleteOperation(name, key, versionedValue.version), versionedValue.version, tx.getOwnerUuid())); return true; }
Data pollInternal(long timeout) { QueueItem reservedOffer = offeredQueue.peek(); long itemId = reservedOffer == null ? -1 : reservedOffer.getItemId(); TxnReservePollOperation operation = new TxnReservePollOperation(name, timeout, itemId, tx.getTxnId()); operation.setCallerUuid(tx.getOwnerUuid()); try { Future<QueueItem> future = invoke(operation); QueueItem item = future.get(); if (item != null) { if (reservedOffer != null && item.getItemId() == reservedOffer.getItemId()) { offeredQueue.poll(); removeFromRecord(reservedOffer.getItemId()); itemIdSet.remove(reservedOffer.getItemId()); return reservedOffer.getData(); } // if (!itemIdSet.add(item.getItemId())) { throw new TransactionException("Duplicate itemId: " + item.getItemId()); } TxnPollOperation txnPollOperation = new TxnPollOperation(name, item.getItemId()); putToRecord(txnPollOperation); return item.getData(); } } catch (Throwable t) { throw ExceptionUtil.rethrow(t); } return null; }
Data pollInternal(long timeout) { QueueItem reservedOffer = offeredQueue.peek(); long itemId = reservedOffer == null ? -1 : reservedOffer.getItemId(); TxnReservePollOperation operation = new TxnReservePollOperation(name, timeout, itemId, tx.getTxnId()); operation.setCallerUuid(tx.getOwnerUuid()); try { Future<QueueItem> future = invoke(operation); QueueItem item = future.get(); if (item != null) { if (reservedOffer != null && item.getItemId() == reservedOffer.getItemId()) { offeredQueue.poll(); removeFromRecord(reservedOffer.getItemId()); itemIdSet.remove(reservedOffer.getItemId()); return reservedOffer.getData(); } // if (!itemIdSet.add(item.getItemId())) { throw new TransactionException("Duplicate itemId: " + item.getItemId()); } TxnPollOperation txnPollOperation = new TxnPollOperation(name, item.getItemId()); putToRecord(txnPollOperation); return item.getData(); } } catch (Throwable t) { throw ExceptionUtil.rethrow(t); } return null; }