protected boolean putInternal(Data key, Data value) { throwExceptionIfNull(key); throwExceptionIfNull(value); Collection<MultiMapRecord> coll = txMap.get(key); long recordId = -1; long timeout = tx.getTimeoutMillis(); long ttl = extendTimeout(timeout); final MultiMapTransactionLog log; if (coll == null) { MultiMapResponse response = lockAndGet(key, timeout, ttl); if (response == null) { throw new ConcurrentModificationException( "Transaction couldn't obtain lock " + getThreadId()); } recordId = response.getNextRecordId(); coll = createCollection(response.getRecordCollection(getNodeEngine())); txMap.put(key, coll); log = new MultiMapTransactionLog(key, name, ttl, getThreadId()); tx.addTransactionLog(log); } else { log = (MultiMapTransactionLog) tx.getTransactionLog(getTxLogKey(key)); } MultiMapRecord record = new MultiMapRecord(config.isBinary() ? value : getNodeEngine().toObject(value)); if (coll.add(record)) { if (recordId == -1) { recordId = nextId(key); } record.setRecordId(recordId); TxnPutOperation operation = new TxnPutOperation(name, key, value, recordId); log.addOperation(operation); return true; } return false; }
public int size() { checkTransactionState(); try { final OperationService operationService = getNodeEngine().getOperationService(); final Map<Integer, Object> results = operationService.invokeOnAllPartitions( MultiMapService.SERVICE_NAME, new MultiMapOperationFactory( name, MultiMapOperationFactory.OperationFactoryType.SIZE)); int size = 0; for (Object obj : results.values()) { if (obj == null) { continue; } Integer result = getNodeEngine().toObject(obj); size += result; } for (Data key : txMap.keySet()) { MultiMapTransactionLog log = (MultiMapTransactionLog) tx.getTransactionLog(getTxLogKey(key)); if (log != null) { size += log.size(); } } return size; } catch (Throwable t) { throw ExceptionUtil.rethrow(t); } }
protected boolean removeInternal(Data key, Data value) { throwExceptionIfNull(key); throwExceptionIfNull(value); Collection<MultiMapRecord> coll = txMap.get(key); long timeout = tx.getTimeoutMillis(); long ttl = extendTimeout(timeout); final MultiMapTransactionLog log; if (coll == null) { MultiMapResponse response = lockAndGet(key, timeout, ttl); if (response == null) { throw new ConcurrentModificationException( "Transaction couldn't obtain lock " + getThreadId()); } coll = createCollection(response.getRecordCollection(getNodeEngine())); txMap.put(key, coll); log = new MultiMapTransactionLog(key, name, ttl, getThreadId()); tx.addTransactionLog(log); } else { log = (MultiMapTransactionLog) tx.getTransactionLog(getTxLogKey(key)); } MultiMapRecord record = new MultiMapRecord(config.isBinary() ? value : getNodeEngine().toObject(value)); Iterator<MultiMapRecord> iterator = coll.iterator(); long recordId = -1; while (iterator.hasNext()) { MultiMapRecord r = iterator.next(); if (r.equals(record)) { iterator.remove(); recordId = r.getRecordId(); break; } } if (recordId != -1) { TxnRemoveOperation operation = new TxnRemoveOperation(name, key, recordId, value); log.addOperation(operation); return recordId != -1; } return false; }
protected Collection<MultiMapRecord> removeAllInternal(Data key) { throwExceptionIfNull(key); long timeout = tx.getTimeoutMillis(); long ttl = extendTimeout(timeout); Collection<MultiMapRecord> coll = txMap.get(key); final MultiMapTransactionLog log; if (coll == null) { MultiMapResponse response = lockAndGet(key, timeout, ttl); if (response == null) { throw new ConcurrentModificationException( "Transaction couldn't obtain lock " + getThreadId()); } coll = createCollection(response.getRecordCollection(getNodeEngine())); log = new MultiMapTransactionLog(key, name, ttl, getThreadId()); tx.addTransactionLog(log); } else { log = (MultiMapTransactionLog) tx.getTransactionLog(getTxLogKey(key)); } txMap.put(key, createCollection()); TxnRemoveAllOperation operation = new TxnRemoveAllOperation(name, key, coll); log.addOperation(operation); return coll; }