noinst_PROGRAMS += small_write multiop sleeptest ll_sparseness_verify cmknod
noinst_PROGRAMS += ll_sparseness_write mrename ll_dirstripe_verify mkdirmany rmdirmany
noinst_PROGRAMS += openfilleddirunlink rename_many memhog iopentest1 iopentest2
-noinst_PROGRAMS += mmap_sanity flock_test writemany
+noinst_PROGRAMS += mmap_sanity flock_test writemany random-reads
if MPITESTS
noinst_PROGRAMS += parallel_grouplock write_append_truncate createmany_mpi
endif
{
printf("random-reads: read random chunks of a file.\n");
printf("Usage:\n\n");
- printf("random-reads -f <filename> -s <filesize> -b <buffersize> [-v] [-h] [-C] [-S <seed>] [-n <iterations>] [-w <width>]\n");
+ printf("random-reads -f <filename> -s <filesize> -b <buffersize> -a <adjacent reads> [-v] [-h] [-C] [-S <seed>] [-n <iterations>] [-w <width>]\n");
}
enum {
char *fname = NULL;
loff_t size = 0;
size_t bsize = 0;
+ int ad = 1;
int preclean = 0;
int width = 10;
unsigned int seed = 0;
char *buf;
do {
- opt = getopt(argc, argv, "f:s:b:vhCS:n:w:");
+ opt = getopt(argc, argv, "f:s:b:va:hCS:n:w:");
switch (opt) {
case -1:
break;
case 'b':
bsize = atol(optarg);
break;
+ case 'a':
+ ad = atoi(optarg);
+ break;
case 'C':
preclean = 1;
break;
}
} while (opt != -1);
- if (fname == NULL || size == 0 || bsize == 0) {
+ if (fname == NULL || size == 0 || bsize == 0 || ad <= 0) {
usage();
return RR_SET;
}
+ bsize /= ad;
nblocks = size / bsize;
buf = malloc(bsize);
if (buf == NULL) {
gettimeofday(&start, NULL);
for (i = 0; !iterations || i < iterations; i ++) {
unsigned long block_nr;
+ int j;
block_nr = (int) ((double)nblocks*rand()/(RAND_MAX+1.0));
if (i % width == 0)
LOG(LOG_INFO, "\n%9lu: ", i);
LOG(LOG_INFO, "%7lu ", block_nr);
- ret = pread(fd, buf, bsize, block_nr * bsize);
- if (ret != bsize) {
- LOG(LOG_CRIT, "pread(...%zi, %li) got: %zi, %m\n",
- bsize, block_nr * bsize, ret);
- return RR_READ;
+ for (j = 0; j < ad; j++) {
+ ret = pread(fd, buf, bsize, (block_nr + j) * bsize);
+ if (ret != bsize) {
+ LOG(LOG_CRIT,
+ "pread(...%zi, %li) got: %zi, %m\n",
+ bsize, block_nr * bsize, ret);
+ return RR_READ;
+ }
}
}
gettimeofday(&stop, NULL);
MCREATE=${MCREATE:-mcreate}
OPENFILE=${OPENFILE:-openfile}
OPENUNLINK=${OPENUNLINK:-openunlink}
+RANDOM_READS=${RANDOM_READS:-"random-reads"}
TOEXCL=${TOEXCL:-toexcl}
TRUNCATE=${TRUNCATE:-truncate}
MUNLINK=${MUNLINK:-munlink}
EXT2_DEV=${EXT2_DEV:-/tmp/SANITY.LOOP}
touch $EXT2_DEV
mke2fs -j -F $EXT2_DEV 8000 > /dev/null
+echo # add a newline after mke2fs.
umask 077
}
run_test 100 "check local port using privileged port ==========="
+function get_named_value()
+{
+ local tag
+
+ tag=$1
+ while read ;do
+ line=$REPLY
+ case $line in
+ $tag*)
+ echo $line | sed "s/^$tag//"
+ break
+ ;;
+ esac
+ done
+}
+
+test_101() {
+ local s
+ local discard
+ local nreads
+
+ for s in $LPROC/osc/OSC_*/rpc_stats ;do
+ echo 0 > $s
+ done
+ for s in $LPROC/llite/*/read_ahead_stats ;do
+ echo 0 > $s
+ done
+
+ #
+ # randomly read 10000 of 64K chunks from 200M file.
+ #
+ nreads=10000
+ $RANDOM_READS -f /mnt/lustre/room101.area -s200000000 -b65536 -C -n$nreads
+
+ discard=0
+ for s in $LPROC/llite/*/read_ahead_stats ;do
+ discard=$(($discard + $(cat $s | get_named_value 'read but discarded')))
+ done
+
+ if [ $(($discard * 10)) -gt $nreads ] ;then
+ cat $LPROC/osc/OSC_*/rpc_stats
+ cat $LPROC/llite/*/read_ahead_stats
+ error "too many ($discard) discarded pages"
+ fi
+}
+run_test 101 "check read-ahead for random reads ==========="
+
TMPDIR=$OLDTMPDIR
TMP=$OLDTMP
HOME=$OLDHOME