mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2026-10-25 06:20:42 +01:00
filer: rebuild peer metadata subscriptions after a master reconnect (#10648)
* filer: keep the existing peer subscription on a repeated add A cluster node add for a peer that is already followed restarted the subscription, dropping the metadata events between the two runs. * master: tell a connecting client the current cluster membership Cluster node updates are only broadcast to the clients connected at that moment. A filer that lost its master stream while a peer came back never learned about the peer, and stopped replicating its metadata for good. * test: a filer joining the master learns about the filers already there * test: a filer resubscribes to a peer that registered while it was disconnected Runs the reported sequence against real processes: filer2 leaves, filer1 is paused and its master stream is broken, filer2 registers again, and filer1 has to replicate from it after reconnecting.
This commit is contained in:
1 parent
37f3dff677
commit
3a61debaa5
8 files changed
+432
-3
No files matched your search
@@ -437,6 +437,14 @@ func (ms *MasterServer) KeepConnected(stream master_pb.Seaweed_KeepConnectedServ
|
||||
}
|
||||
}
|
||||
|
||||
// Cluster node changes are only broadcast to the clients connected at that
|
||||
// moment, so a client that reconnects has to be told who is around now.
|
||||
for _, update := range ms.Cluster.ListClusterNodeUpdates(cluster.FilerGroupName(req.FilerGroup), cluster.FilerType) {
|
||||
if sendErr := stream.Send(update); sendErr != nil {
|
||||
return sendErr
|
||||
}
|
||||
}
|
||||
|
||||
if initialLockRingUpdate := ms.initialLockRingUpdate(req.ClientType, req.FilerGroup); initialLockRingUpdate != nil {
|
||||
if sendErr := stream.Send(initialLockRingUpdate); sendErr != nil {
|
||||
return sendErr
|
||||
|
||||
Reference in new issue
Block a user