1,3 → 1,6 |
// FIXME |
// - temporary file names |
// |
package ak.diskbench; |
|
import java.util.List; |
20,6 → 23,8 |
public static void main(String[] args) |
throws Exception |
{ |
Sweeper.init(); |
|
DiskBench db = new DiskBench(); |
|
if(db.parseParams(args)) |
170,19 → 175,9 |
+ " " + length + "/" + bufLength + " " + randomWrites + "/" + randomReads |
+ " " + sleepMin + "/" + sleepMax); |
|
List threads = new ArrayList(); |
List workers = new ArrayList(); |
List threads = new ArrayList(); |
List workers = new ArrayList(); |
|
File commonTempFile; |
if(oneFile) { |
commonTempFile = File.createTempFile("db_", null, new File(dirName, ".")); |
commonTempFile.deleteOnExit(); |
} |
else { |
commonTempFile = null; |
} |
|
|
DiskThread.prepare(threadNumber); |
for(int i = 0; i < threadNumber; i++) { |
log.debug("create thread " + i); |
190,17 → 185,8 |
DiskThread dt = new DiskThread(); |
workers.add(dt); |
|
File tempFile; |
if(oneFile) { |
tempFile = commonTempFile; |
} |
else { |
tempFile = File.createTempFile("db-" + dt.getId() + "_", null, |
new File(dirName, ".")); |
tempFile.deleteOnExit(); |
} |
|
dt.setFile(tempFile); |
dt.setFileName((dirName == null ? "" : dirName) |
+ (oneFile ? "test.bin" : "test" + dt.getId() + ".bin")); |
dt.setSeed(seed); |
dt.setCreateFile(i == 0 || !oneFile); |
dt.setLength(length); |
313,7 → 299,7 |
} |
|
private int id; |
private File file; |
private String fileName; |
private long seed = 0; |
private boolean createFile = true; |
private long length = 1024 * 1024; // 1M |
335,14 → 321,14 |
return id; |
} |
|
public File getFile() |
public String getFileName() |
{ |
return file; |
return fileName; |
} |
|
public void setFile(File file) |
public void setFileName(String fileName) |
{ |
this.file = file; |
this.fileName = fileName; |
} |
|
public boolean getCreateFile() |
449,8 → 435,25 |
result.writeSleep = 0; |
result.readSleep = 0; |
|
// try to delete the test file if it exists and abort execution on exception |
if(createFile) { |
try { |
if((new File(fileName)).delete()) |
log.debug(Integer.toString(id) + ": test file " |
+ fileName + " deleted"); |
} |
catch(Exception ex) { |
result.success = false; |
result.stopTime = System.currentTimeMillis(); |
result.exception = ex; |
log.warn(Integer.toString(id) |
+ ": cannot delete the test file, execution aborted", ex); |
return; |
} |
} |
|
try { |
RandomAccessFile f = new RandomAccessFile(file, "rw"); |
RandomAccessFile file = new RandomAccessFile(fileName, "rw"); |
Random random = (seed > 0) ? new Random(seed) : new Random(); |
byte[] buf = new byte[bufLength]; |
|
458,9 → 461,10 |
|
// sequential write |
if(createFile) { |
Sweeper.addFile(fileName); |
result.sequentialWriteStart = System.currentTimeMillis(); |
for(int j = 0; j < length / bufLength; j++) { |
f.write(buf); |
file.write(buf); |
} |
result.sequentialWriteStop = System.currentTimeMillis(); |
log.info("sequential write: " |
471,9 → 475,9 |
barrier.await(); |
|
// sequential read |
f.seek(0); |
file.seek(0); |
result.sequentialReadStart = System.currentTimeMillis(); |
while(f.read(buf) > 0); |
while(file.read(buf) > 0); |
result.sequentialReadStop = System.currentTimeMillis(); |
log.info("sequential read: " |
+ (result.sequentialReadStop - result.sequentialReadStart) + "ms = " |
486,8 → 490,8 |
result.randomWriteStart = System.currentTimeMillis(); |
for(int j = 0; j < randomWrites; j++) { |
result.writeSleep += sleep(); |
f.seek((long)(random.nextDouble() * (length - bufLength))); |
f.write(buf); |
file.seek((long)(random.nextDouble() * (length - bufLength))); |
file.write(buf); |
} |
result.randomWriteStop = System.currentTimeMillis(); |
log.info("random write: " + (result.randomWriteStop - result.randomWriteStart) |
501,8 → 505,8 |
result.randomReadStart = System.currentTimeMillis(); |
for(int j = 0; j < randomReads; j++) { |
result.readSleep += sleep(); |
f.seek((long)(random.nextDouble() * length)); |
f.read(buf); |
file.seek((long)(random.nextDouble() * length)); |
file.read(buf); |
} |
result.randomReadStop = System.currentTimeMillis(); |
log.info("random read: " + (result.randomReadStop - result.randomReadStart) |
523,11 → 527,12 |
finally { |
if(createFile) { |
try { |
file.delete(); |
(new File(fileName)).delete(); |
} |
catch(Exception ex) { |
log.warn(Integer.toString(id) + ": cannot delete the test file", ex); |
} |
Sweeper.removeFile(fileName); |
} |
} |
|
535,6 → 540,59 |
} |
} |
|
class Sweeper |
{ |
private static Log log = LogFactory.getLog(Sweeper.class); |
private static ArrayList files = new ArrayList(); |
|
public static void addFile(String fileName) |
{ |
synchronized(files) |
{ |
log.debug("Add file '" + fileName + "'"); |
files.add(fileName); |
} |
} |
|
public static void removeFile(String fileName) |
{ |
synchronized(files) |
{ |
log.debug("Remove file '" + fileName + "'"); |
files.remove(fileName); |
} |
} |
|
public static void init() |
{ |
log.debug("Init"); |
Runtime.getRuntime().addShutdownHook(new ShutdownThread()); |
} |
|
static class ShutdownThread extends Thread |
{ |
public void run() |
{ |
log.debug("Cleanup"); |
|
synchronized(files) |
{ |
for(int i = 0; i < files.size(); i++) { |
String fileName = (String)files.get(i); |
|
try { |
(new File(fileName)).delete(); |
log.info("Test file '" + fileName + "' deleted"); |
} |
catch(Exception ex) { |
log.warn("cannot delete test file '" + fileName + "'", ex); |
} |
} |
} |
} |
} |
} |
|
class Utils |
{ |
private static final String[] units = {"", "K", "M", "G", "T", "P"}; |