implement new publish/subscribe introduction scheme #271
Labels
No Label
0.2.0
0.3.0
0.4.0
0.5.0
0.5.1
0.6.0
0.6.1
0.7.0
0.8.0
0.9.0
1.0.0
1.1.0
1.10.0
1.10.1
1.10.2
1.10a2
1.11.0
1.12.0
1.12.1
1.13.0
1.14.0
1.15.0
1.15.1
1.2.0
1.3.0
1.4.1
1.5.0
1.6.0
1.6.1
1.7.0
1.7.1
1.7β
1.8.0
1.8.1
1.8.2
1.8.3
1.8β
1.9.0
1.9.0-s3branch
1.9.0a1
1.9.0a2
1.9.0b1
1.9.1
1.9.2
1.9.2a1
LeastAuthority.com automation
blocker
cannot reproduce
cloud-branch
code
code-dirnodes
code-encoding
code-frontend
code-frontend-cli
code-frontend-ftp-sftp
code-frontend-magic-folder
code-frontend-web
code-mutable
code-network
code-nodeadmin
code-peerselection
code-storage
contrib
critical
defect
dev-infrastructure
documentation
duplicate
enhancement
fixed
invalid
major
minor
n/a
normal
operational
packaging
somebody else's problem
supercritical
task
trivial
unknown
was already fixed
website
wontfix
worksforme
No Milestone
No Assignees
2 Participants
Notifications
Due Date
No due date set.
Reference: tahoe-lafs/trac-2024-07-25#271
Loading…
Reference in New Issue
No description provided.
Delete Branch "%!s(<nil>)"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Implement the new publish/subscribe introduction scheme we've been discussing
recently:
enumerate the services which can be published and queried for:
to talk about that more first.. I'm not sure about it.
all nodes should have an IntroducerClient, as an attribute of the Node
instance.
to publish a service, do e.g.:
at startup:
(for upload/download) and one which just returns a flat list (mostly for
the welcome page):
Client installs (i.e. those created by py2exe) will disable storage
service by default. Storage-only nodes won't subscribe to hear about other
storage nodes.
Other things to think about:
us to create a special kind of helper which knows about peers for you), or
return an iterator, or both, somehow. To actually make this useful is
non-trivial (to reduce the memory footprint, you'd want an iterator that
yields Deferreds, but that might also impose a stupidly large number of
roundtrips to a query). We should probably wait until we identify a need
for this before implementing any part of it.
accumulates knowledge about peers, and the actual point of use (i.e.
upload or download) samples whatever peers have been acquired by that
time. This might not be the best approach.
In a separate but related topic, we were talking about the possible utility
of different "classes" of introduction: a node could publish some object in
one category ("storage servers") and a different object in some other
category ("upload helpers").
It occurred to me that it might be useful to have "storage servers for
upload" and "storage servers for download" to be separate categories. One use
would be a way to deal with the #269 mistake (in which I accidentally caused
most of our storage servers to generate new keys and therefore change
nodeids). We could resurrect the old nodeids in a different place, and move
all their old shares to be served by those nodes, thus making the mutable
slots available once more. But we'd like those nodes to only stick around
long enough to allow clients to migrate their data onto the real servers, so
we'd want to prevent new shares from being uploaded to them. The only tool we
have at the moment is to set size_limit=0, but sizes aren't being enforced
for mutable slots yet. But, if these "read-only" nodes were published as
download storage servers (and not upload storage servers), then the upload
and download code could use slightly different peersets, and we'd get the
desired behavior.
Likewise, if we have a storage server which is scheduled to be decommissioned
(say, the hard drive is starting to have soft errors, and we've begun the
process of migrating shares off of it but have not yet finished the job), it
might be nice to allow it to be available for reading but not accept any new
shares. Not being published as an upload server would prevent clients from
trying to send shares to it in the most efficient way possible.
Rob pointed out that this generalized pubsub mechanism might be a good way to meet upload helpers.
While scrubbing the kitchen floor with Amber on Saturday, I figured out that this might be a good way to meet other introducers, leading to #68 -- "implement distributed introduction, remove Introducer as a single point of failure".
merging in #168
Updated summary and description to specify the new introduction scheme we're planning to implement.
subscriber-only introducer clientto implement new publish/subscribe introduction schemewe've finished the first step, in changeset:7421d99f186ac96d and changeset:3aceb6be1e797e50
do not wish to publish anything
Rob will change the config-wizard (used by the windows installer) to touch this file at config time, and that should be enough to accompish the primary goal: make customer nodes not offer storage servers.
The next step will be to actually split the introducer into separate publish+subscribe methods.
I've implemented the next step: splitting the introducer into separate publish and subscribe methods. The new introducer is more service-centric: you publish specific services (like "storage") rather than publishing the client as a whole.
This will cause a compatibility bump, so I haven't quite pushed it yet, but I ought to by the end of the day.
changes are pushed, and the test grid has been upgraded. The only remaining issue is what to do with the old introducer-ish functionality of distributing the default encoding parameters, and I'm ok with zooko's suggestion to just leave this out.
closing this ticket, yay!