48
48
int main(int argc, char **argv);
49
49
static void printferror(const char *format, ...);
50
50
static void printfinfo(const char *format, ...);
51
static void dbinform(const char *msg);
51
static void dbinform(const char *message, void *opaque);
52
52
static void setsignals(void);
53
53
static void sigtermhandler(int num);
54
54
static void usage(void);
55
55
static int runwicked(int argc, char **argv);
56
static int runregression(int argc, char **argv);
56
57
static int procwicked(const char *dbname, int dnum, int tnum);
58
static int procregression(const char *dbname);
57
59
static void *mtwkfunc(void *mission);
58
60
static ESTDOC *est_doc_new_from_chaos(int cnum, int snum, int mode);
59
61
static char *est_random_str(int cnum, int mode);
275
/* perform the regression command */
276
static int procregression(const char *dbname){
277
ESTMTDB *dbs[10], *db, *tdbs[5];
281
char wbuf[URIBUFSIZ];
282
int i, j, ecode, err, *res, rnum;
284
curtime = time(NULL);
285
printfinfo("# opening databases");
286
for(i = 0; i < 10; i++){
287
sprintf(wbuf, "%s-%08d", dbname, i + 1);
288
if(!(dbs[i] = est_mtdb_open(wbuf, ESTDBWRITER | ESTDBCREAT | ESTDBTRUNC, &ecode))){
289
printferror("%s: %s", wbuf, est_err_msg(est_mtdb_error(dbs[i])));
292
est_mtdb_set_informer(dbs[i], dbinform, NULL);
295
printfinfo("# registering documents");
296
for(i = 0; i < 1000 && !g_sigterm; i++){
298
sprintf(wbuf, "%d", rand() % (i + 100));
299
est_doc_add_attr(doc, ESTDATTRURI, wbuf);
300
for(j = 0; j < 100; j++){
301
sprintf(wbuf, "%c%c", 'a' + rand() % 6, 'a' + rand() % 6);
302
est_doc_add_text(doc, wbuf);
305
if(!est_mtdb_put_doc(db, doc, ESTPDCLEAN)){
306
printferror("%s: %s", est_mtdb_name(db), est_err_msg(ecode));
311
printfinfo("# flushing half of databases");
312
for(i = 0; i < 10; i += 2){
313
if(!est_mtdb_flush(dbs[i], -1)){
314
printferror("%s: %s", est_mtdb_name(dbs[i]), est_err_msg(ecode));
318
printfinfo("# searching databases");
319
for(i = 0; i < 1000 && !g_sigterm; i++){
320
cond = est_cond_new();
321
sprintf(wbuf, "%c%c", 'a' + rand() % 6, 'a' + rand() % 6);
322
est_cond_set_phrase(cond, wbuf);
325
est_cond_set_order(cond, ESTORDIDA);
328
est_cond_set_order(cond, ESTORDSCA);
331
est_cond_set_order(cond, ESTDATTRURI " " ESTORDSTRA);
335
res = est_mtdb_search_meta(dbs, 10, cond, &rnum, hints);
336
for(j = 0; j < rnum; j += 2){
337
if(res[j] < 0 || res[j] >= 10){
338
printferror("%s: search result is invalid", dbname);
345
est_cond_delete(cond);
347
printfinfo("# searching certainly same databases");
353
for(i = 0; i < 100 && !g_sigterm; i++){
354
cond = est_cond_new();
355
sprintf(wbuf, "%c%c", 'a' + rand() % 6, 'a' + rand() % 6);
356
est_cond_set_phrase(cond, wbuf);
359
est_cond_set_order(cond, ESTORDIDA);
362
est_cond_set_order(cond, ESTORDSCA);
365
est_cond_set_order(cond, ESTDATTRURI " " ESTORDSTRA);
369
res = est_mtdb_search_meta(tdbs, 5, cond, &rnum, hints);
370
for(j = 0; j < rnum; j += 2){
371
if(res[j] < 0 || res[j] >= 5){
372
printferror("%s: search result is invalid", dbname);
379
est_cond_delete(cond);
381
printfinfo("# closing databases");
382
for(i = 0; i < 10; i++){
383
if(!est_mtdb_close(dbs[i], &ecode)){
384
printferror("%s: %s", est_mtdb_name(dbs[i]), est_err_msg(ecode));
388
curtime = time(NULL) - curtime;
389
if(!err) printfinfo("# finished successfully: elapsed time: %dh %dm %ds",
390
(int)(curtime / 3600), (int)((curtime / 60) % 60), (int)(curtime % 60));
249
395
/* Thread function for wicked command */
250
396
static void *mtwkfunc(void *mission){
251
397
ESTMTDB *db, **others;
333
479
doc = est_doc_new_from_chaos(100, 3, est_random() < 0.5 ? RD_EURO : RD_RAND);
334
480
if(est_random() < 0.2){
335
481
sprintf(uri, "file:///tmp/wicked-%08d-%05d.est",
336
(int)(est_random() * INT_MAX) % (i + 1) + 1, getpid());
482
(int)(est_random() * INT_MAX) % (i + 1) + 1, (int)getpid());
338
sprintf(uri, "file:///tmp/wicked-%08d-%05d.est", i + 1, getpid());
484
sprintf(uri, "file:///tmp/wicked-%08d-%05d.est", i + 1, (int)getpid());
340
486
est_doc_add_attr(doc, ESTDATTRURI, uri);
341
487
if(!est_mtdb_put_doc(db, doc, est_random() < 0.5 ? ESTPDCLEAN : 0)) err = TRUE;