1#include <fcntl.h> 2#include "perf_index.h" 3#include <errno.h> 4 5#define MAXFILESIZE 8589934592L 6 7static int *fds = NULL; 8static char writebuff[4096]; 9 10void stress_file_write_init(const char *fs_path, int num_threads, long long length) { 11 int i; 12 char filepath[MAXPATHLEN]; 13 14 if(fds == NULL) 15 fds = (int*)malloc(sizeof(int)*num_threads); 16 for(i=0; i<num_threads; i++) { 17 snprintf(filepath, sizeof(filepath), "%s/file_write-%d", fs_path, i); 18 fds[i] = open(filepath, O_CREAT | O_EXCL | O_WRONLY, 0644); 19 assert(fds[i] > 0); 20 } 21 bzero(writebuff, sizeof(writebuff)); 22} 23 24void stress_file_write(const char *fs_path, int thread_id, int num_threads, long long length, long long max_file_size) { 25 long long left; 26 size_t file_offset = 0; 27 int writelen; 28 char filepath[MAXPATHLEN]; 29 int fd = fds[thread_id]; 30 31 if(max_file_size == 0) 32 max_file_size = MAXFILESIZE; 33 34 for(left=length; left>0;) { 35 writelen = sizeof(writebuff) < left ? sizeof(writebuff) : left; 36 assert(write(fd, writebuff, writelen) == writelen); 37 left -= writelen; 38 file_offset += writelen; 39 if(file_offset>max_file_size/num_threads) { 40 lseek(fd, 0, SEEK_SET); 41 file_offset = 0; 42 } 43 } 44 snprintf(filepath, sizeof(filepath), "%s/file_write-%d", fs_path, thread_id); 45 assert(unlink(filepath)>=0); 46} 47