stress_file_read.c   [plain text]


#include <fcntl.h>
#include "perf_index.h"
#include <errno.h>

#define MAXFILESIZE 8589934592L
#define MIN(a,b) ((a)<(b) ? (a) : (b))

static char readbuff[4096];

void stress_file_read_init(const char *fs_path, int num_threads, long long length, long long max_file_size) {
  int fd;
  char filepath[MAXPATHLEN];
  long long left;
  size_t writelen;

  if(max_file_size == 0)
    max_file_size = MAXFILESIZE;

  left = MIN(length, max_file_size/num_threads);

  snprintf(filepath, sizeof(filepath), "%s/file_read", fs_path);
  fd = open(filepath, O_CREAT | O_EXCL | O_WRONLY, 0644);
  assert(fd > 0);
  bzero(readbuff, sizeof(readbuff));

  while(left > 0) {
    writelen = sizeof(readbuff) < left ? sizeof(readbuff) : left;
    assert(write(fd, readbuff, writelen) == writelen);
    left -= writelen;
  }
}

void stress_file_read(const char *fs_path, int thread_id, int num_threads, long long length, long long max_file_size) {
  long long left;
  size_t file_offset = 0;
  int readlen;
  int fd;
  char filepath[MAXPATHLEN];
  long long filesize;


  if(max_file_size == 0)
    max_file_size = MAXFILESIZE;
  filesize =  MIN(length, max_file_size/num_threads);

  snprintf(filepath, sizeof(filepath), "%s/file_read", fs_path);
  fd = open(filepath, O_RDONLY);
  assert(fd > 0);
  for(left=length; left>0;) {
    readlen = sizeof(readbuff) < left ? sizeof(readbuff) : left;
    if(file_offset+readlen > filesize) {
      lseek(fd, 0, SEEK_SET);
      file_offset = 0;
      continue;
    }
    assert(read(fd, readbuff, readlen) == readlen);
    left -= readlen;
    file_offset += readlen;
  }
}

void stress_file_read_cleanup(const char *fs_path, int num_threads, long long length) {
  char filepath[MAXPATHLEN];
  snprintf(filepath, sizeof(filepath), "%s/file_read", fs_path);
  assert(unlink(filepath)>=0);
}