X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=blobdiff_plain;f=index%2Fzebraapi.c;h=6415172a486d70eda08dae9a9c28429660130687;hp=e974f6cb7a7dcb497db4c4c79795b7bb015c99dc;hb=ec6ef89747394edb31aedfce9d585b5b34191154;hpb=5e7ca59d5cff2e9ee4710bb9a10cdb9434b9ad5a diff --git a/index/zebraapi.c b/index/zebraapi.c index e974f6c..6415172 100644 --- a/index/zebraapi.c +++ b/index/zebraapi.c @@ -1,5 +1,5 @@ /* This file is part of the Zebra server. - Copyright (C) 1994-2010 Index Data + Copyright (C) 1994-2011 Index Data Zebra is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -17,6 +17,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#if HAVE_CONFIG_H +#include +#endif #include #include #include @@ -1624,7 +1627,11 @@ static void zebra_set_state(ZebraHandle zh, int val, int seqno) sprintf(state_fname, "state.%s.LCK", zh->reg_name); fname = zebra_mk_fname(res_get(zh->res, "lockDir"), state_fname); f = fopen(fname, "w"); - + if (!f) + { + yaz_log(YLOG_FATAL|YLOG_ERRNO, "open %s w", state_fname); + exit(1); + } yaz_log(YLOG_DEBUG, "zebra_set_state: %c %d %ld", val, seqno, p); fprintf(f, "%c %d %ld\n", val, seqno, p); fclose(f); @@ -1809,8 +1816,6 @@ ZEBRA_RES zebra_begin_trans(ZebraHandle zh, int rw) zh->reg->seqno = seqno; else { - zebra_set_state(zh, 'o', seqno); - zebra_unlock(zh->lock_shadow); zebra_unlock(zh->lock_normal); @@ -2194,14 +2199,17 @@ ZEBRA_RES zebra_compact(ZebraHandle zh) return ZEBRA_OK; } +#define ZEBRA_CHECK_DICT 1 +#define ZEBRA_CHECK_ISAM 2 + static ZEBRA_RES zebra_record_check(ZebraHandle zh, Record rec, - zint *no_keys, int verbose_level, - int *no_long_dict_entries, - int *no_failed_dict_lookup, - int *no_invalid_keys, - int *no_invalid_dict_infos, - int *no_invalid_isam_entries - ) + zint *no_keys, int message_limit, + unsigned flags, + zint *no_long_dict_entries, + zint *no_failed_dict_lookups, + zint *no_invalid_keys, + zint *no_invalid_dict_infos, + zint *no_invalid_isam_entries) { ZEBRA_RES res = ZEBRA_OK; zebra_rec_keys_t keys = zebra_rec_keys_open(); @@ -2230,12 +2238,25 @@ static ZEBRA_RES zebra_record_check(ZebraHandle zh, Record rec, (*no_keys)++; + if (key_in.len < 2 || key_in.len > IT_KEY_LEVEL_MAX) + { + res = ZEBRA_FAIL; + (*no_invalid_keys)++; + if (*no_invalid_keys <= message_limit) + { + do_fail = 1; + yaz_log(YLOG_WARN, "Record " ZINT_FORMAT + ": unexpected key length %d", + rec->sysno, key_in.len); + } + } if (ord_len + slen >= sizeof(ord_buf)-1) { - (*no_long_dict_entries)++; res = ZEBRA_FAIL; - if (verbose_level >= 1) + (*no_long_dict_entries)++; + if (*no_long_dict_entries <= message_limit) { + do_fail = 1; /* so bad it can not fit into our ord_buf */ yaz_log(YLOG_WARN, "Record " ZINT_FORMAT ": long dictionary entry %d + %d", @@ -2247,36 +2268,41 @@ static ZEBRA_RES zebra_record_check(ZebraHandle zh, Record rec, ord_buf[ord_len + slen] = '\0'; if (ord_len + slen >= IT_MAX_WORD) { - do_fail = 1; + res = ZEBRA_FAIL; (*no_long_dict_entries)++; - if (verbose_level >= 1) + if (*no_long_dict_entries <= message_limit) { + do_fail = 1; yaz_log(YLOG_WARN, "Record " ZINT_FORMAT ": long dictionary entry %d + %d", rec->sysno, (int) ord_len, (int) slen); } } + if ((flags & ZEBRA_CHECK_DICT) == 0) + continue; info = dict_lookup(zh->reg->dict, ord_buf); if (!info) { - do_fail = 1; - (*no_failed_dict_lookup)++; - if (verbose_level >= 1) + res = ZEBRA_FAIL; + (*no_failed_dict_lookups)++; + if (*no_failed_dict_lookups <= message_limit) { + do_fail = 1; yaz_log(YLOG_WARN, "Record " ZINT_FORMAT ": term do not exist in dictionary", rec->sysno); } } - else + else if (flags & ZEBRA_CHECK_ISAM) { ISAM_P pos; if (*info != sizeof(pos)) { - do_fail = 1; + res = ZEBRA_FAIL; (*no_invalid_dict_infos)++; - if (verbose_level >= 1) + if (*no_invalid_dict_infos <= message_limit) { + do_fail = 1; yaz_log(YLOG_WARN, "Record " ZINT_FORMAT ": long dictionary entry %d + %d", rec->sysno, (int) ord_len, (int) slen); @@ -2292,10 +2318,11 @@ static ZEBRA_RES zebra_record_check(ZebraHandle zh, Record rec, scope); if (!ispt) { - do_fail = 1; + res = ZEBRA_FAIL; (*no_invalid_isam_entries)++; - if (verbose_level >= 1) + if (*no_invalid_isam_entries <= message_limit) { + do_fail = 1; yaz_log(YLOG_WARN, "Record " ZINT_FORMAT ": isamb_pp_open entry " ZINT_FORMAT " not found", @@ -2322,10 +2349,11 @@ static ZEBRA_RES zebra_record_check(ZebraHandle zh, Record rec, r = isamb_pp_forward(ispt, &isam_key, &until_key); if (r != 1) { - do_fail = 1; + res = ZEBRA_FAIL; (*no_invalid_isam_entries)++; - if (verbose_level >= 1) + if (*no_invalid_isam_entries <= message_limit) { + do_fail = 1; yaz_log(YLOG_WARN, "Record " ZINT_FORMAT ": isamb_pp_forward " ZINT_FORMAT " returned no entry", @@ -2337,10 +2365,12 @@ static ZEBRA_RES zebra_record_check(ZebraHandle zh, Record rec, int cmp = key_compare(&until_key, &isam_key); if (cmp != 0) { - do_fail = 1; + res = ZEBRA_FAIL; (*no_invalid_isam_entries)++; - if (verbose_level >= 1) + if (*no_invalid_isam_entries + <= message_limit) { + do_fail = 1; yaz_log(YLOG_WARN, "Record " ZINT_FORMAT ": isamb_pp_forward " @@ -2365,26 +2395,11 @@ static ZEBRA_RES zebra_record_check(ZebraHandle zh, Record rec, } } } - if (key_in.len < 2 || key_in.len > 4) - { - do_fail = 1; - (*no_invalid_keys)++; - if (verbose_level >= 1) - { - yaz_log(YLOG_WARN, "Record " ZINT_FORMAT - ": unexpected key length %d", - rec->sysno, key_in.len); - } - } if (do_fail) { - res = ZEBRA_FAIL; - if (verbose_level >= 1) - { - zebra_it_key_str_dump(zh, &key_in, str, - slen, nmem, YLOG_LOG); - nmem_reset(nmem); - } + zebra_it_key_str_dump(zh, &key_in, str, + slen, nmem, YLOG_LOG); + nmem_reset(nmem); } } nmem_destroy(nmem); @@ -2393,37 +2408,54 @@ static ZEBRA_RES zebra_record_check(ZebraHandle zh, Record rec, return res; } -ZEBRA_RES zebra_register_check(ZebraHandle zh, int verbose_level) +ZEBRA_RES zebra_register_check(ZebraHandle zh, const char *spec) { ZEBRA_RES res = ZEBRA_FAIL; + unsigned flags = 0; + int message_limit = 10; + + if (!spec || *spec == '\0' + || !strcmp(spec, "dict") || !strcmp(spec, "default")) + flags = ZEBRA_CHECK_DICT; + else if (!strcmp(spec, "isam") || !strcmp(spec, "full")) + flags = ZEBRA_CHECK_DICT|ZEBRA_CHECK_ISAM; + else if (!strcmp(spec, "quick")) + flags = 0; + else + return ZEBRA_FAIL; + + yaz_log(YLOG_LOG, "zebra_register_check begin flags=%u message_limit=%d", + flags, message_limit); if (zebra_begin_read(zh) == ZEBRA_OK) { zint no_records_total = 0; zint no_records_fail = 0; zint total_keys = 0; + if (zh->reg) { Record rec = rec_get_root(zh->reg->records); + zint no_long_dict_entries = 0; + zint no_failed_dict_lookups = 0; + zint no_invalid_keys = 0; + zint no_invalid_dict_infos = 0; + zint no_invalid_isam_entries = 0; + res = ZEBRA_OK; while (rec) { Record r1; zint no_keys; - int no_long_dict_entries = 0; - int no_failed_dict_lookup = 0; - int no_invalid_keys = 0; - int no_invalid_dict_infos = 0; - int no_invalid_isam_entries = 0; - - if (zebra_record_check(zh, rec, &no_keys, verbose_level, + if (zebra_record_check(zh, rec, &no_keys, message_limit, + flags, &no_long_dict_entries, - &no_failed_dict_lookup, + &no_failed_dict_lookups, &no_invalid_keys, &no_invalid_dict_infos, &no_invalid_isam_entries - ) + ) != ZEBRA_OK) { res = ZEBRA_FAIL; @@ -2436,12 +2468,28 @@ ZEBRA_RES zebra_register_check(ZebraHandle zh, int verbose_level) no_records_total++; total_keys += no_keys; } - yaz_log(YLOG_LOG, "records total: " ZINT_FORMAT, no_records_total); - yaz_log(YLOG_LOG, "records fail: " ZINT_FORMAT, no_records_fail); - yaz_log(YLOG_LOG, "keys: " ZINT_FORMAT, total_keys); + yaz_log(YLOG_LOG, "records total: " ZINT_FORMAT, + no_records_total); + yaz_log(YLOG_LOG, "records fail: " ZINT_FORMAT, + no_records_fail); + yaz_log(YLOG_LOG, "total keys: " ZINT_FORMAT, + total_keys); + yaz_log(YLOG_LOG, "long dict entries: " ZINT_FORMAT, + no_long_dict_entries); + if (flags & ZEBRA_CHECK_DICT) + { + yaz_log(YLOG_LOG, "failed dict lookups: " ZINT_FORMAT, + no_failed_dict_lookups); + yaz_log(YLOG_LOG, "invalid dict infos: " ZINT_FORMAT, + no_invalid_dict_infos); + } + if (flags & ZEBRA_CHECK_ISAM) + yaz_log(YLOG_LOG, "invalid isam entries: " ZINT_FORMAT, + no_invalid_isam_entries); } zebra_end_read(zh); } + yaz_log(YLOG_LOG, "zebra_register_check end ret=%d", res); return res; }