protected void startWriteTxn() { lock.enterCriticalSection(Lock.WRITE); } protected void finishReadTxn() { lock.leaveCriticalSection(); }
protected void startWriteTxn() { lock.enterCriticalSection(Lock.WRITE); } protected void finishReadTxn() { lock.leaveCriticalSection(); }
protected void startReadTxn() { lock.enterCriticalSection(Lock.READ); } protected void startWriteTxn() { lock.enterCriticalSection(Lock.WRITE); }
protected void startReadTxn() { lock.enterCriticalSection(Lock.READ); } protected void startWriteTxn() { lock.enterCriticalSection(Lock.WRITE); }
@Override public void enterCriticalSection(boolean requestReadLock) { this.getModelLock().enterCriticalSection(requestReadLock) ; }
@Override public void enterCriticalSection(boolean requestReadLock) { this.getModelLock().enterCriticalSection(requestReadLock) ; }
@Override public void enterCriticalSection(boolean readLockRequested) { forEach(lock -> lock.enterCriticalSection(readLockRequested)); }
/** Called transaction start code at most once per transaction. */ private void startTransaction(TxnType txnType, ReadWrite mode) { transactionLock.enterCriticalSection(mode.equals(ReadWrite.READ)); // get the dataset write lock, if needed. transactionType.set(txnType); transactionMode(mode); isInTransaction(true); }
@Override public void writerStarts(Transaction txn) { txn.getBaseDataset().getLock().enterCriticalSection(Lock.READ) ; }
@Override public void begin(TxnType txnType) { if ( isInTransaction() ) error("Already in a transaction") ; switch(txnType) { case READ_PROMOTE: case READ_COMMITTED_PROMOTE: throw new UnsupportedOperationException("begin("+txnType+")"); default: } ReadWrite readWrite = TxnType.convert(txnType); boolean isRead = readWrite.equals(ReadWrite.READ) ; lock.enterCriticalSection(isRead); this.inTransaction.set(true); this.txnMode.set(readWrite); this.txnType.set(txnType); }
@Override public void readerStarts(Transaction txn) { txn.getBaseDataset().getLock().enterCriticalSection(Lock.READ) ; }
@Test public void testOneWriterAtATime() throws InterruptedException { final Lock testLock = new LockMRPlusSW(); testLock.enterCriticalSection(false); final AtomicBoolean secondWriterHasLock = new AtomicBoolean(); // new writer defaultThreadFactory().newThread(() -> { testLock.enterCriticalSection(false); secondWriterHasLock.set(true); }).start(); sleep(5000); assertFalse("Multiple writers were allowed!", secondWriterHasLock.get()); }
@Test public void testOneWriterAtATime() throws InterruptedException { final Lock testLock = new LockMRPlusSW(); testLock.enterCriticalSection(false); final AtomicBoolean secondWriterHasLock = new AtomicBoolean(); // new writer defaultThreadFactory().newThread(() -> { testLock.enterCriticalSection(false); secondWriterHasLock.set(true); }).start(); sleep(5000); assertFalse("Multiple writers were allowed!", secondWriterHasLock.get()); }
@Override public WonMessage process(final WonMessage message) throws WonMessageProcessingException { Dataset dataset = message.getCompleteDataset(); StringBuilder errorMessage = new StringBuilder("Message is not valid, failed at check "); boolean valid = false; try { dataset.getLock().enterCriticalSection(true); valid = validator.validate(dataset, errorMessage); } finally { dataset.getLock().leaveCriticalSection(); } if (!valid) { logger.info(errorMessage.toString() + "\n Offending message:\n" + RdfUtils.writeDatasetToString(dataset, Lang .TRIG)); throw new WonMessageNotWellFormedException(errorMessage.toString()); } return message; }
@Test public void testAWriterDoesNotBlockReaders() { final Lock testLock = new LockMRPlusSW(); testLock.enterCriticalSection(false); final AtomicBoolean readerHasLock = new AtomicBoolean(); // new reader defaultThreadFactory().newThread(() -> { testLock.enterCriticalSection(true); readerHasLock.set(true); }).start(); await().untilTrue(readerHasLock); } }
@Test public void testMultipleReadersAtATime() { final Lock testLock = new LockMRPlusSW(); testLock.enterCriticalSection(true); final AtomicBoolean secondReaderHasLock = new AtomicBoolean(); // new reader defaultThreadFactory().newThread(() -> { testLock.enterCriticalSection(true); secondReaderHasLock.set(true); }).start(); // the only way to fail is to timeout await().untilTrue(secondReaderHasLock); }
@Test public void testAWriterDoesNotBlockReaders() { final Lock testLock = new LockMRPlusSW(); testLock.enterCriticalSection(false); final AtomicBoolean readerHasLock = new AtomicBoolean(); // new reader defaultThreadFactory().newThread(() -> { testLock.enterCriticalSection(true); readerHasLock.set(true); }).start(); await().untilTrue(readerHasLock); } }
@Test public void testMultipleReadersAtATime() { final Lock testLock = new LockMRPlusSW(); testLock.enterCriticalSection(true); final AtomicBoolean secondReaderHasLock = new AtomicBoolean(); // new reader defaultThreadFactory().newThread(() -> { testLock.enterCriticalSection(true); secondReaderHasLock.set(true); }).start(); // the only way to fail is to timeout await().untilTrue(secondReaderHasLock); }
@Override public void transactionPromotes(Transaction txnOld, Transaction txnNew) { // Switch locks. txnOld.getBaseDataset().getLock().leaveCriticalSection() ; txnNew.getBaseDataset().getLock().enterCriticalSection(Lock.READ) ; }
protected void applyChangeSetToModel(ChangeSet changeSet, Dataset dataset) { for (ModelChange modelChange: changeSet.getModelChanges()) { dataset.getLock().enterCriticalSection(Lock.WRITE); try { Model model = (modelChange.getGraphURI() == null) ? dataset.getDefaultModel() : dataset.getNamedModel(modelChange.getGraphURI()); operateOnModel(model, modelChange, dataset); } finally { dataset.getLock().leaveCriticalSection(); } } }