1*4f1223e8SApple OSS Distributions #include "test_file_helper.h"
2*4f1223e8SApple OSS Distributions #include "fail.h"
3*4f1223e8SApple OSS Distributions #include <stdlib.h>
4*4f1223e8SApple OSS Distributions #include <fcntl.h>
5*4f1223e8SApple OSS Distributions #include <sys/param.h>
6*4f1223e8SApple OSS Distributions #include <assert.h>
7*4f1223e8SApple OSS Distributions #include <stdio.h>
8*4f1223e8SApple OSS Distributions #include <strings.h>
9*4f1223e8SApple OSS Distributions #include <unistd.h>
10*4f1223e8SApple OSS Distributions #include <pthread.h>
11*4f1223e8SApple OSS Distributions
12*4f1223e8SApple OSS Distributions static char readbuff[4096];
13*4f1223e8SApple OSS Distributions static char writebuff[4096];
14*4f1223e8SApple OSS Distributions static int* fds = NULL;
15*4f1223e8SApple OSS Distributions
16*4f1223e8SApple OSS Distributions char*
setup_tempdir(char * buf)17*4f1223e8SApple OSS Distributions setup_tempdir(char* buf)
18*4f1223e8SApple OSS Distributions {
19*4f1223e8SApple OSS Distributions strcpy(buf, "/tmp/perfindex.XXXXXX");
20*4f1223e8SApple OSS Distributions return mkdtemp(buf);
21*4f1223e8SApple OSS Distributions }
22*4f1223e8SApple OSS Distributions
23*4f1223e8SApple OSS Distributions int
cleanup_tempdir(char * path)24*4f1223e8SApple OSS Distributions cleanup_tempdir(char* path)
25*4f1223e8SApple OSS Distributions {
26*4f1223e8SApple OSS Distributions return rmdir(path);
27*4f1223e8SApple OSS Distributions }
28*4f1223e8SApple OSS Distributions
29*4f1223e8SApple OSS Distributions int
test_file_create(char * path,int thread_id,int num_threads,long long length)30*4f1223e8SApple OSS Distributions test_file_create(char* path, int thread_id, int num_threads, long long length)
31*4f1223e8SApple OSS Distributions {
32*4f1223e8SApple OSS Distributions long long i;
33*4f1223e8SApple OSS Distributions int fd;
34*4f1223e8SApple OSS Distributions int retval;
35*4f1223e8SApple OSS Distributions char filepath[MAXPATHLEN];
36*4f1223e8SApple OSS Distributions
37*4f1223e8SApple OSS Distributions for (i = 0; i < length; i++) {
38*4f1223e8SApple OSS Distributions snprintf(filepath, MAXPATHLEN, "%s/file_create-%d-%lld", path, thread_id, i);
39*4f1223e8SApple OSS Distributions fd = open(filepath, O_CREAT | O_EXCL | O_WRONLY, 0644);
40*4f1223e8SApple OSS Distributions VERIFY(fd >= 0, "open failed");
41*4f1223e8SApple OSS Distributions
42*4f1223e8SApple OSS Distributions close(fd);
43*4f1223e8SApple OSS Distributions }
44*4f1223e8SApple OSS Distributions
45*4f1223e8SApple OSS Distributions for (i = 0; i < length; i++) {
46*4f1223e8SApple OSS Distributions snprintf(filepath, MAXPATHLEN, "%s/file_create-%d-%lld", path, thread_id, i);
47*4f1223e8SApple OSS Distributions retval = unlink(filepath);
48*4f1223e8SApple OSS Distributions VERIFY(retval == 0, "unlink failed");
49*4f1223e8SApple OSS Distributions }
50*4f1223e8SApple OSS Distributions
51*4f1223e8SApple OSS Distributions return PERFINDEX_SUCCESS;
52*4f1223e8SApple OSS Distributions }
53*4f1223e8SApple OSS Distributions
54*4f1223e8SApple OSS Distributions int
test_file_read_setup(char * path,int num_threads,long long length,long long max_file_size)55*4f1223e8SApple OSS Distributions test_file_read_setup(char* path, int num_threads, long long length, long long max_file_size)
56*4f1223e8SApple OSS Distributions {
57*4f1223e8SApple OSS Distributions int fd;
58*4f1223e8SApple OSS Distributions char filepath[MAXPATHLEN];
59*4f1223e8SApple OSS Distributions long long left;
60*4f1223e8SApple OSS Distributions int retval;
61*4f1223e8SApple OSS Distributions size_t writelen;
62*4f1223e8SApple OSS Distributions
63*4f1223e8SApple OSS Distributions if (max_file_size == 0) {
64*4f1223e8SApple OSS Distributions max_file_size = MAXFILESIZE;
65*4f1223e8SApple OSS Distributions }
66*4f1223e8SApple OSS Distributions
67*4f1223e8SApple OSS Distributions left = MIN(length, max_file_size / num_threads);
68*4f1223e8SApple OSS Distributions
69*4f1223e8SApple OSS Distributions snprintf(filepath, sizeof(filepath), "%s/file_read", path);
70*4f1223e8SApple OSS Distributions fd = open(filepath, O_CREAT | O_EXCL | O_WRONLY, 0644);
71*4f1223e8SApple OSS Distributions printf("%d\n", fd);
72*4f1223e8SApple OSS Distributions VERIFY(fd >= 0, "open failed");
73*4f1223e8SApple OSS Distributions
74*4f1223e8SApple OSS Distributions bzero(readbuff, sizeof(readbuff));
75*4f1223e8SApple OSS Distributions
76*4f1223e8SApple OSS Distributions while (left > 0) {
77*4f1223e8SApple OSS Distributions writelen = sizeof(readbuff) < left ? sizeof(readbuff) : left;
78*4f1223e8SApple OSS Distributions retval = write(fd, readbuff, writelen);
79*4f1223e8SApple OSS Distributions VERIFY(retval == writelen, "write failed");
80*4f1223e8SApple OSS Distributions left -= writelen;
81*4f1223e8SApple OSS Distributions }
82*4f1223e8SApple OSS Distributions
83*4f1223e8SApple OSS Distributions return PERFINDEX_SUCCESS;
84*4f1223e8SApple OSS Distributions }
85*4f1223e8SApple OSS Distributions
86*4f1223e8SApple OSS Distributions int
test_file_read(char * path,int thread_id,int num_threads,long long length,long long max_file_size)87*4f1223e8SApple OSS Distributions test_file_read(char* path, int thread_id, int num_threads, long long length, long long max_file_size)
88*4f1223e8SApple OSS Distributions {
89*4f1223e8SApple OSS Distributions long long left;
90*4f1223e8SApple OSS Distributions size_t file_offset = 0;
91*4f1223e8SApple OSS Distributions int readlen;
92*4f1223e8SApple OSS Distributions int fd;
93*4f1223e8SApple OSS Distributions int retval;
94*4f1223e8SApple OSS Distributions char filepath[MAXPATHLEN];
95*4f1223e8SApple OSS Distributions long long filesize;
96*4f1223e8SApple OSS Distributions
97*4f1223e8SApple OSS Distributions
98*4f1223e8SApple OSS Distributions if (max_file_size == 0) {
99*4f1223e8SApple OSS Distributions max_file_size = MAXFILESIZE;
100*4f1223e8SApple OSS Distributions }
101*4f1223e8SApple OSS Distributions filesize = MIN(length, max_file_size / num_threads);
102*4f1223e8SApple OSS Distributions
103*4f1223e8SApple OSS Distributions snprintf(filepath, sizeof(filepath), "%s/file_read", path);
104*4f1223e8SApple OSS Distributions fd = open(filepath, O_RDONLY);
105*4f1223e8SApple OSS Distributions VERIFY(fd >= 0, "open failed");
106*4f1223e8SApple OSS Distributions
107*4f1223e8SApple OSS Distributions for (left = length; left > 0;) {
108*4f1223e8SApple OSS Distributions readlen = sizeof(readbuff) < left ? sizeof(readbuff) : left;
109*4f1223e8SApple OSS Distributions if (file_offset + readlen > filesize) {
110*4f1223e8SApple OSS Distributions retval = lseek(fd, 0, SEEK_SET);
111*4f1223e8SApple OSS Distributions
112*4f1223e8SApple OSS Distributions
113*4f1223e8SApple OSS Distributions VERIFY(retval >= 0, "lseek failed");
114*4f1223e8SApple OSS Distributions
115*4f1223e8SApple OSS Distributions file_offset = 0;
116*4f1223e8SApple OSS Distributions continue;
117*4f1223e8SApple OSS Distributions }
118*4f1223e8SApple OSS Distributions retval = read(fd, readbuff, readlen);
119*4f1223e8SApple OSS Distributions VERIFY(retval == readlen, "read failed");
120*4f1223e8SApple OSS Distributions left -= readlen;
121*4f1223e8SApple OSS Distributions file_offset += readlen;
122*4f1223e8SApple OSS Distributions }
123*4f1223e8SApple OSS Distributions return PERFINDEX_SUCCESS;
124*4f1223e8SApple OSS Distributions }
125*4f1223e8SApple OSS Distributions
126*4f1223e8SApple OSS Distributions int
test_file_read_cleanup(char * path,int num_threads,long long length)127*4f1223e8SApple OSS Distributions test_file_read_cleanup(char* path, int num_threads, long long length)
128*4f1223e8SApple OSS Distributions {
129*4f1223e8SApple OSS Distributions char filepath[MAXPATHLEN];
130*4f1223e8SApple OSS Distributions int retval;
131*4f1223e8SApple OSS Distributions
132*4f1223e8SApple OSS Distributions snprintf(filepath, sizeof(filepath), "%s/file_read", path);
133*4f1223e8SApple OSS Distributions retval = unlink(filepath);
134*4f1223e8SApple OSS Distributions VERIFY(retval == 0, "unlink failed");
135*4f1223e8SApple OSS Distributions
136*4f1223e8SApple OSS Distributions return PERFINDEX_SUCCESS;
137*4f1223e8SApple OSS Distributions }
138*4f1223e8SApple OSS Distributions
139*4f1223e8SApple OSS Distributions int
test_file_write_setup(char * path,int num_threads,long long length)140*4f1223e8SApple OSS Distributions test_file_write_setup(char* path, int num_threads, long long length)
141*4f1223e8SApple OSS Distributions {
142*4f1223e8SApple OSS Distributions int i;
143*4f1223e8SApple OSS Distributions char filepath[MAXPATHLEN];
144*4f1223e8SApple OSS Distributions
145*4f1223e8SApple OSS Distributions if (fds == NULL) {
146*4f1223e8SApple OSS Distributions fds = (int*)malloc(sizeof(int) * num_threads);
147*4f1223e8SApple OSS Distributions VERIFY(fds, "malloc failed");
148*4f1223e8SApple OSS Distributions }
149*4f1223e8SApple OSS Distributions
150*4f1223e8SApple OSS Distributions for (i = 0; i < num_threads; i++) {
151*4f1223e8SApple OSS Distributions snprintf(filepath, sizeof(filepath), "%s/file_write-%d", path, i);
152*4f1223e8SApple OSS Distributions fds[i] = open(filepath, O_CREAT | O_EXCL | O_WRONLY, 0644);
153*4f1223e8SApple OSS Distributions if (fds[i] < 0) {
154*4f1223e8SApple OSS Distributions free(fds);
155*4f1223e8SApple OSS Distributions fds = NULL;
156*4f1223e8SApple OSS Distributions FAIL("open failed");
157*4f1223e8SApple OSS Distributions }
158*4f1223e8SApple OSS Distributions }
159*4f1223e8SApple OSS Distributions
160*4f1223e8SApple OSS Distributions bzero(writebuff, sizeof(writebuff));
161*4f1223e8SApple OSS Distributions
162*4f1223e8SApple OSS Distributions return PERFINDEX_SUCCESS;
163*4f1223e8SApple OSS Distributions }
164*4f1223e8SApple OSS Distributions
165*4f1223e8SApple OSS Distributions int
test_file_write(char * path,int thread_id,int num_threads,long long length,long long max_file_size)166*4f1223e8SApple OSS Distributions test_file_write(char* path, int thread_id, int num_threads, long long length, long long max_file_size)
167*4f1223e8SApple OSS Distributions {
168*4f1223e8SApple OSS Distributions long long left;
169*4f1223e8SApple OSS Distributions size_t file_offset = 0;
170*4f1223e8SApple OSS Distributions int writelen;
171*4f1223e8SApple OSS Distributions int retval;
172*4f1223e8SApple OSS Distributions int fd = fds[thread_id];
173*4f1223e8SApple OSS Distributions
174*4f1223e8SApple OSS Distributions if (max_file_size == 0) {
175*4f1223e8SApple OSS Distributions max_file_size = MAXFILESIZE;
176*4f1223e8SApple OSS Distributions }
177*4f1223e8SApple OSS Distributions
178*4f1223e8SApple OSS Distributions for (left = length; left > 0;) {
179*4f1223e8SApple OSS Distributions writelen = sizeof(writebuff) < left ? sizeof(writebuff) : left;
180*4f1223e8SApple OSS Distributions retval = write(fd, writebuff, writelen);
181*4f1223e8SApple OSS Distributions VERIFY(retval == writelen, "write failed");
182*4f1223e8SApple OSS Distributions
183*4f1223e8SApple OSS Distributions left -= writelen;
184*4f1223e8SApple OSS Distributions file_offset += writelen;
185*4f1223e8SApple OSS Distributions if (file_offset > max_file_size / num_threads) {
186*4f1223e8SApple OSS Distributions retval = lseek(fd, 0, SEEK_SET);
187*4f1223e8SApple OSS Distributions VERIFY(retval >= 0, "leeks failed");
188*4f1223e8SApple OSS Distributions file_offset = 0;
189*4f1223e8SApple OSS Distributions }
190*4f1223e8SApple OSS Distributions }
191*4f1223e8SApple OSS Distributions
192*4f1223e8SApple OSS Distributions return PERFINDEX_SUCCESS;
193*4f1223e8SApple OSS Distributions }
194*4f1223e8SApple OSS Distributions
195*4f1223e8SApple OSS Distributions
196*4f1223e8SApple OSS Distributions int
test_file_write_cleanup(char * path,int num_threads,long long length)197*4f1223e8SApple OSS Distributions test_file_write_cleanup(char* path, int num_threads, long long length)
198*4f1223e8SApple OSS Distributions {
199*4f1223e8SApple OSS Distributions int i;
200*4f1223e8SApple OSS Distributions char filepath[MAXPATHLEN];
201*4f1223e8SApple OSS Distributions int retval;
202*4f1223e8SApple OSS Distributions
203*4f1223e8SApple OSS Distributions for (i = 0; i < num_threads; i++) {
204*4f1223e8SApple OSS Distributions snprintf(filepath, sizeof(filepath), "%s/file_write-%d", path, i);
205*4f1223e8SApple OSS Distributions retval = unlink(filepath);
206*4f1223e8SApple OSS Distributions VERIFY(retval == 0, "unlink failed");
207*4f1223e8SApple OSS Distributions }
208*4f1223e8SApple OSS Distributions
209*4f1223e8SApple OSS Distributions return PERFINDEX_SUCCESS;
210*4f1223e8SApple OSS Distributions }
211