use of org.commonjava.util.partyline.lock.local.LocalLockOwner in project partyline by Commonjava.
the class BinaryFileTest method shouldReadBinaryFile.
@Test
public void shouldReadBinaryFile() throws IOException, InterruptedException {
List<String> failures = new ArrayList<>();
File binaryFile = temp.newFile("binary-file.bin");
ReentrantLock lock = new ReentrantLock();
JoinableFile jf = new RandomAccessJFS().getFile(binaryFile, new LocalLockOwner(binaryFile.getAbsolutePath(), name.getMethodName(), LockLevel.write), null, true, new SignallingLock());
OutputStream jos = jf.getOutputStream();
InputStream actual = jf.joinStream();
ByteArrayOutputStream written = new ByteArrayOutputStream();
writeBinaryFile(jos, written);
int pos = 0;
int exp, act;
ByteArrayInputStream expected = new ByteArrayInputStream(written.toByteArray());
while ((exp = expected.read()) != -1) {
act = actual.read();
pos++;
if (act != exp) {
failures.add(String.format("Failure at position %d. Expected %d, got %d", pos, exp, act));
}
}
actual.close();
if (!failures.isEmpty()) {
fail("Failures: " + failures);
}
}
use of org.commonjava.util.partyline.lock.local.LocalLockOwner in project partyline by Commonjava.
the class JoinFileWriteJustBeforeFinishedTest method run.
/**
* Test verifies JoinableFile read could be done before its write stream close
* with read init delay, this setup an script of events for one single file, where:
* <ol>
* <li>Simulate JoinableFile write process </li>
* <li>Read should be proceeded before write stream close</li>
* </ol>
* @throws Exception
*/
@BMRules(rules = { // wait for read call to exit
@BMRule(name = "write close", targetClass = "RandomAccessJF", targetMethod = "close", targetLocation = "ENTRY", condition = "incrementCounter($0)==1", action = "debug(\">>>wait for service enter read.\");" + "waitFor(\"read\");" + "debug(\"<<<proceed with write close.\")"), // setup the trigger to signal write close when the read exits
@BMRule(name = "read", targetClass = "RandomAccessJF", targetMethod = "joinStream", targetLocation = "EXIT", action = "debug(\"<<<signalling write close.\"); " + "signalWake(\"read\", true);" + "debug(\"<<<signalled write close.\")") })
@Test
@BMUnitConfig(debug = true)
public void run() throws Exception {
final ExecutorService execs = Executors.newFixedThreadPool(2);
final CountDownLatch latch = new CountDownLatch(2);
final File file = temp.newFile();
String threadName = "writer" + writers++;
final JoinableFile stream = new RandomAccessJFS().getFile(file, new LocalLockOwner(file.getAbsolutePath(), name.getMethodName(), LockLevel.write), null, true, new SignallingLock());
execs.execute(() -> {
Thread.currentThread().setName(threadName);
new TimedFileWriter(stream, 1, latch).run();
});
execs.execute(() -> {
Thread.currentThread().setName("reader" + readers++);
new AsyncFileReader(1000, -1, -1, stream, latch).run();
});
System.out.println("Waiting for " + name.getMethodName() + " threads to complete.");
latch.await();
}
use of org.commonjava.util.partyline.lock.local.LocalLockOwner in project partyline by Commonjava.
the class InfinispanJFS method getMetadata.
FileMeta getMetadata(final File target, final LocalLockOwner owner) throws IOException {
String path = target.getAbsolutePath();
return lockManager.lockAnd(path, (key, opLock) -> {
FileMeta meta = null;
TransactionManager transactionManager = metadataCache.getAdvancedCache().getTransactionManager();
try {
transactionManager.begin();
meta = metadataCache.computeIfAbsent(path, (p) -> new FileMeta(p, target.isDirectory(), this.blockSize));
LockLevel currentLockLevel = meta.getLockLevel(this.nodeKey);
// Only update the cache if the lock level changed
if (currentLockLevel == null || currentLockLevel != owner.getLockLevel()) {
meta.setLock(this.nodeKey, owner.getLockLevel());
metadataCache.put(path, meta);
}
transactionManager.commit();
} catch (Exception e) {
logger.error("Failed to execute in transaction. Rolling back. Path: " + path, e);
try {
transactionManager.rollback();
} catch (SystemException e1) {
logger.error("SystemException during transaction rollback involving path: " + path, e1);
}
}
return meta;
});
}
Aggregations