gpg: Improve speed of --check-sigs and --lish-sigs.
authorWerner Koch <wk@gnupg.org>
Sat, 20 Jun 2015 13:03:32 +0000 (15:03 +0200)
committerWerner Koch <wk@gnupg.org>
Sat, 20 Jun 2015 13:03:32 +0000 (15:03 +0200)
commit6500f338a35f4148606480c79f3a0c1b0d15f13a
tree704099c6494b66b97edaeee63e18fea0012701c0
parent53e9b86085ac70ede8a0b1de9018ccbfe55b0932
gpg: Improve speed of --check-sigs and --lish-sigs.

* g10/keydb.c (kid_list_t): New.
(kid_not_found_table, n_kid_not_found_table): New.
(kid_not_found_p, kid_not_found_insert, kid_not_found_flush): New.
(keydb_insert_keyblock): Flush the new cache.
(keydb_delete_keyblock): Ditto.
(keydb_update_keyblock): Ditto.
(keydb_search): Use the new cache.
(keydb_dump_stats): New.
* g10/gpg.c (g10_exit): Dump keydb stats.
--

What we do here is to keep track of key searches by long keyids (as
stored in all signatures) so that we do not need to scan the keybox
again after we already found that this keyid will result in
not-found.  As soon as we change gpg to run as a co-process we should
store this table per session because other instances of gpg may have
updated the keybox without us knowing.

On a test ring with

  gpg: 94721 good signatures
  gpg: 6831 bad signatures
  gpg: 150703 signatures not checked due to missing keys
  gpg: 5 signatures not checked due to errors
  gpg: keydb: kid_not_found_table: total: 14132

this new cache speeds a --check-sigs listing up from 28 minutes to
less than 3 minutes.

Signed-off-by: Werner Koch <wk@gnupg.org>
g10/gpg.c
g10/keydb.c
g10/keydb.h