Home | History | Annotate | Download | only in fs-bench
      1 /* random-del-create.c (GPL)*/
      2 /* Hironobu SUZUKI <hironobu (at) h2np.net> */
      3 
      4 #include <stdio.h>
      5 #include <sys/stat.h>
      6 #include <sys/types.h>
      7 #include <fcntl.h>
      8 #include <unistd.h>
      9 #include <time.h>
     10 #include <stdlib.h>
     11 #define FAIL 0
     12 #define SUCCESS 1
     13 
     14 int openlog[2] = { 0, 0 };
     15 
     16 #define MAXNUM 0x100000
     17 
     18 #define  MAXERROR 1024
     19 
     20 extern int box_muler(int, int);
     21 extern void create_or_delete(char *);
     22 
     23 int cfilecount = 0;
     24 int dfilecount = 0;
     25 int errorcount = 0;
     26 
     27 int main(int ac, char **av)
     28 {
     29 	int r;
     30 	char fname[1024];
     31 	time_t t;
     32 	int i;
     33 	int m;
     34 
     35 	if (ac != 2) {
     36 		printf("%s hex-style-filename \n", av[0]);
     37 		printf("ex) %s 00022300\n", av[0]);
     38 		exit(1);
     39 	}
     40 	sscanf(av[1], "%x", &m);
     41 	if (m < 1 || m > MAXNUM) {
     42 		printf("out of size %d\n", m);
     43 		exit(1);
     44 	}
     45 
     46 	time(&t);
     47 	srandom((unsigned int)getpid() ^
     48 		(((unsigned int)t << 16) | (unsigned int)t >> 16));
     49 
     50 	/* 00/00/00/00 */
     51 	for (i = 0; i < m; i++) {
     52 		r = random() % m;
     53 		sprintf(fname, "00/%2.2x/%2.2x/00%2.2x%2.2x%2.2x",
     54 			((r >> 16) & 0xFF),
     55 			((r >> 8) & 0xFF),
     56 			((r >> 16) & 0xFF), ((r >> 8) & 0xFF), (r & 0xFF));
     57 		create_or_delete(fname);
     58 	}
     59 	fprintf(stderr, "Total create files: %d\n", cfilecount);
     60 	fprintf(stderr, "Total delete files: %d\n", dfilecount);
     61 	fprintf(stderr, "Total error       : %d\n", errorcount);
     62 	exit(0);
     63 }
     64 
     65 #define MAXFSIZE (192*1024)
     66 #define AVEFSIZE (MAXFSIZE/2)
     67 #define POOLDISKSPACE (AVEFSIZE*128)
     68 
     69 static int disk_space_pool = 0;
     70 void create_or_delete(char *fname)
     71 {
     72 	int r;
     73 	int fsize;
     74 
     75 	r = (random() & 1);
     76 	if (r && disk_space_pool > POOLDISKSPACE) {
     77 		/* create */
     78 		create_file(fname);
     79 	} else {
     80 		delete_file(fname);
     81 	}
     82 	if ((errorcount > dfilecount || errorcount > cfilecount)
     83 	    && (errorcount > MAXERROR)) {
     84 		fprintf(stderr, "too much error -- stop\n");
     85 		fprintf(stderr, "Total create files: %d\n", cfilecount);
     86 		fprintf(stderr, "Total delete files: %d\n", dfilecount);
     87 		fprintf(stderr, "Total error       : %d\n", errorcount);
     88 		exit(1);
     89 	}
     90 }
     91 
     92 int create_file(char *filename)
     93 {
     94 	int fd;
     95 	int randomsize;
     96 	char wbuf[MAXFSIZE];
     97 	if ((fd = creat(filename, S_IRWXU)) < 0) {
     98 		errorcount++;
     99 		return (-1);
    100 	}
    101 	if ((randomsize = box_muler(0, MAXFSIZE)) < 0) {
    102 		randomsize = MAXFSIZE;
    103 	}
    104 	if (write(fd, wbuf, randomsize) < 0) {
    105 		errorcount++;
    106 		close(fd);
    107 		return (-1);
    108 	}
    109 	cfilecount++;
    110 	disk_space_pool -= randomsize;
    111 	close(fd);
    112 	return 0;
    113 }
    114 
    115 #include <sys/stat.h>
    116 #include <unistd.h>
    117 
    118 int delete_file(char *filename)
    119 {
    120 	struct stat buf;
    121 	int st;
    122 	st = stat(filename, &buf);
    123 	if (st < 0) {
    124 		errorcount++;
    125 		return (-1);
    126 	}
    127 	disk_space_pool += buf.st_size;
    128 	if (unlink(filename) < 0) {
    129 		errorcount++;
    130 		return (-1);
    131 	}
    132 	dfilecount++;
    133 	return 0;
    134 }
    135