use of org.commonjava.util.partyline.spi.JoinableFile in project partyline by Commonjava.
the class JoinFileWriteTest method run.
/**
* Test verifies JoinableFile read could be done before its write stream close
* without any 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, 0, latch).run();
});
execs.execute(() -> {
Thread.currentThread().setName("reader" + readers++);
new AsyncFileReader(0, -1, -1, stream, latch).run();
});
System.out.println("Waiting for " + name.getMethodName() + " threads to complete.");
latch.await();
}
use of org.commonjava.util.partyline.spi.JoinableFile in project partyline by Commonjava.
the class JoinableFileManagerPerformanceTest method bigFileWritePerformanceTest.
@Test
public void bigFileWritePerformanceTest() throws Exception {
final File f = temp.newFile("bigfile.txt");
final File fm = temp.newFile("bigfileJFM.txt");
final File jft = temp.newFile("bigfileJF.txt");
String content = createBigFileContent();
JoinableFile jf = new RandomAccessJFS().getFile(jft, new LocalLockOwner(jft.getPath(), "write test", LockLevel.write), null, true, new SignallingLock());
long start = System.currentTimeMillis();
System.out.println("Opening output...");
try (OutputStream out = jf.getOutputStream()) {
System.out.println("Writing content");
out.write(content.getBytes());
System.out.println("closing stream");
}
long end = System.currentTimeMillis();
System.out.println("closing file");
jf.close();
System.out.println("done");
long jfTime = end - start;
// JFM file io
start = System.currentTimeMillis();
try (OutputStream out = mgr.openOutputStream(fm)) {
out.write(content.getBytes());
}
end = System.currentTimeMillis();
final long jfmFileWritingTime = end - start;
// Normal java file io
start = System.currentTimeMillis();
try (FileOutputStream stream = new FileOutputStream(f)) {
stream.write(content.getBytes());
}
end = System.currentTimeMillis();
final long javaFileWritingTime = end - start;
System.out.println(String.format("File size: JFM file: %dM; JF file: %dM; Java FO file: %dM", fm.length() / 1024 / 1024, jft.length() / 1024 / 1024, f.length() / 1024 / 1024));
System.out.printf("File IO time comparison: JFM writing: %dms; JF writing: %dms; Java FO writing: %dms. Ratio JFM/FO: %d, JF/FO: %d\n", jfmFileWritingTime, jfTime, javaFileWritingTime, (jfmFileWritingTime / javaFileWritingTime), (jfTime / javaFileWritingTime));
// TODO: Seems current JFM writing performance is slower about 3 times than normal java File IO when writing a 50m file
final int times = 10;
if (jfmFileWritingTime / javaFileWritingTime > times) {
fail(String.format("JFM writing performance is %d times slower than normal Java FO writing against a %dm file", (jfmFileWritingTime / javaFileWritingTime), f.length() / 1024 / 1024));
}
}
use of org.commonjava.util.partyline.spi.JoinableFile in project partyline by Commonjava.
the class JoinableFileTest method lockDirectoryIsNotJoinable.
@Test
public void lockDirectoryIsNotJoinable() throws IOException {
File dir = temp.newFolder();
dir.mkdirs();
final JoinableFile jf = new RandomAccessJFS().getFile(dir, newLockOwner(dir.getAbsolutePath(), LockLevel.read), null, false, new SignallingLock());
assertThat(jf.isWriteLocked(), equalTo(true));
assertThat(jf.isJoinable(), equalTo(false));
jf.close();
}
use of org.commonjava.util.partyline.spi.JoinableFile in project partyline by Commonjava.
the class JoinableFileTest method joinFileWriteContinueAfterInputStreamClose.
@Test
public void joinFileWriteContinueAfterInputStreamClose() throws Exception {
final ExecutorService execs = Executors.newFixedThreadPool(1);
final CountDownLatch latch = new CountDownLatch(1);
final File tempFile = temp.newFile();
String threadName = "writer" + writers++;
final JoinableFile stream = new RandomAccessJFS().getFile(tempFile, newLockOwner(tempFile.getAbsolutePath(), LockLevel.write), null, true, new SignallingLock());
execs.execute(() -> {
Thread.currentThread().setName(threadName);
new TimedFileWriter(stream, 1, latch).run();
});
InputStream inStream = stream.joinStream();
InputStream inStream2 = stream.joinStream();
Thread.sleep(1000);
inStream.close();
inStream2.close();
System.out.println("All input stream closed. Waiting for " + name.getMethodName() + " writer thread to complete.");
latch.await();
final File file = new File(stream.getPath());
System.out.println("File length: " + file.length());
final List<String> lines = FileUtils.readLines(file);
System.out.println(lines);
assertThat(lines.size(), equalTo(COUNT));
}
use of org.commonjava.util.partyline.spi.JoinableFile in project partyline by Commonjava.
the class JoinableFileTest method writeToFile.
@Test
public void writeToFile() throws Exception {
final ExecutorService execs = Executors.newFixedThreadPool(1);
final CountDownLatch latch = new CountDownLatch(1);
final File tempFile = temp.newFile();
String threadName = "writer" + writers++;
final JoinableFile stream = new RandomAccessJFS().getFile(tempFile, newLockOwner(tempFile.getAbsolutePath(), LockLevel.write), null, true, new SignallingLock());
execs.execute(() -> {
Thread.currentThread().setName(threadName);
new TimedFileWriter(stream, 0, latch).run();
});
System.out.println("Waiting for " + name.getMethodName() + " threads to complete.");
latch.await();
final File file = new File(stream.getPath());
System.out.println("File length: " + file.length());
final List<String> lines = FileUtils.readLines(file);
System.out.println(lines);
assertThat(lines.size(), equalTo(COUNT));
}
Aggregations