]> git.sur5r.net Git - bacula/bacula/blob - bacula/patches/testing/justdisk.c
ebl Add accurate disk tests
[bacula/bacula] / bacula / patches / testing / justdisk.c
1 /*
2  * This file is used to test simple I/O operation for accurate mode
3  *
4  *
5  * 1) Loading
6  *    fseek()   ?
7  *    fwrite()
8  *
9  * 2) Fetch + Update
10  *    fseek(pos1)
11  *    fread()
12  *    fseek(pos1)
13  *    fwrite()
14  *
15  * 3) Read all
16  *    fseek()
17  *    fread()
18  *    
19  */
20
21 /*
22 g++ -g -Wall -I../../src -I../../src/lib -L../../src/lib justdisk.c -lbac -lpthread -lssl -D_TEST_OPEN
23  */
24
25 #include <stdio.h>
26 #include <errno.h>
27 #include <unistd.h>
28 #include <string.h>
29 #include <fcntl.h>
30 #include "bacula.h"
31
32 typedef struct {
33    int path;
34    int filename;
35    int mtime;
36    int ctime;
37    int seen;
38 } AccurateElt;
39
40 #define NB_ELT 50000000
41
42 typedef struct {
43    char *buf;
44    rblink *link;
45 } MY;
46
47 static int my_cmp(void *item1, void *item2)
48 {
49    MY *elt1, *elt2;
50    elt1 = (MY *) item1;
51    elt2 = (MY *) item2;
52    printf("cmp(%s, %s)\n", elt1->buf, elt2->buf);
53    return strcmp(elt1->buf, elt2->buf);
54 }
55
56 rblist *load_rb(const char *file)
57 {
58    FILE *fp;
59    char buffer[1024];
60    MY *res;
61    rblist *lst;
62    lst = New(rblist(res, res->link));
63
64    fp = fopen(file, "r");
65    if (!fp) {
66       return NULL;
67    }
68    while (fgets(buffer, sizeof(buffer), fp)) {
69       if (*buffer) {
70          int len = strlen(buffer);
71          if (len > 0) {
72             buffer[len-1]=0;       /* zap \n */
73          }
74          MY *buf = (MY *)malloc(sizeof(MY));
75          memset(buf, 0, sizeof(MY));
76          buf->buf = bstrdup(buffer);
77          res = (MY *)lst->insert(buf, my_cmp);
78          if (res != buf) {
79             free(buf->buf);
80             free(buf);
81          }
82       }
83    }
84    fclose(fp);
85
86    return lst;
87 }
88
89 #ifdef _TEST_OPEN
90 int main()
91 {
92    int fd;
93    int i;
94    AccurateElt elt;
95    char *start_heap = (char *)sbrk(0);
96
97    rblist *rb_file = load_rb("files");
98    rblist *rb_path = load_rb("path");
99
100    char *etc = (char *)rb_path->search((void *)"/etc/", my_cmp);
101
102    printf("%p\n", etc);
103
104    fd = open("testfile", O_CREAT | O_RDWR, 0600);
105    if (fd<0) {
106       perror("E: Can't open testfile ");
107       return(1);
108    }
109
110    memset(&elt, 0, sizeof(elt));
111
112    /* 1) Loading */
113    for (i=0; i<NB_ELT; i++) {
114       write(fd, &elt, sizeof(elt));
115    }
116
117    lseek(fd, 0, SEEK_SET);      /* rewind */
118
119    /* 2) load and update */
120    for (i=0; i<NB_ELT; i++) {
121       lseek(fd, i*sizeof(AccurateElt), SEEK_SET);
122       read(fd, &elt, sizeof(elt));
123       lseek(fd, i*sizeof(AccurateElt), SEEK_SET);
124       write(fd, &elt, sizeof(elt));
125    }
126
127    lseek(fd, 0, SEEK_SET);      /* rewind */
128
129    /* 3) Fetch all of them */
130    for (i=0; i<NB_ELT; i++) {
131       read(fd, &elt, sizeof(elt));
132    }
133
134    close(fd);
135
136    fprintf(stderr, "heap;%lld\n", (long long)((char *)sbrk(0) - start_heap));
137    sleep(50);
138    return (0);
139 }
140 #else  /* _TEST_OPEN */
141 int main()
142 {
143    FILE *fd;
144    int i;
145    AccurateElt elt;
146    fd = fopen("testfile", "w+");
147    if (!fd) {
148       perror("E: Can't open testfile ");
149       return(1);
150    }
151
152    memset(&elt, 0, sizeof(elt));
153
154    /* 1) Loading */
155    printf("Loading...\n");
156    for (i=0; i<NB_ELT; i++) {
157       fwrite(&elt, sizeof(elt), 1, fd);
158    }
159
160    fseek(fd, 0, SEEK_SET);      /* rewind */
161
162    /* 2) load and update */
163    printf("Load and update...\n");
164    for (i=0; i<NB_ELT; i++) {
165       fseek(fd, i*sizeof(AccurateElt), SEEK_SET);
166       fread(&elt, sizeof(elt), 1, fd);
167       fseek(fd, i*sizeof(AccurateElt), SEEK_SET);
168       fwrite(&elt, sizeof(elt), 1, fd);
169    }
170
171    fseek(fd, 0, SEEK_SET);      /* rewind */
172
173    /* 3) Fetch all of them */
174    printf("Fetch them...\n");
175    for (i=0; i<NB_ELT; i++) {
176       fread(&elt, sizeof(elt), 1, fd);
177    }
178
179    fclose(fd);
180    return(0);
181 }
182 #endif  /* _TEST_OPEN */