summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSuren A. Chilingaryan <csa@dside.dyndns.org>2012-11-29 03:18:11 +0100
committerSuren A. Chilingaryan <csa@dside.dyndns.org>2012-11-29 03:18:11 +0100
commit8cf73663783503d8e9ebef42e193bd90d6c84313 (patch)
tree1d7375e6120562242c2fec3f36f818a13716e328
parent1e5e50e44df26a15268132dc14b5d3d9cda178ff (diff)
downloadfwbench-8cf73663783503d8e9ebef42e193bd90d6c84313.tar.gz
fwbench-8cf73663783503d8e9ebef42e193bd90d6c84313.tar.bz2
fwbench-8cf73663783503d8e9ebef42e193bd90d6c84313.tar.xz
fwbench-8cf73663783503d8e9ebef42e193bd90d6c84313.zip
Big file support
-rw-r--r--seqreader.c31
1 files changed, 23 insertions, 8 deletions
diff --git a/seqreader.c b/seqreader.c
index 78d7eae..f06eef8 100644
--- a/seqreader.c
+++ b/seqreader.c
@@ -22,10 +22,14 @@
#define EXTRA_BUFFERS 2
#define WRITE_INTERVAL 1
+
#define RAID_STRIP_SIZE 256
#define RAID_DISKS 8
#define STRIPS_AT_ONCE 2
+#define FS_MIN_BLOCK_SIZE (1024 * RAID_STRIP_SIZE)
+#define FS_BLOCK_SIZE (1024 * RAID_STRIP_SIZE * RAID_DISKS)
+
#ifdef AIO_MODE
# define SYNC_MODE
#endif /* AIO_MODE */
@@ -62,6 +66,7 @@ int main(int argc, char *argv[]) {
char *buffer;
long double mcoef = 1000000. / (1024 * 1024);
int flags = O_RDONLY|O_NOATIME|O_LARGEFILE;
+ struct stat st;
#ifdef AIO_MODE
int i;
@@ -79,11 +84,16 @@ int main(int argc, char *argv[]) {
posix_memalign((void**)&buffer, FASTWRITER_SYNCIO_ALIGN, BUFSIZE);
if (argc < 2) {
- printf("Usage: %s <directory|device> [skip|size]\n", argv[0]);
+ printf("Usage: %s <directory|file|device> [skip|size]\n", argv[0]);
exit(0);
}
- if (strstr(argv[1], "/dev/")) {
+ if (stat(argv[1], &st)) {
+ printf("stat on (%s) have failed", argv[1]);
+ exit(-1);
+ }
+
+ if (strstr(argv[1], "/dev/")||(S_ISREG(st.st_mode))) {
if (argc > 2) {
max_size = atol(argv[2]);
max_size *= 1024 * 1024 * 1024;
@@ -125,8 +135,8 @@ int main(int argc, char *argv[]) {
#ifdef AIO_MODE
err = io_submit(aio, AIO_MODE, ioptr);
if (err != AIO_MODE) {
- printf("io_submit returned %i\n", err);
- perror("Failed to submit initial AIO jobs");
+ printf("Failed to submit initial AIO job, io_submit returned %i\n", err);
+ exit(-1);
}
#endif /* AIO_MODE */
@@ -155,7 +165,10 @@ int main(int argc, char *argv[]) {
for (i = 0; i < err; i++) {
struct io_event *ep = &ev[events + i];
int doneio = (uintptr_t)ep->data;
- if (ep->res2 || (ep->res != BLOCK_SIZE)) perror("Error in async IO");
+ if (ep->res2 || (ep->res != BLOCK_SIZE)) {
+ printf("Error in async IO\n");
+ exit(-1);
+ }
done[doneio%(AIO_MODE + EXTRA_BUFFERS)] = 1;
// printf("done (%i): %i\n", i, doneio);
}
@@ -169,7 +182,10 @@ int main(int argc, char *argv[]) {
io_prep_pread(newio, fd, buffer + (schedio % (AIO_MODE + EXTRA_BUFFERS)) * BLOCK_SIZE, BLOCK_SIZE, schedio * BLOCK_SIZE);
io_set_callback(newio, (void*)(uintptr_t)schedio);
err = io_submit(aio, 1, &newio);
- if (err != 1) perror("Failed to submit AIO jobs");
+ if (err != 1) {
+ printf("Failed to submit AIO jobs %i", err);
+ exit(-1);
+ }
schedio++;
}
events = i + 1;
@@ -249,8 +265,6 @@ int main(int argc, char *argv[]) {
skip = 0;
dir = opendir(".");
while ((ent = readdir(dir))) {
- struct stat st;
-
if (((skip++)%SKIP) != run) continue;
if (stat(ent->d_name, &st)) continue;
@@ -268,6 +282,7 @@ int main(int argc, char *argv[]) {
# ifdef FS_SYNC_MODE
if (size < BLOCK_SIZE) size = BLOCK_SIZE;
# endif /* FS_SYNC_MODE */
+ if (size < FS_MIN_BLOCK_SIZE) size = FS_BLOCK_SIZE;
#endif
if (!files)