From 14911aae21ec4975f7a805b91e3c4867cb41974b Mon Sep 17 00:00:00 2001 From: Christophe Besson Date: Mon, 12 Oct 2026 00:17:32 +0200 Subject: feat: let the operator pause and resume a root's indexing (MNP 6.2) A whole-root walk now checks its root before every file: removed or ejected, it stops instead of reading the drive to the end; paused, it finishes from the hash cache alone. A paused root is not watched, not swept by reconcile and survives a restart (roster), its indexed files stay served. Resume runs the reconcile sweep over the root, so entries and their enrichment are kept. Signed root_pause / root_resume over MNP, loopback routes, CLI `root pause|resume`, a pause button on the indexing dock and pause/resume in the roots table of Group settings. Co-Authored-By: Claude Opus 5.5 --- docs/MESHBAY_NODE_PROTOCOL.md | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) (limited to 'docs/MESHBAY_NODE_PROTOCOL.md') diff --git a/docs/MESHBAY_NODE_PROTOCOL.md b/docs/MESHBAY_NODE_PROTOCOL.md index 994c908..207d640 100644 --- a/docs/MESHBAY_NODE_PROTOCOL.md +++ b/docs/MESHBAY_NODE_PROTOCOL.md @@ -1168,6 +1168,7 @@ broadcast, every connected peer in the group learns the change without reconnect | `musicbrainz_enabled` | `enabled` | operator | `musicbrainz_enabled_ack{enabled}` | yes | | `root_remove` | the root name | operator | `root_remove_ack` | no | | `root_eject`, `root_plug` | the root name | operator | `root_eject_ack` / `root_plug_ack` | yes | +| `root_pause`, `root_resume` | the root name | operator | `root_pause_ack` / `root_resume_ack` | yes | | `app_directories` | `:,,...` | operator | `app_directories_ack{app, dirs}` | yes | | `chat_directory` | the path | operator | `chat_directory_ack{path}` | yes | | `chat_link_preview` | `on\|off` | operator | `chat_link_preview_ack{enabled}` | yes | @@ -1189,7 +1190,8 @@ proves that the operator's key signed, not that the operator meant it: in a brow that key is driven by code the hub serves (T3), and in the desktop application by a renderer that parses content from nodes. Either could have shared any folder on the operator's machine, writable, from anywhere. What is left here narrows (`root_remove`, -`root_eject`) or restores what the operator already shared (`root_plug`). The +`root_eject`, `root_pause`) or restores what the operator already shared (`root_plug`, +`root_resume`). The operator still sees the table from any browser: it rides in `index_sync` and `index_delta`, which is also how a change made on the node's machine reaches every open page. @@ -1327,11 +1329,13 @@ folder just created, or one emptied, does not exist as far as the UI is concerne a member cannot tell "the drive is unplugged" from "it is all still there" — an unavailable root is listed, with its content frozen rather than hidden. -Each root is described as `{name, kind, available, writable, removable, ejected}` — and -never a path: a member is told what exists and whether it is readable, never where on -the operator's disk it lives. `roots` rides on `index_delta` as well as `index_sync`, +Each root is described as `{name, kind, available, writable, removable, ejected, +paused}` — and never a path: a member is told what exists and whether it is readable, +never where on the operator's disk it lives. `paused` is the operator having stopped +the root's indexing: its files are served as before, and nothing new is indexed until +it is resumed. `roots` rides on `index_delta` as well as `index_sync`, because a full index is only ever sent on request: without it, a root added, removed, -ejected or plugged would leave every connected client's directory table stale until +ejected, plugged or paused would leave every connected client's directory table stale until somebody reloaded the page, and the delta that tells them something changed would be the one message unable to say what. @@ -2138,6 +2142,7 @@ it back (§3.5). | `chat_link_preview` / `_ack` | C→N / N⇒C | signed | whether the node unfurls posted links | | `search_listed` / `_ack` | C→N / N⇒C | signed | whether members' cross-group Search lists this group | | `root_eject` / `_ack`, `root_plug` / `_ack` | C→N / N⇒C | signed | take a removable root offline, put it back | +| `root_pause` / `_ack`, `root_resume` / `_ack` | C→N / N⇒C | signed | stop a root's indexing, start it again from where it stopped (6.2) | | `apps_enabled` / `_ack` | C→N / N⇒C | signed | which group apps are shown | | `set_scan_settings` / `_ack` | C→N / N⇒C | signed | reconcile interval and debounce | | `tmdb_config` / `_ack` | C→N / N⇒C | signed | node-wide TMDB token and language | @@ -2182,7 +2187,7 @@ message: ## 13. Versioning and compatibility -MNP versions independently of the package version. Current: **`6.1`**; oldest peer +MNP versions independently of the package version. Current: **`6.2`**; oldest peer accepted: **`4.0`**. 4.0 is the floor: a member presents a short-lived node-audience token bound to one node @@ -2208,6 +2213,10 @@ script in its page either. 6.1 adds the signed `chat_purge` (§10.4), additively: a 6.0 node gives no answer, as for any unknown type, and nothing else changes. +6.2 adds the signed `root_pause` and `root_resume` (§10.4) and `paused` on each root of +the roots table, additively: a 6.1 node gives no answer to either message, and a client +that ignores `paused` shows a paused root as an ordinary one. + The two numbers are separate on purpose. `MNP_VERSION` says what this build speaks; `MNP_MIN_SUPPORTED` says what it will talk to, and moving the second is a decision about whether an older peer can still do anything useful: -- cgit v1.2.3