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; }
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; }