Joey Hess [Thu, 27 Jun 2024 19:44:11 +0000 (15:44 -0400)]
merged the proxy branch into master!
Joey Hess [Thu, 27 Jun 2024 19:43:45 +0000 (15:43 -0400)]
Merge branch 'proxy'
Joey Hess [Thu, 27 Jun 2024 19:43:42 +0000 (15:43 -0400)]
Merge branch 'master' of ssh://git-annex.branchable.com
Joey Hess [Thu, 27 Jun 2024 19:41:38 +0000 (15:41 -0400)]
move clusters page to tips
also add a section on the front page highlighting major new features
Joey Hess [Thu, 27 Jun 2024 19:34:45 +0000 (15:34 -0400)]
make extendcluster also updatecluster
This avoids the user forgetting to do it and simplifies the
documentation.
Joey Hess [Thu, 27 Jun 2024 19:28:10 +0000 (15:28 -0400)]
update
Joey Hess [Thu, 27 Jun 2024 19:21:03 +0000 (15:21 -0400)]
give proxied cluster nodes a higher cost than the cluster gateway
This makes eg git-annex get default to using the cluster rather than an
arbitrary node, which is better UI.
The actual cost of accessing a proxied node vs using the cluster is
basically the same. But using the cluster allows smarter load-balancing
to be done on the cluster.
Joey Hess [Thu, 27 Jun 2024 18:36:55 +0000 (14:36 -0400)]
GET and CHECKPRESENT amoung lowest cost cluster nodes
Before it was using a node that might have had a higher cost.
Also threw in a random selection from amoung the low cost nodes. Of
course this is a poor excuse for load balancing, but it's better than
nothing. Most of the time...
Joey Hess [Thu, 27 Jun 2024 17:40:09 +0000 (13:40 -0400)]
update
Joey Hess [Thu, 27 Jun 2024 17:36:04 +0000 (13:36 -0400)]
remove a TODO marker
I have a todo item for this outside the code
Joey Hess [Thu, 27 Jun 2024 17:34:24 +0000 (13:34 -0400)]
remove viconfig item
it works when run on a client that has the cluster gateway as a remote,
just not when on the cluster gateway
Joey Hess [Thu, 27 Jun 2024 17:33:04 +0000 (13:33 -0400)]
document various multi-gateway cluster considerations
Perhaps this will avoid me needing to eg, implement spanning tree
protocol. ;-)
Joey Hess [Thu, 27 Jun 2024 16:57:08 +0000 (12:57 -0400)]
updates
Joey Hess [Thu, 27 Jun 2024 16:47:26 +0000 (12:47 -0400)]
update for clusters
Joey Hess [Thu, 27 Jun 2024 16:41:57 +0000 (12:41 -0400)]
Merge branch 'master' into proxy
Joey Hess [Thu, 27 Jun 2024 16:38:32 +0000 (12:38 -0400)]
remove unused import
Joey Hess [Thu, 27 Jun 2024 16:35:35 +0000 (12:35 -0400)]
avoid unfiltered debugging from git-annex-shell
When --debugfilter or annex.debugfilter is set, avoid propigating debug
output from git-annex-shell, since it cannot be filtered.
It would be possible to pass --debugfilter on to git-annex-shell,
but it only started accepting that option in 2022. So it would break
interop with older versions.
Joey Hess [Thu, 27 Jun 2024 16:20:22 +0000 (12:20 -0400)]
distributed cluster cycle prevention
Added BYPASS to P2P protocol, and use it to avoid cycling between
cluster gateways.
Distributed clusters are working well now!
lykos@d125a37d89b1cfac20829f12911656c40cb70018 [Thu, 27 Jun 2024 10:47:43 +0000 (10:47 +0000)]
Joey Hess [Wed, 26 Jun 2024 19:27:16 +0000 (15:27 -0400)]
avoid loop between cluster gateways
The VIA extension is still needed to avoid some extra work and ugly
messages, but this is enough that it actually works.
This filters out the RemoteSides that are a proxied connection via a
remote gateway to the cluster.
The VIA extension will not filter those out, but will send VIA to them
on connect, which will cause the ones that are accessed via the listed
gateways to be filtered out.
Joey Hess [Wed, 26 Jun 2024 19:02:10 +0000 (15:02 -0400)]
support multi-gateway clusters
VIA extension still needed otherwise a copy to a cluster can loop
forever.
Joey Hess [Wed, 26 Jun 2024 18:21:35 +0000 (14:21 -0400)]
update for multi-gateway clusters
Joey Hess [Wed, 26 Jun 2024 17:21:51 +0000 (13:21 -0400)]
fix cycle prevention code
Joey Hess [Wed, 26 Jun 2024 16:56:16 +0000 (12:56 -0400)]
git-annex-shell: proxy nodes located beyond remote cluster gateways
Walking a tightrope between security and convenience here, because
git-annex-shell needs to only proxy for things when there has been
an explicit, local action to configure them.
In this case, the user has to have run `git-annex extendcluster`,
which now sets annex-cluster-gateway on the remote.
Note that any repositories that the gateway is recorded to
proxy for will be proxied onward. This is not limited to cluster nodes,
because checking the node log would not add any security; someone could
add any uuid to it. The gateway of course then does its own
checking to determine if it will allow proxying for the remote.
Joey Hess [Wed, 26 Jun 2024 15:24:55 +0000 (11:24 -0400)]
set up proxies for cluster nodes that are themselves proxied via a remote
When there are multiple gateways to a cluster, this sets up proxying
for nodes that are accessed via a remote gateway.
Eg, when running in nyc and amsterdam is the remote gateway,
and it has node1 and node2, this sets up proxying for
amsterdam-node1 and amsterdam-node2. A client that has nyc as a remote
will see proxied remotes nyc-amsterdam-node1 and nyc-amsterdam-node2.
Joey Hess [Wed, 26 Jun 2024 14:51:14 +0000 (10:51 -0400)]
updatecluster: support multiple gateways
Just look at the existing proxied remotes that correspond to already
existing nodes of the cluster, and keep those nodes in the cluster.
While adding any remotes of the local repo that are configured as
cluster nodes. This allows removing cluster nodes from the local repo
and updating, without it also removing nodes provided by other gateways.
Joey Hess [Wed, 26 Jun 2024 14:26:54 +0000 (10:26 -0400)]
added git-annex extendcluster
This works, but updatecluster does not work yet in multi-gateway
clusters, nor do gateways relay to other gateways.
m.risse@77eac2c22d673d5f10305c0bade738ad74055f92 [Wed, 26 Jun 2024 10:20:29 +0000 (10:20 +0000)]
Added a comment
m.risse@77eac2c22d673d5f10305c0bade738ad74055f92 [Wed, 26 Jun 2024 10:11:58 +0000 (10:11 +0000)]
Do checkpresentkey with --debug set
m.risse@77eac2c22d673d5f10305c0bade738ad74055f92 [Wed, 26 Jun 2024 08:06:37 +0000 (08:06 +0000)]
Joey Hess [Tue, 25 Jun 2024 21:58:45 +0000 (17:58 -0400)]
todo
Joey Hess [Tue, 25 Jun 2024 21:50:22 +0000 (17:50 -0400)]
improve docs
Joey Hess [Tue, 25 Jun 2024 21:26:26 +0000 (17:26 -0400)]
update
Joey Hess [Tue, 25 Jun 2024 21:20:49 +0000 (17:20 -0400)]
design for distributed clusters
Joey Hess [Tue, 25 Jun 2024 19:27:03 +0000 (15:27 -0400)]
thoughts on cycles
Rejected the idea of automatically instantiating remotes for proxies-of-proxies.
That needs cycle protection, while the current behavior, which happened
for free, is that running git-annex updateproxy on the proxy can be used
to configure it, but only for topologies that actually exist.
Joey Hess [Tue, 25 Jun 2024 18:52:47 +0000 (14:52 -0400)]
support annex.jobs for clusters
Joey Hess [Tue, 25 Jun 2024 18:10:06 +0000 (14:10 -0400)]
improve handling of cluster nodes disconnecting
Joey Hess [Tue, 25 Jun 2024 17:35:12 +0000 (13:35 -0400)]
gave up on upload fanout to cluster's proxy
The problem with that idea is that the cluster's proxy is necessarily a
remote, and necessarily one that we'll want to sync with, since the git
repository is stored there. So when its preferred content wants a file,
and the cluster does too, the file will get uploaded to it as well as to
the cluster. With fanout, the upload to the cluster will populate the
proxy as well, avoiding a second upload. But only if the file is sent to
the cluster first. If it's sent to the proxy first, there will be two
uploads.
Another, lesser problem is that a repository can proxy for more than one
cluster. So when does it make sense to drop content from the repository?
It could be done when dropping from one cluster, but what of the other
one?
This complication was not necessary anyway. Instead, if it's desirable
to have some content accessed from close to the proxy, one of the
cluster nodes can just be put on the same filesystem as it. That will be
just as fast as storing the content on the proxy.
m.risse@77eac2c22d673d5f10305c0bade738ad74055f92 [Tue, 25 Jun 2024 15:59:36 +0000 (15:59 +0000)]
Joey Hess [Tue, 25 Jun 2024 15:35:41 +0000 (11:35 -0400)]
honor preferred content settings of cluster nodes
Except when no nodes want a file, it has to be stored somewhere, so
store it on all. Which is not really desirable, but neither is having to
pick one.
ProtoAssociatedFile deserialization is rather broken, and this could
possibly affect preferred content expressions that match on filenames.
The inability to roundtrip whitespace like tabs and newlines through is
not a problem because preferred content expressions can't be written
that match on whitespace such as a tab. For example:
joey@darkstar:~/tmp/bench/z>git-annex wanted origin-node2 'exclude=*CTRL-VTab*'
wanted origin-node2
git-annex: Parse error: Parse failure: near "*"
But, the filtering of control characters could perhaps be a problem. I think
that filtering is now obsolete, git-annex has comprehensive filtering of
control characters when displaying filenames, that happens at a higher level.
However, I don't want to risk a security hole so am leaving in that filtering
in ProtoAssociatedFile deserialization for now.
Joey Hess [Tue, 25 Jun 2024 14:32:34 +0000 (10:32 -0400)]
PUT to cluster send to all nodes rather than none
If the location log says all nodes contain content, pass in all nodes,
rather than none.
The location log can be wrong. While it's good to avoid unncessessary
connections to nodes that already contain a key, it would be bad to
refuse to accept an upload at all when the location log is wrong.
Also, passing in no nodes leaves the proxy in an untenable state. It
can't proxy to no nodes. So it closes the connection. Passing in all
nodes means it has to do the work to connect to all of them, and see
that they say they already have the content, and then it can tell the
client that.
Joey Hess [Tue, 25 Jun 2024 14:06:28 +0000 (10:06 -0400)]
don't sync with cluster nodes by default
Avoid `git-annex sync --content` etc from operating on cluster nodes by default
since syncing with a cluster implicitly syncs with its nodes. This avoids a
lot of unncessary work when a cluster has a lot of nodes just in checking
if each node's preferred content is satisfied. And it avoids content
being sent to nodes individually, so instead syncing with clusters always
fanout uploads to nodes.
The downside is that there are situations where a cluster's preferred content
settings can be met, but those of its nodes are not. Or where a node does not
contain a key, but the cluster does, and there are not enough copies of the key
yet, so it would be desirable the send it there. I think that's an acceptable
tradeoff. These kind of situations are ones where the cluster itself should
probably be responsible for copying content to the node. Which it can do much
less expensively than a client can. Part of the balanced preferred content
design that I will be working on in a couple of months involves rebalancing
clusters, so I expect to revisit this.
The use of annex-sync config does allow running git-annex sync with a specific
node, or nodes, and it will sync with it. And it's also possible to set
annex-sync git configs to make it sync with a node by default. (Although that
will require setting up an explicit git remote for the node rather than relying
on the proxied remote.)
Logs.Cluster.Basic is needed because Remote.Git cannot import Logs.Cluster
due to a cycle. And the Annex.Startup load of clusters happens
too late for Remote.Git to use that. This does mean one redundant load
of the cluster log, though only when there is a proxy.
m.risse@77eac2c22d673d5f10305c0bade738ad74055f92 [Tue, 25 Jun 2024 10:46:13 +0000 (10:46 +0000)]
Joey Hess [Mon, 24 Jun 2024 14:13:13 +0000 (10:13 -0400)]
add annex-proxied
This makes git-annex sync and similar not treat proxied remotes as git
syncable remotes.
Also, display in git-annex info remote when the remote is proxied.
Joey Hess [Mon, 24 Jun 2024 13:40:57 +0000 (09:40 -0400)]
fix git-annex sync --content with proxied remotes
Loading the remote list a second time was removing all proxied remotes.
That happened because setting up the proxied remote added some config
fields to the in-memory git config, and on the second load, it saw those
configs and decided not to overwrite them with the proxy.
Now on the second load, that still happens. But now, the proxied
git configs are used to generate a remote same as if those configs were
all set. The reason that didn't happen before was twofold,
the gitremotes cache was not dropped, and the remote's url field was not
set correctly.
The problem with the remote's url field is that while it was marked as
proxy inherited, all other proxy inherited fields are annex- configs.
And the code to inherit didn't work for the url field.
Now it all works, but git-annex sync is left running git push/pull on
the proxied remote, which doesn't work. That still needs to be fixed.
Joey Hess [Mon, 24 Jun 2024 13:36:21 +0000 (09:36 -0400)]
drop gitremotes cache when config is changed
Joey Hess [Mon, 24 Jun 2024 13:35:24 +0000 (09:35 -0400)]
remove attempt to avoid git syncing with instantiate proxied remotes
It didn't work. Actually, sync was skipping those remotes due to a bug.
Joey Hess [Sun, 23 Jun 2024 20:38:01 +0000 (16:38 -0400)]
update
Joey Hess [Sun, 23 Jun 2024 20:22:39 +0000 (16:22 -0400)]
upload fanout resume seems free of fenceposts
Tested it with small chunk sizes (like 2) and resumes that were
eg 1 byte from the end of the file or beginning of file.
Also, git-annex testremote passes now against a cluster!
Joey Hess [Sun, 23 Jun 2024 20:01:58 +0000 (16:01 -0400)]
fix comparison
With this a PUT to two remotes that have different partial amounts
transferred works reliably. I'm not sure though that it doesn't have
fencepost errors.
Joey Hess [Sun, 23 Jun 2024 16:48:22 +0000 (12:48 -0400)]
update
Joey Hess [Sun, 23 Jun 2024 16:31:00 +0000 (12:31 -0400)]
update
Joey Hess [Sun, 23 Jun 2024 16:00:50 +0000 (12:00 -0400)]
always check numcopies when moving from cluster
When the destination does not start with a copy, the cluster has one or
more copies. If more, dropping would reduce the number of copies, so
numcopies must be checked.
Considered checking how many nodes of the cluster contain a copy. If
only 1 node does, it could allow a move without checking numcopies.
The problem with that, though, is that other nodes of the cluster could
have copies that we don't know about. And dropping from a cluster tries
to drop from all nodes, so will drop even from those. So any drop from a
cluster can remove more than 1 copy.
Joey Hess [Sun, 23 Jun 2024 14:09:11 +0000 (10:09 -0400)]
todo
Joey Hess [Sun, 23 Jun 2024 13:57:40 +0000 (09:57 -0400)]
don't use SUCCESS-PLUS unncessarily
When dropping from a proxied remote that is not a cluster,
SUCCESS-PLUS is not needed, so don't use it.
Joey Hess [Sun, 23 Jun 2024 13:53:33 +0000 (09:53 -0400)]
fix location log update for copy to 1-node cluster
Joey Hess [Sun, 23 Jun 2024 13:28:18 +0000 (09:28 -0400)]
dropping from clusters
Dropping from a cluster drops from every node of the cluster.
Including nodes that the cluster does not think have the content.
This is different from GET and CHECKPRESENT, which do trust the
cluster's location log. The difference is that removing from a cluster
should make 100% the content is gone from every node. So doing extra
work is ok. Compare with CHECKPRESENT where checking every node could
make it very expensive, and the worst that can happen in a false
negative is extra work being done.
Extended the P2P protocol with FAILURE-PLUS to handle the case where a
drop from one node succeeds, but a drop from another node fails. In that
case the entire cluster drop has failed.
Note that SUCCESS-PLUS is returned when dropping from a proxied remote
that is not a cluster, when the protocol version supports it. This is
because P2P.Proxy does not know when it's proxying for a single node
cluster vs for a remote that is not a cluster.
Joey Hess [Sun, 23 Jun 2024 12:21:11 +0000 (08:21 -0400)]
avoid storing SUCCESS-PLUS uuid when it is the remote uuid
This is slightly belt and suspenders, but nothing guarantees that the
peer avoids including its uuid in the SUCCESS-PLUS list as it's supposed
to. And while it probably doesn't matter if the location log is updated
redundantly, let's not find out.
Joey Hess [Sun, 23 Jun 2024 10:20:11 +0000 (06:20 -0400)]
avoid using cluster nodes in drop proof when dropping from cluster
This is obviously necessary in order for dropping from a cluster to be able to
drop from all nodes.
It also avoids violating numcopies when a cluster node is a special remote.
If it were used in the drop proof, nothing would prevent the cluster from
dropping from it.
Joey Hess [Sun, 23 Jun 2024 09:26:45 +0000 (05:26 -0400)]
update
nobodyinperson [Fri, 21 Jun 2024 16:30:09 +0000 (16:30 +0000)]
Suggest that 'git annex unused' reports total unused size
Joey Hess [Thu, 20 Jun 2024 15:20:26 +0000 (11:20 -0400)]
Merge branch 'master' into proxy
Joey Hess [Thu, 20 Jun 2024 15:20:16 +0000 (11:20 -0400)]
merge from proxy branch
Joey Hess [Thu, 20 Jun 2024 15:03:30 +0000 (11:03 -0400)]
Merge branch 'master' of ssh://git-annex.branchable.com
Joey Hess [Thu, 20 Jun 2024 15:03:19 +0000 (11:03 -0400)]
add my distribits talk
Joey Hess [Thu, 20 Jun 2024 14:57:43 +0000 (10:57 -0400)]
clusters documentation
Joey Hess [Thu, 20 Jun 2024 14:15:24 +0000 (10:15 -0400)]
wording
Joey Hess [Thu, 20 Jun 2024 14:04:26 +0000 (10:04 -0400)]
working PUT fanout to multiple remotes for clusters
Still need to check for fencepost errors on resume when
different nodes have different amounts of data.
joris [Thu, 20 Jun 2024 09:58:05 +0000 (09:58 +0000)]
Added a comment
Joey Hess [Wed, 19 Jun 2024 10:40:19 +0000 (06:40 -0400)]
more on proxying special remotes
Joey Hess [Wed, 19 Jun 2024 10:15:03 +0000 (06:15 -0400)]
towards a design for proxying to special remotes
Joey Hess [Wed, 19 Jun 2024 01:31:32 +0000 (21:31 -0400)]
be quiet when reading cluster and proxy information at startup
I had a transfer of 3 files fail like this:
git-annex: transferrer protocol error: "(recording state in git...)"
The remote had stalldetection enabled, although I didn't see it stall.
So git-annex transferrer would have been started up. I guess that
one of these new git-annex branch reads, that happens early, caused
that message due to perhaps an uncommitted git-annex branch change.
Since the transferrer speaks a protocol over stdout, it needs to be
prevented from outputting other messages to stdout. Interestingly,
startupAnnex is run after prepRunCommand, so if a command requests quiet
output it would already be quiet. But the transferrer does not, instead
it calls Annex.setOutput SerializedOutput in its start action.
Joey Hess [Tue, 18 Jun 2024 21:02:23 +0000 (17:02 -0400)]
allow proxying to remotes that are nodes of clusters
fixes reversion in
ca08f3fcc2ca6d203fa1a323986f7f86bd342e3d
Joey Hess [Tue, 18 Jun 2024 16:07:01 +0000 (12:07 -0400)]
P2P protocol version 2, adding SUCCESS-PLUS and ALREADY-HAVE-PLUS
Client side support for SUCCESS-PLUS and ALREADY-HAVE-PLUS
is complete, when a PUT stores to additional repositories
than the expected on, the location log is updated with the
additional UUIDs that contain the content.
Started implementing PUT fanout to multiple remotes for clusters.
It is untested, and I fear fencepost errors in the relative
offset calculations. And it is missing proxying for the protocol
after DATA.
Joey Hess [Tue, 18 Jun 2024 15:43:10 +0000 (11:43 -0400)]
only proxy to a remote when remote.name.annex-proxy is set
Avoids someone writing to proxy.log and gaining access to remotes
of someone else's repository that they were not intended to be able
to proxy to.
Joey Hess [Tue, 18 Jun 2024 15:37:38 +0000 (11:37 -0400)]
only use a remote as a node when git configuration is set
Avoids someone writing to cluster.log and nominating remotes
of someone else's repository as a cluster.
Joey Hess [Tue, 18 Jun 2024 15:10:48 +0000 (11:10 -0400)]
checkpresent support for clusters
This assumes that the proxy for a cluster has up-to-date location
logs. If it didn't, it might proxy the checkpresent to a node that no
longer has the content, while some other node still does, and so
it would incorrectly appear that the cluster no longer contains the
content.
Since cluster UUIDs are not stored to location logs,
git-annex fsck --fast when claiming to fix a location log when
that occurred would not cause any problems. And presumably the location
tracking would later get sorted out.
At least usually, changes to the content of nodes goes via the proxy,
and it will update its location logs, so they will be accurate. However,
if there were multiple proxies to the same cluster, or nodes were
accessed directly (or via proxy to the node and not the cluster),
the proxy's location log could certainly be wrong.
(The location log access for GET has the same issues.)
Joey Hess [Tue, 18 Jun 2024 15:01:10 +0000 (11:01 -0400)]
initial, working support for getting from clusters
Currently tends to put all the load on a single node, which will need to
be improved.
Joey Hess [Tue, 18 Jun 2024 14:51:37 +0000 (10:51 -0400)]
factor out Annex.Proxy
Joey Hess [Tue, 18 Jun 2024 14:36:04 +0000 (10:36 -0400)]
refactor cluster code into own module
Joey Hess [Tue, 18 Jun 2024 14:08:15 +0000 (10:08 -0400)]
update
yarikoptic [Tue, 18 Jun 2024 13:57:23 +0000 (13:57 +0000)]
original report / question
Joey Hess [Mon, 17 Jun 2024 23:19:15 +0000 (19:19 -0400)]
ProxySelector data type
Joey Hess [Mon, 17 Jun 2024 19:51:10 +0000 (15:51 -0400)]
preparing for cluster node selection
Support selecting what remote to proxy for each top-level P2P protocol
message.
This only needs to be extended now to support fanout to multiple
nodes for PUT and REMOVE, and with a remote that fails for
LOCKCONTENT and UNLOCKCONTENT.
But a good first step would be to implement CHECKPRESENT and GET for
clusters. Both should select a node that actually does have the content.
That will allow a cluster to work for GET even when location tracking is
out of date.
Joey Hess [Mon, 17 Jun 2024 19:00:11 +0000 (15:00 -0400)]
started on git-annex-shell cluster support
Works down to P2P protocol.
The question now is, how to handle protocol version negotiation for
clusters? Connecting to each node to find their protocol versions and
using the lowest would be too expensive with a lot of nodes. So it seems
that the cluster needs to pick its own protocol version to use with the
client.
Then it can either negotiate that same version with the nodes when
it comes time to use them, or it can translate between multiple protocol
versions. That seems complicated. Thinking it would be ok to refuse to
use a node if it is not able to negotiate the same protocol version with
it as with the client. That will mean that sometimes need nodes to be
upgraded when upgrading the cluster's proxy. But protocol versions
rarely change.
Joey Hess [Mon, 17 Jun 2024 18:14:08 +0000 (14:14 -0400)]
work toward supporting proxying to multiple remotes at once
For eg, upload fanout.
Delay connecting to a remote until it's needed. When there are many
proxied remotes, it would not do for the proxy to connect to each of
them on startup; that could take a long time.
Joey Hess [Mon, 17 Jun 2024 17:04:40 +0000 (13:04 -0400)]
more specific type
Joey Hess [Mon, 17 Jun 2024 16:44:08 +0000 (12:44 -0400)]
improve types
Joey Hess [Mon, 17 Jun 2024 13:31:44 +0000 (09:31 -0400)]
update
Joey Hess [Mon, 17 Jun 2024 13:29:34 +0000 (09:29 -0400)]
Merge branch 'master' into proxy
Joey Hess [Mon, 17 Jun 2024 13:26:03 +0000 (09:26 -0400)]
tab complete special remotes
An oversight..
And with the work in progress proxy and cluster, there
can be additional remotes that are not listed in .git/config, but are
available. Making those more discoverable is another big benefit of
this.
Joey Hess [Sun, 16 Jun 2024 19:07:48 +0000 (15:07 -0400)]
don't count clusters as copies, continued
Handled limitCopies, as well as everything using fromNumCopies and
fromMinCopies.
This should be everything, probably.
Note that, git-annex info displays a count of repositories, which still
includes cluster. I think that's ok. It would be possible to filter out
clusters there, but to the user they're pretty much just another
repository. The numcopies displayed by eg `git-annex info .` does not
include clusters.
Joey Hess [Sun, 16 Jun 2024 18:35:07 +0000 (14:35 -0400)]
remove dead nodes when loading the cluster log
This is to avoid inserting a cluster uuid into the location log when
only dead nodes in the cluster contain the content of a key.
One reason why this is necessary is Remote.keyLocations, which excludes
dead repositories from the list. But there are probably many more.
Implementing this was challenging, because Logs.Location importing
Logs.Cluster which imports Logs.Trust which imports Remote.List resulted
in an import cycle through several other modules.
Resorted to making Logs.Location not import Logs.Cluster, and instead
it assumes that Annex.clusters gets populated when necessary before it's
called.
That's done in Annex.Startup, which is run by the git-annex command
(but not other commands) at early startup in initialized repos. Or,
is run after initialization.
Note that is Remote.Git, it is unable to import Annex.Startup, because
Remote.Git importing Logs.Cluster leads the the same import cycle.
So ensureInitialized is not passed annexStartup in there.
Other commands, like git-annex-shell currently don't run annexStartup
either.
So there are cases where Logs.Location will not see clusters. So it won't add
any cluster UUIDs when loading the log. That's ok, the only reason to do
that is to make display of where objects are located include clusters,
and to make commands like git-annex get --from treat keys as being located
in a cluster. git-annex-shell certainly does not do anything like that,
and I'm pretty sure Remote.Git (and callers to Remote.Git.onLocalRepo)
don't either.
Joey Hess [Sun, 16 Jun 2024 15:34:35 +0000 (11:34 -0400)]
don't count clusters as copies
Since the cluster UUID is inserted into the location log when the
location log lists a node as containing content.
Also avoid trying to lock content on cluster remotes. The cluster nodes
are also proxied, so that content can be locked on individual nodes, and
locking content on a cluster as a whole probably won't be implemented.
And made git-annex whereis use numcopies machinery for displaying its
count, so it won't count cluster UUIDs redundantly to nodes.
Other commands, like git-annex info that also display numcopies
information already used the numcopies machinery.
There is more to be done, fromNumCopies is sometimes used to get a
number that is compared with a list of UUIDs. And limitCopies doesn't
use numcopies machinery.
Added a comment
Added a comment: Grafting? a special remote for tuned migration
Joey Hess [Fri, 14 Jun 2024 22:06:28 +0000 (18:06 -0400)]
insert cluster UUIDs when loading location logs, and omit when saving
Inline isClusterUUID for speed.
Joey Hess [Fri, 14 Jun 2024 21:27:34 +0000 (17:27 -0400)]
remove Logs.Presence imports
When imported along with Logs.Location, it can be an unused import and
it won't warn, due to reexports. The point if this is really to show
that Logs.Presence is not widely used, outside Logs/
Joey Hess [Fri, 14 Jun 2024 21:13:23 +0000 (17:13 -0400)]
broke out initcluster
One benefit of this is that a typo in annex-cluster-node config won't
init a new cluster.
Also it gets the cluster description set and is consistent with
initremote.