Commit Graph

137 Commits

Author SHA1 Message Date
dc0ad7dabe mu-store: cosmetics 2026-08-20 15:05:28 -07:00
8914004970 Work around xapian bug
https://trac.xapian.org/ticket/850
2026-08-20 15:05:28 -07:00
31835200bd New incremental cleanup strategy: 63%-88% faster
This change adds a new cleanup mode that avoids cleanup having
re-traverse the directories the index pass just looked at.
Additionally, we efficiently query the Xapian database by walking the
term list instead of doing multiple point-wise path lookups.

I'd noticed that most of my time in mu's cleanup pass consisted of
B-tree lookups in Xapian (one 8KB pread64 at a time).  The point
lookups forced Xapian to traverse from the root of the B-tree to the
leaf for every single message.  Additionally, in order to join on the
message path, we had to do *another* B-tree traversal after locating
each message term.  Now we just walk the terms in order, which is much
more efficient, as we touch each B-tree node only once.

On my system, with 1371861 total messages, the total time of mu
index (no lazy check):

--nocleanup: 3.6s
incremental cleanup: 4.2s (0.6s in cleanup)
legacy cleanup: 5.2s (1.6s in cleanup)

With the new mode, we save 1.0s of the 1.6s cleanup, so we're
~63% faster.

But the incremental cleanup works even better with lazy checking.
If I enable --lazy-check, dirty only my INBOX (360778 messages), and
run index, I get:

--nocleanup: 0.9s
incremental cleanup: 1.1s (0.2s in cleanup)
legacy cleanup: 2.5s (1.6s in cleanup)

We save 1.4s out of 1.6s for ~88% speedup.

This change also fixes a timestamp bug: we should be storing
the *start* time of the index pass in metadata, not the end time, so
that on the next index pass, we notice messages that arrived between
the two times.

All tests pass.  You can set the environment variable
MU_NO_INCREMENTAL_CLEANUP to use the legacy cleanup path instead.
2026-08-20 15:05:28 -07:00
c547cde73e store: remove some _unlocked functions, update clear_labels
They don't add much value, let's remove.

Rework clear_labels in terms of update_labels.
2026-08-20 15:04:26 -07:00
33ab0acc8d store: update labels when removing messages
This does make removing a bit slower...
2026-08-20 15:04:26 -07:00
3a12c69b10 mu: refactor labels code
Split labels-cache and store-labels.
2026-08-20 15:04:26 -07:00
124b371850 labels: allow restoring cache-map
E.g. with unexpected termination for mu it is possible that the
labels-cache (i.e., the one that is used for auto-completion) gets disconnected
from reality.

Add a --restore option to `mu label list` to restore the actual labels from the
labels seen in the store.
2026-08-20 15:04:26 -07:00
bb399bc37a store: implement serialize method, use it
For triggering saving the contacts / labels caches.
2026-08-20 15:04:26 -07:00
c074c138f8 store: improve label handling
In particular, clear_labels

And some cosmetics
2026-08-20 15:04:26 -07:00
8c706a77db mu-init: automatic export labels with --reinit
When re-initializing the store, automatically write the labels to a file in mu's
cache, so user can later import them.
2025-08-16 16:20:33 +03:00
a6b1f47a30 labels: refactor import/export to mu-store-labels
Move the import/export code to 'lib'.
2025-08-16 12:18:21 +03:00
1e628dfcab store: add support for modifying and listing labels and caching
Add methods update_labels, clear_labels which update or clear the labels for a
message in the store, and update the cache with the overall counts of labels.

Add a LabelsCache to keep track of the counts and labels_map() to retrieve that
map.
2025-08-15 21:02:24 +03:00
831deb2364 lib/store-worker: remove
We're not using it.
2024-11-26 11:21:38 +02:00
cf9c09867f store-worker: implement
store-worker is a thread + async queue to throttle requests to a single thread.
2024-06-03 21:01:11 +03:00
c05b28e761 xapian-db: remove locks, transaction levels
Simplify xapian-db: locks should go elsewhere; transaction level add
too much complication.
2024-06-03 21:01:07 +03:00
1e9f772e0a lib: fix batch-size after db creation
Ensure we use the user-specified batch-size immediately after db creation.
2024-06-01 17:30:16 +03:00
aeb6d44172 mu-store/indexer: consume messages from workers
Add store::consume_message, which is like add message but std::move from
the caller such that the messages longer has copies (with
Xapian::Document) on the caller side; this is to avoid threading issues.
2024-05-08 19:11:40 +03:00
9fd0d2be12 clang: fix some compiler warnings
From CI.
2024-03-15 19:47:30 +02:00
dcbcd697f4 mu-init: insist that --maildir is absolute 2024-02-26 01:08:44 +02:00
5a763af970 lib/mu-store: don't assume non-empty in remove_slash
HT: Arsen Arsenović

Fixes #2633.
2024-02-25 17:11:29 +02:00
146b80113f lib: move transaction handling to mu-xapian
Instead of handling transactions in the store, handle it in xapian-db.
Make the code a bit more natural / cleaner-out

Handle transaction automatically (with a batch-size) and add some RAII
Transaction object, which makes all database interaction transactable
for the duration. So, no more need for explicit parameters to
add_message while indexing.
2023-12-22 21:24:41 +02:00
b0dca49dc0 store: better handling moving messages
sort results (for testing)

with the ChangeName flag, also apply to dup messages.
2023-09-24 17:29:56 +03:00
2d20074b99 mu-move: add new move sub command
Add sub-command to move messages; add tests and docs.

Fixes #157
2023-09-24 17:29:08 +03:00
655a6b0499 lib: xapian-db/config: more tests
...and xapian-db gets a small API update, update store as well.
2023-09-23 09:27:46 +03:00
c78dafd723 provide end-user hints and show them
Only a few for now.
2023-09-16 11:12:16 +03:00
53c7381929 lib: move index/ into main lib/
simplify things a bit
2023-09-10 08:55:25 +03:00
264bb092f0 support xapian ngrams
Xapian supports an "ngrams" option to help with languages/scripts
without explicit wordbreaks, such as Chinese / Japanese / Korean.

Add some plumbing for supporting this in mu as well. Experimental for
now.
2023-09-09 17:26:20 +03:00
e52030c049 store: expose maildirs() method
This gets the current list of maildirs by asking the scanner to do a
file-system search.
2023-08-17 22:42:25 +03:00
8caf504381 store: update "move" and some related APIs
Update test cases as well.
2023-08-17 22:42:25 +03:00
4c0b7db3d8 store: add 'add_document' optimization, use it
*Usually* we need Xapian's replace_document() API, but when we know a
document (message) is completely new, we can use the faster
add_document(). That is the case with the initial (re)indexing, when
start with an empty database.

Also a few smaller cleanups.
2023-07-25 23:56:19 +03:00
99a0eaaa76 lib/store: improve dirstamp / set_dirstamp code
Modernize.
2023-07-11 22:54:01 +03:00
18490a818d store/server: centralize docids-for-msgid
No need for two near-identical impls

Remove some dead declarations.
2023-07-10 23:17:06 +03:00
0b4f7c4cbe lib: xapian-db/store: simplify
No need for "pimpl" in xapian-db; keep it simple.
2023-07-10 23:15:40 +03:00
4171fe14c3 store: removing trailing / for root_maildir
Other code depends on that.
2023-07-06 21:49:50 +03:00
91c5a9bac5 store: only write last-change _once_
xapian-db does it, no longer needed in store.cc
2023-07-06 21:49:50 +03:00
4920b56671 update to use fmt-based apis
Not complete, but a first big stab converting users of Mu::Error and
various g_warning & friends, format to the new libfmt-based APIs.
2023-07-05 23:10:13 +03:00
3791d0c375 lib/store: rework to use xapian-db / config
Simplifies the implementation.
2023-07-02 00:06:56 +03:00
a3538e5ef1 store: small cleanups
Remove readonly/inmemory from properties. Add read_only() accessor.
2023-04-23 20:26:16 +03:00
10838a2c58 mu-store: fix typo 2023-01-14 20:02:05 +02:00
6979a66630 utils: get rid of mu-util.[ch]
It was getting old...
Remove the unused parts, refactor the few parts still in use.
2023-01-14 20:02:05 +02:00
6b04158925 mu-store: create mu cache path if needed 2023-01-06 19:48:40 +02:00
87c3ceb7b1 store: update move_message API
Update the move_message API so to allow for updating duplicate messages
too (not implemented yet), and return all updated messages.
2022-12-07 18:22:29 +02:00
a417b38624 store: update for new sexp api
And use improved cached_sexp api (automatically handled with
mu-document now)
2022-11-07 18:38:03 +02:00
27a85eada2 store: fix move ctor
indexer_ is holding a ptr to the _old_ store; clear it so it gets
regenerated.
2022-10-26 21:51:53 +03:00
5367122c08 store: support reinit
Support reinitializing, based on some current store. This is useful for
upgrading. Note that this is only the backend implementation + tests.
2022-10-02 18:24:23 +03:00
97459beed9 maildir: improve testing coverage
Remove some dead/unused code. Update docs. Add test cases.
2022-06-29 22:19:26 +03:00
ce1fea6302 store: log whether a message is 'personal' 2022-05-30 20:31:23 +03:00
cea3167f3e lib: remove some dead code (mu-str/utils)
Remove unused library code; recycle some electrons.
2022-05-19 23:38:49 +03:00
9af9d0fa94 indexer/store: avoid completed callback
This cause havoc / race conditions.
2022-05-18 20:16:48 +03:00
c3778cd467 store: reset indexer in dtor
Clear it up as soon as possible.
2022-05-18 18:24:30 +03:00