3 * Program to test batch mode
5 * Eric Bollengier, March 2007
11 Bacula® - The Network Backup Solution
13 Copyright (C) 2001-2006 Free Software Foundation Europe e.V.
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 three of the GNU Affero General Public
19 License as published by the Free Software Foundation and included
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.
27 You should have received a copy of the GNU Affero 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
32 Bacula® is a registered trademark of Kern Sibbald.
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.
41 for i in $(seq 10000 99999) ; do
42 j=$((($i % 1000) + 555))
43 echo "$i;/tmp/totabofds$j/fiddddle${j}$i;xxxLSTATxxxx;xxxxxxxMD5xxxxxx"
49 find / | while read a; do
51 echo "$j;$a;xxxLSTATxxxx;xxxxxxxMD5xxxxxx"
56 #include "stored/stored.h"
57 #include "findlib/find.h"
58 #include "cats/cats.h"
59 #include "cats/sql_glue.h"
61 /* Forward referenced functions */
62 static void *do_batch(void *);
68 static const char *db_name = "bacula";
69 static const char *db_user = "bacula";
70 static const char *db_password = "";
71 static const char *db_host = NULL;
73 static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
79 "\nVersion: %s (%s)\n"
80 "Example : bbatch -w /path/to/workdir -h localhost -f dat1 -f dat -f datx\n"
81 " will start 3 thread and load dat1, dat and datx in your catalog\n"
82 "See bbatch.c to generate datafile\n\n"
83 "Usage: bbatch [ options ] -w working/dir -f datafile\n"
84 " -b with batch mode\n"
85 " -B without batch mode\n"
86 " -d <nn> set debug level to <nn>\n"
87 " -dt print timestamp in debug output\n"
88 " -n <name> specify the database name (default bacula)\n"
89 " -u <user> specify database user name (default bacula)\n"
90 " -P <password specify database password (default none)\n"
91 " -h <host> specify database host (default NULL)\n"
92 " -w <working> specify working directory\n"
93 " -r <jobids> call restore code with given jobids\n"
95 " -f <file> specify data file\n"
96 " -? print this message\n\n"), 2001, VERSION, BDATE);
100 /* number of thread started */
103 static int list_handler(void *ctx, int num_fields, char **row)
105 uint64_t *a = (uint64_t*) ctx;
110 int main (int argc, char *argv[])
113 bool disable_batch = false;
114 char *restore_list=NULL;
115 setlocale(LC_ALL, "");
116 bindtextdomain("bacula", LOCALEDIR);
117 textdomain("bacula");
121 char **files = (char **) malloc (10 * sizeof(char *));
123 my_name_is(argc, argv, "bbatch");
124 init_msg(NULL, NULL);
128 while ((ch = getopt(argc, argv, "bBh:c:d:n:P:Su:vf:w:r:?")) != -1) {
131 restore_list=bstrdup(optarg);
134 disable_batch = true;
137 disable_batch = false;
139 case 'd': /* debug level */
140 if (*optarg == 't') {
141 dbg_timestamp = true;
143 debug_level = atoi(optarg);
144 if (debug_level <= 0) {
159 working_directory = optarg;
167 db_password = optarg;
176 files[nb++] = optarg;
190 Pmsg0(0, _("Wrong number of arguments: \n"));
197 /* To use the -r option, the catalog should already contains records */
199 if ((db = db_init_database(NULL, NULL, db_name, db_user, db_password,
200 db_host, 0, NULL, false, disable_batch)) == NULL) {
201 Emsg0(M_ERROR_TERM, 0, _("Could not init Bacula database\n"));
203 if (!db_open_database(NULL, db)) {
204 Emsg0(M_ERROR_TERM, 0, db_strerror(db));
207 start = get_current_btime();
208 db_get_file_list(NULL, db, restore_list, false, false, list_handler, &nb_file);
209 end = get_current_btime();
211 Pmsg3(0, _("Computing file list for jobid=%s files=%lld secs=%d\n"),
212 restore_list, nb_file, (uint32_t)btime_to_unix(end-start));
219 printf("Without new Batch mode\n");
221 printf("With new Batch mode\n");
227 JCR *bjcr = new_jcr(sizeof(JCR), NULL);
229 bjcr->VolSessionId = 1;
230 bjcr->VolSessionTime = (uint32_t)time(NULL);
231 bjcr->NumReadVolumes = 0;
232 bjcr->NumWriteVolumes = 0;
233 bjcr->JobId = getpid();
234 bjcr->setJobType(JT_CONSOLE);
235 bjcr->setJobLevel(L_FULL);
236 bjcr->JobStatus = JS_Running;
237 bjcr->where = bstrdup(files[i]);
238 bjcr->job_name = get_pool_memory(PM_FNAME);
239 pm_strcpy(bjcr->job_name, "Dummy.Job.Name");
240 bjcr->client_name = get_pool_memory(PM_FNAME);
241 pm_strcpy(bjcr->client_name, "Dummy.Client.Name");
242 bstrncpy(bjcr->Job, "bbatch", sizeof(bjcr->Job));
243 bjcr->fileset_name = get_pool_memory(PM_FNAME);
244 pm_strcpy(bjcr->fileset_name, "Dummy.fileset.name");
245 bjcr->fileset_md5 = get_pool_memory(PM_FNAME);
246 pm_strcpy(bjcr->fileset_md5, "Dummy.fileset.md5");
248 if ((db = db_init_database(NULL, NULL, db_name, db_user, db_password,
249 db_host, 0, NULL, false, false)) == NULL) {
250 Emsg0(M_ERROR_TERM, 0, _("Could not init Bacula database\n"));
252 if (!db_open_database(NULL, db)) {
253 Emsg0(M_ERROR_TERM, 0, db_strerror(db));
255 Dmsg0(200, "Database opened\n");
257 Pmsg2(000, _("Using Database: %s, User: %s\n"), db_name, db_user);
262 pthread_create(&thid, NULL, do_batch, bjcr);
272 static void fill_attr(ATTR_DBR *ar, char *data)
277 ar->Stream = STREAM_UNIX_ATTRIBUTES;
278 ar->JobId = getpid();
280 for(p = b = data; *p; p++) {
285 ar->FileIndex = str_to_int64(b);
303 static void *do_batch(void *jcr)
305 JCR *bjcr = (JCR *)jcr;
309 memset(&ar, 0, sizeof(ar));
310 btime_t begin = get_current_btime();
311 char *datafile = bjcr->where;
313 FILE *fd = fopen(datafile, "r");
315 Emsg1(M_ERROR_TERM, 0, _("Error opening datafile %s\n"), datafile);
317 while (fgets(data, sizeof(data)-1, fd)) {
318 strip_trailing_newline(data);
320 if (verbose && ((lineno % 5000) == 1)) {
321 printf("\r%i", lineno);
323 fill_attr(&ar, data);
324 if (!db_create_attributes_record(bjcr, bjcr->db, &ar)) {
325 Emsg0(M_ERROR_TERM, 0, _("Error while inserting file\n"));
329 db_write_batch_file_records(bjcr);
330 btime_t end = get_current_btime();
333 char ed1[200], ed2[200];
334 printf("\rbegin = %s, end = %s\n", edit_int64(begin, ed1),edit_int64(end, ed2));
335 printf("Insert time = %sms\n", edit_int64((end - begin) / 10000, ed1));
336 printf("Create %u files at %.2f/s\n", lineno,
337 (lineno / ((float)((end - begin) / 1000000))));