2 Bacula(R) - The Network Backup Solution
4 Copyright (C) 2000-2016 Kern Sibbald
6 The original author of Bacula is Kern Sibbald, with contributions
7 from many others, a complete list can be found in the file AUTHORS.
9 You may use this file and others of this release according to the
10 license defined in the LICENSE file, which includes the Affero General
11 Public License, v3.0 ("AGPLv3") and some additional permissions and
12 terms pursuant to its AGPLv3 Section 7.
14 This notice must be preserved when any source code is
15 conveyed and/or propagated.
17 Bacula(R) is a registered trademark of Kern Sibbald.
21 * Program to test batch mode
23 * Eric Bollengier, March 2007
30 for i in $(seq 10000 99999) ; do
31 j=$((($i % 1000) + 555))
32 echo "$i;/tmp/totabofds$j/fiddddle${j}$i;xxxLSTATxxxx;xxxxxxxMD5xxxxxx"
38 find / | while read a; do
40 echo "$j;$a;xxxLSTATxxxx;xxxxxxxMD5xxxxxx"
45 #include "stored/stored.h"
46 #include "findlib/find.h"
47 #include "cats/cats.h"
49 /* Forward referenced functions */
50 static void *do_batch(void *);
56 static const char *db_name = "bacula";
57 static const char *db_user = "bacula";
58 static const char *db_password = "";
59 static const char *db_host = NULL;
60 static const char *db_ssl_mode = NULL;
61 static const char *db_ssl_key = NULL;
62 static const char *db_ssl_cert = NULL;
63 static const char *db_ssl_ca = NULL;
64 static const char *db_ssl_capath = NULL;
65 static const char *db_ssl_cipher = NULL;
67 static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
73 "\n%sVersion: %s (%s)\n"
74 "Example : bbatch -w /path/to/workdir -h localhost -f dat1 -f dat -f datx\n"
75 " will start 3 thread and load dat1, dat and datx in your catalog\n"
76 "See bbatch.c to generate datafile\n\n"
77 "Usage: bbatch [ options ] -w working/dir -f datafile\n"
78 " -b with batch mode\n"
79 " -B without batch mode\n"
80 " -d <nn> set debug level to <nn>\n"
81 " -dt print timestamp in debug output\n"
82 " -n <name> specify the database name (default bacula)\n"
83 " -u <user> specify database user name (default bacula)\n"
84 " -P <password specify database password (default none)\n"
85 " -h <host> specify database host (default NULL)\n"
86 " -k <sslkey> path name to the key file (default NULL)\n"
87 " -e <sslcert> path name to the certificate file (default NULL)\n"
88 " -a <sslca> path name to the CA certificate file (default NULL)\n"
89 " -w <working> specify working directory\n"
90 " -r <jobids> call restore code with given jobids\n"
92 " -f <file> specify data file\n"
93 " -? print this message\n\n"), 2001, "", VERSION, BDATE);
97 /* number of thread started */
100 static int list_handler(void *ctx, int num_fields, char **row)
102 uint64_t *a = (uint64_t*) ctx;
107 int main (int argc, char *argv[])
110 bool use_batch_insert = true;
111 char *restore_list=NULL;
112 setlocale(LC_ALL, "");
113 bindtextdomain("bacula", LOCALEDIR);
114 textdomain("bacula");
118 char **files = (char **) malloc (10 * sizeof(char *));
120 my_name_is(argc, argv, "bbatch");
121 init_msg(NULL, NULL);
125 while ((ch = getopt(argc, argv, "bBh:o:k:e:a:c:d:n:P:Su:vf:w:r:?")) != -1) {
128 restore_list=bstrdup(optarg);
131 use_batch_insert = true;
134 use_batch_insert = false;
136 case 'd': /* debug level */
137 if (*optarg == 't') {
138 dbg_timestamp = true;
140 debug_level = atoi(optarg);
141 if (debug_level <= 0) {
152 db_ssl_mode = optarg;
160 db_ssl_cert = optarg;
172 working_directory = optarg;
180 db_password = optarg;
189 files[nb++] = optarg;
203 Pmsg0(0, _("Wrong number of arguments: \n"));
210 /* To use the -r option, the catalog should already contains records */
212 if ((db = db_init_database(NULL, NULL, db_name, db_user, db_password,
214 db_ssl_mode, db_ssl_key,
215 db_ssl_cert, db_ssl_ca,
216 db_ssl_capath, db_ssl_cipher,
217 false, !use_batch_insert)) == NULL) {
218 Emsg0(M_ERROR_TERM, 0, _("Could not init Bacula database\n"));
220 if (!db_open_database(NULL, db)) {
221 Emsg0(M_ERROR_TERM, 0, db_strerror(db));
224 start = get_current_btime();
225 db_get_file_list(NULL, db, restore_list, false, false, list_handler, &nb_file);
226 end = get_current_btime();
228 Pmsg3(0, _("Computing file list for jobid=%s files=%lld secs=%d\n"),
229 restore_list, nb_file, (uint32_t)btime_to_unix(end-start));
235 if (use_batch_insert) {
236 printf("With Batch Insert mode\n");
238 printf("Without Batch Insert mode\n");
244 JCR *bjcr = new_jcr(sizeof(JCR), NULL);
246 bjcr->VolSessionId = 1;
247 bjcr->VolSessionTime = (uint32_t)time(NULL);
248 bjcr->NumReadVolumes = 0;
249 bjcr->NumWriteVolumes = 0;
250 bjcr->JobId = getpid();
251 bjcr->setJobType(JT_CONSOLE);
252 bjcr->setJobLevel(L_FULL);
253 bjcr->JobStatus = JS_Running;
254 bjcr->where = bstrdup(files[i]);
255 bjcr->job_name = get_pool_memory(PM_FNAME);
256 pm_strcpy(bjcr->job_name, "Dummy.Job.Name");
257 bjcr->client_name = get_pool_memory(PM_FNAME);
258 pm_strcpy(bjcr->client_name, "Dummy.Client.Name");
259 bstrncpy(bjcr->Job, "bbatch", sizeof(bjcr->Job));
260 bjcr->fileset_name = get_pool_memory(PM_FNAME);
261 pm_strcpy(bjcr->fileset_name, "Dummy.fileset.name");
262 bjcr->fileset_md5 = get_pool_memory(PM_FNAME);
263 pm_strcpy(bjcr->fileset_md5, "Dummy.fileset.md5");
265 if ((db = db_init_database(NULL, NULL, db_name, db_user, db_password,
267 db_ssl_mode, db_ssl_key,
268 db_ssl_cert, db_ssl_ca,
269 db_ssl_capath, db_ssl_cipher,
270 false, false)) == NULL) {
271 Emsg0(M_ERROR_TERM, 0, _("Could not init Bacula database\n"));
273 if (!db_open_database(NULL, db)) {
274 Emsg0(M_ERROR_TERM, 0, db_strerror(db));
276 Dmsg0(200, "Database opened\n");
278 Pmsg2(000, _("Using Database: %s, User: %s\n"), db_name, db_user);
283 pthread_create(&thid, NULL, do_batch, bjcr);
293 static void fill_attr(ATTR_DBR *ar, char *data)
298 ar->Stream = STREAM_UNIX_ATTRIBUTES;
299 ar->JobId = getpid();
301 for(p = b = data; *p; p++) {
306 ar->FileIndex = str_to_int64(b);
324 static void *do_batch(void *jcr)
326 JCR *bjcr = (JCR *)jcr;
330 memset(&ar, 0, sizeof(ar));
331 btime_t begin = get_current_btime();
332 char *datafile = bjcr->where;
334 FILE *fd = fopen(datafile, "r");
336 Emsg1(M_ERROR_TERM, 0, _("Error opening datafile %s\n"), datafile);
338 while (fgets(data, sizeof(data)-1, fd)) {
339 strip_trailing_newline(data);
341 if (verbose && ((lineno % 5000) == 1)) {
342 printf("\r%i", lineno);
344 fill_attr(&ar, data);
345 if (!db_create_attributes_record(bjcr, bjcr->db, &ar)) {
346 Emsg0(M_ERROR_TERM, 0, _("Error while inserting file\n"));
350 db_write_batch_file_records(bjcr);
351 btime_t end = get_current_btime();
354 char ed1[200], ed2[200];
355 printf("\rbegin = %s, end = %s\n", edit_int64(begin, ed1),edit_int64(end, ed2));
356 printf("Insert time = %sms\n", edit_int64((end - begin) / 10000, ed1));
357 printf("Create %u files at %.2f/s\n", lineno,
358 (lineno / ((float)((end - begin) / 1000000))));