1,6 → 1,3 |
// FIXME |
// - temporary file names |
// |
package ak.diskbench; |
|
import java.util.List; |
23,8 → 20,6 |
public static void main(String[] args) |
throws Exception |
{ |
Sweeper.init(); |
|
DiskBench db = new DiskBench(); |
|
if(db.parseParams(args)) |
175,9 → 170,19 |
+ " " + 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); |
185,8 → 190,17 |
DiskThread dt = new DiskThread(); |
workers.add(dt); |
|
dt.setFileName((dirName == null ? "" : dirName) |
+ (oneFile ? "test.bin" : "test" + dt.getId() + ".bin")); |
File tempFile; |
if(oneFile) { |
tempFile = commonTempFile; |
} |
else { |
tempFile = File.createTempFile("db-" + dt.getId() + "_", null, |
new File(dirName, ".")); |
tempFile.deleteOnExit(); |
} |
|
dt.setFile(tempFile); |
dt.setSeed(seed); |
dt.setCreateFile(i == 0 || !oneFile); |
dt.setLength(length); |
299,7 → 313,7 |
} |
|
private int id; |
private String fileName; |
private File file; |
private long seed = 0; |
private boolean createFile = true; |
private long length = 1024 * 1024; // 1M |
321,14 → 335,14 |
return id; |
} |
|
public String getFileName() |
public File getFile() |
{ |
return fileName; |
return file; |
} |
|
public void setFileName(String fileName) |
public void setFile(File file) |
{ |
this.fileName = fileName; |
this.file = file; |
} |
|
public boolean getCreateFile() |
435,25 → 449,8 |
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 file = new RandomAccessFile(fileName, "rw"); |
RandomAccessFile f = new RandomAccessFile(file, "rw"); |
Random random = (seed > 0) ? new Random(seed) : new Random(); |
byte[] buf = new byte[bufLength]; |
|
461,10 → 458,9 |
|
// sequential write |
if(createFile) { |
Sweeper.addFile(fileName); |
result.sequentialWriteStart = System.currentTimeMillis(); |
for(int j = 0; j < length / bufLength; j++) { |
file.write(buf); |
f.write(buf); |
} |
result.sequentialWriteStop = System.currentTimeMillis(); |
log.info("sequential write: " |
475,9 → 471,9 |
barrier.await(); |
|
// sequential read |
file.seek(0); |
f.seek(0); |
result.sequentialReadStart = System.currentTimeMillis(); |
while(file.read(buf) > 0); |
while(f.read(buf) > 0); |
result.sequentialReadStop = System.currentTimeMillis(); |
log.info("sequential read: " |
+ (result.sequentialReadStop - result.sequentialReadStart) + "ms = " |
490,8 → 486,8 |
result.randomWriteStart = System.currentTimeMillis(); |
for(int j = 0; j < randomWrites; j++) { |
result.writeSleep += sleep(); |
file.seek((long)(random.nextDouble() * (length - bufLength))); |
file.write(buf); |
f.seek((long)(random.nextDouble() * (length - bufLength))); |
f.write(buf); |
} |
result.randomWriteStop = System.currentTimeMillis(); |
log.info("random write: " + (result.randomWriteStop - result.randomWriteStart) |
505,8 → 501,8 |
result.randomReadStart = System.currentTimeMillis(); |
for(int j = 0; j < randomReads; j++) { |
result.readSleep += sleep(); |
file.seek((long)(random.nextDouble() * length)); |
file.read(buf); |
f.seek((long)(random.nextDouble() * length)); |
f.read(buf); |
} |
result.randomReadStop = System.currentTimeMillis(); |
log.info("random read: " + (result.randomReadStop - result.randomReadStart) |
527,12 → 523,11 |
finally { |
if(createFile) { |
try { |
(new File(fileName)).delete(); |
file.delete(); |
} |
catch(Exception ex) { |
log.warn(Integer.toString(id) + ": cannot delete the test file", ex); |
} |
Sweeper.removeFile(fileName); |
} |
} |
|
540,59 → 535,6 |
} |
} |
|
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"}; |