installServers builds the new server map from diff.keep and the connected list, falling back to diff.prev when a connect failed. Returns old entries replaced by successful connects (caller closes them). Acquires and releases m.mu.
( wanted map[string]ServerConfig, diff *serverDiff, connected []connectedServer, snap map[string]fileSnapshot, )
| 659 | // Returns old entries replaced by successful connects (caller |
| 660 | // closes them). Acquires and releases m.mu. |
| 661 | func (m *Manager) installServers( |
| 662 | wanted map[string]ServerConfig, |
| 663 | diff *serverDiff, |
| 664 | connected []connectedServer, |
| 665 | snap map[string]fileSnapshot, |
| 666 | ) ([]*serverEntry, error) { |
| 667 | m.mu.Lock() |
| 668 | defer m.mu.Unlock() |
| 669 | |
| 670 | if m.closed { |
| 671 | for _, cs := range connected { |
| 672 | _ = cs.client.Close() |
| 673 | } |
| 674 | return nil, ErrManagerClosed |
| 675 | } |
| 676 | |
| 677 | newConnected := make(map[string]connectedServer, len(connected)) |
| 678 | for _, cs := range connected { |
| 679 | newConnected[cs.name] = cs |
| 680 | } |
| 681 | |
| 682 | newServers := make(map[string]*serverEntry, len(wanted)) |
| 683 | for name, entry := range diff.keep { |
| 684 | newServers[name] = entry |
| 685 | } |
| 686 | |
| 687 | var replaced []*serverEntry |
| 688 | for name, wantCfg := range wanted { |
| 689 | if _, kept := diff.keep[name]; kept { |
| 690 | continue |
| 691 | } |
| 692 | if cs, ok := newConnected[wantCfg.Name]; ok { |
| 693 | newServers[wantCfg.Name] = &serverEntry{ |
| 694 | config: cs.config, |
| 695 | client: cs.client, |
| 696 | } |
| 697 | if prev, existed := diff.prev[wantCfg.Name]; existed { |
| 698 | replaced = append(replaced, prev) |
| 699 | } |
| 700 | } else if prev, existed := diff.prev[wantCfg.Name]; existed { |
| 701 | // Connect failed; retain the old client. |
| 702 | newServers[wantCfg.Name] = prev |
| 703 | } |
| 704 | } |
| 705 | |
| 706 | m.servers = newServers |
| 707 | m.serverGen++ |
| 708 | m.snapshot = snap |
| 709 | return replaced, nil |
| 710 | } |
| 711 | |
| 712 | // captureSnapshot stats each path and returns the current |
| 713 | // snapshot map. |