]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/tools/bbatch.c
b793dd32088fea46483beaa84d8b04667825633b
[bacula/bacula] / bacula / src / tools / bbatch.c
1 /*
2  *
3  *  Program to test batch mode
4  *
5  *   Eric Bollengier, March 2007
6  *
7  *
8  *   Version $Id$
9  */
10 /*
11    Bacula® - The Network Backup Solution
12
13    Copyright (C) 2001-2006 Free Software Foundation Europe e.V.
14
15    The main author of Bacula is Kern Sibbald, with contributions from
16    many others, a complete list can be found in the file AUTHORS.
17    This program is Free Software; you can redistribute it and/or
18    modify it under the terms of version two of the GNU General Public
19    License as published by the Free Software Foundation plus additions
20    that are listed in the file LICENSE.
21
22    This program is distributed in the hope that it will be useful, but
23    WITHOUT ANY WARRANTY; without even the implied warranty of
24    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
25    General Public License for more details.
26
27    You should have received a copy of the GNU General Public License
28    along with this program; if not, write to the Free Software
29    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
30    02110-1301, USA.
31
32    Bacula® is a registered trademark of John Walker.
33    The licensor of Bacula is the Free Software Foundation Europe
34    (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
35    Switzerland, email:ftf@fsfeurope.org.
36 */
37
38 /*
39   to create datafile
40  
41   for i in $(seq 10000 99999) ; do
42      j=$((($i % 1000) + 555))
43      echo "$i;/tmp/totabofds$j/fiddddle${j}$i;xxxLSTATxxxx;xxxxxxxMD5xxxxxx"
44   done  > dat1
45  
46   or
47
48   j=0
49   find / | while read a; do
50    j=$(($j+1))
51    echo "$j;$a;xxxLSTATxxxx;xxxxxxxMD5xxxxxx"
52   done > dat1
53  */
54
55 #include "bacula.h"
56 #include "stored/stored.h"
57 #include "findlib/find.h"
58 #include "cats/cats.h"
59  
60 /* Forward referenced functions */
61 static void *do_batch(void *);
62
63
64 /* Local variables */
65 static B_DB *db;
66
67 static const char *db_name = "bacula";
68 static const char *db_user = "bacula";
69 static const char *db_password = "";
70 static const char *db_host = NULL;
71
72 static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
73
74 static void usage()
75 {
76    fprintf(stderr, _(
77 PROG_COPYRIGHT
78 "\nVersion: %s (%s)\n"
79 "Example : bbatch -w /path/to/workdir -h localhost -f dat1 -f dat -f datx\n"
80 " will start 3 thread and load dat1, dat and datx in your catalog\n"
81 "See bbatch.c to generate datafile\n\n"
82 "Usage: bbatch [ options ] -w working/dir -f datafile\n"
83 "       -d <nn>           set debug level to nn\n"
84 "       -n <name>         specify the database name (default bacula)\n"
85 "       -u <user>         specify database user name (default bacula)\n"
86 "       -P <password      specify database password (default none)\n"
87 "       -h <host>         specify database host (default NULL)\n"
88 "       -w <working>      specify working directory\n"
89 "       -v                verbose\n"
90 "       -f <file>         specify data file\n"
91 "       -?                print this message\n\n"), 2001, VERSION, BDATE);
92    exit(1);
93 }
94
95 /* number of thread started */
96 int nb=0;
97
98 int main (int argc, char *argv[])
99 {
100    int ch;
101    setlocale(LC_ALL, "");
102    bindtextdomain("bacula", LOCALEDIR);
103    textdomain("bacula");
104    init_stack_dump();
105    
106    char **files = (char **) malloc (10 * sizeof(char *));
107    int i;
108    my_name_is(argc, argv, "bbatch");
109    init_msg(NULL, NULL);
110
111    OSDependentInit();
112
113    while ((ch = getopt(argc, argv, "h:c:d:n:P:Su:vf:w:?")) != -1) {
114       switch (ch) {
115       case 'd':                    /* debug level */
116          debug_level = atoi(optarg);
117          if (debug_level <= 0)
118             debug_level = 1;
119          break;
120
121       case 'h':
122          db_host = optarg;
123          break;
124
125       case 'n':
126          db_name = optarg;
127          break;
128
129       case 'w':
130          working_directory = optarg;
131          break;
132
133       case 'u':
134          db_user = optarg;
135          break;
136
137       case 'P':
138          db_password = optarg;
139          break;
140
141       case 'v':
142          verbose++;
143          break;
144
145       case 'f':
146          if (nb < 10 ) {
147             files[nb++] = optarg;
148          }
149          break;
150
151       case '?':
152       default:
153          usage();
154
155       }
156    }
157    argc -= optind;
158    argv += optind;
159
160    if (argc != 0) {
161       Pmsg0(0, _("Wrong number of arguments: \n"));
162       usage();
163    }
164
165 #ifdef HAVE_BATCH_FILE_INSERT
166    printf("With new Batch mode\n");
167 #else
168    printf("Without new Batch mode\n");
169 #endif
170    i = nb;
171    while (--i >= 0) {
172       pthread_t thid;
173       JCR *bjcr = new_jcr(sizeof(JCR), NULL);
174       bjcr->bsr = NULL;
175       bjcr->VolSessionId = 1;
176       bjcr->VolSessionTime = (uint32_t)time(NULL);
177       bjcr->NumReadVolumes = 0;
178       bjcr->NumWriteVolumes = 0;
179       bjcr->JobId = getpid();
180       bjcr->JobType = JT_CONSOLE;
181       bjcr->JobLevel = L_FULL;
182       bjcr->JobStatus = JS_Running;
183       bjcr->where = bstrdup(files[i]);
184       bjcr->job_name = get_pool_memory(PM_FNAME);
185       pm_strcpy(bjcr->job_name, "Dummy.Job.Name");
186       bjcr->client_name = get_pool_memory(PM_FNAME);
187       pm_strcpy(bjcr->client_name, "Dummy.Client.Name");
188       bstrncpy(bjcr->Job, "bbatch", sizeof(bjcr->Job));
189       bjcr->fileset_name = get_pool_memory(PM_FNAME);
190       pm_strcpy(bjcr->fileset_name, "Dummy.fileset.name");
191       bjcr->fileset_md5 = get_pool_memory(PM_FNAME);
192       pm_strcpy(bjcr->fileset_md5, "Dummy.fileset.md5");
193       
194       if ((db=db_init_database(NULL, db_name, db_user, db_password,
195                                db_host, 0, NULL, 0)) == NULL) {
196          Emsg0(M_ERROR_TERM, 0, _("Could not init Bacula database\n"));
197       }
198       if (!db_open_database(NULL, db)) {
199          Emsg0(M_ERROR_TERM, 0, db_strerror(db));
200       }
201       Dmsg0(200, "Database opened\n");
202       if (verbose) {
203          Pmsg2(000, _("Using Database: %s, User: %s\n"), db_name, db_user);
204       }
205       
206       bjcr->db = db;
207
208       pthread_create(&thid, NULL, do_batch, bjcr);
209    }
210
211    while (nb > 0) {
212       bmicrosleep(1,0);
213    }
214
215    return 0;
216 }
217
218 static void fill_attr(ATTR_DBR *ar, char *data)
219 {
220    char *p;
221    char *b;
222    int index=0;
223    ar->Stream = STREAM_UNIX_ATTRIBUTES;
224    ar->JobId = getpid();
225
226    for(p = b = data; *p; p++) {
227       if (*p == ';') {
228          *p = '\0';
229          switch (index) {
230          case 0:
231             ar->FileIndex = str_to_int64(b);
232             break;
233          case 1:
234             ar->fname = b;
235             break;
236          case 2:
237             ar->attr = b;
238             break;
239          case 3:
240             ar->Digest = b;
241             break;
242          }
243          index++;
244          b = ++p;
245       }
246    }
247 }
248
249 static void *do_batch(void *jcr)
250 {
251    JCR *bjcr = (JCR *)jcr;
252    char data[1024];
253    int lineno = 0;
254    struct ATTR_DBR ar;
255    memset(&ar, 0, sizeof(ar));
256    btime_t begin = get_current_btime();
257    char *datafile = bjcr->where;
258
259    FILE *fd = fopen(datafile, "r");
260    if (!fd) {
261       Emsg1(M_ERROR_TERM, 0, _("Error opening datafile %s\n"), datafile);
262    }
263    while (fgets(data, sizeof(data)-1, fd)) {
264       strip_trailing_newline(data);
265       lineno++;
266       if (verbose && ((lineno % 5000) == 1)) {
267          printf("\r%i", lineno);
268       }
269       fill_attr(&ar, data);
270       if (!db_create_file_attributes_record(bjcr, bjcr->db, &ar)) {
271          Emsg0(M_ERROR_TERM, 0, _("Error while inserting file\n"));
272       }
273    }
274    fclose(fd);
275    db_write_batch_file_records(bjcr);
276    btime_t end = get_current_btime();
277    
278    P(mutex);
279    char ed1[200], ed2[200];
280    printf("\rbegin = %s, end = %s\n", edit_int64(begin, ed1),edit_int64(end, ed2));
281    printf("Insert time = %llims\n", (end - begin) / 10000);
282    printf("Create %u files at %.2f/s\n", lineno, 
283           (lineno / ((float)((end - begin) / 1000000))));
284    nb--;
285    V(mutex);
286    pthread_exit(NULL);
287    return NULL;
288 }