diff options
Diffstat (limited to 'src/mongo/gotools/src/github.com/mongodb/mongo-tools/vendor/go.mongodb.org/mongo-driver/x/mongo/driver/description/topology.go')
-rw-r--r-- | src/mongo/gotools/src/github.com/mongodb/mongo-tools/vendor/go.mongodb.org/mongo-driver/x/mongo/driver/description/topology.go | 103 |
1 files changed, 30 insertions, 73 deletions
diff --git a/src/mongo/gotools/src/github.com/mongodb/mongo-tools/vendor/go.mongodb.org/mongo-driver/x/mongo/driver/description/topology.go b/src/mongo/gotools/src/github.com/mongodb/mongo-tools/vendor/go.mongodb.org/mongo-driver/x/mongo/driver/description/topology.go index 07454711511..b6f4e3ea31d 100644 --- a/src/mongo/gotools/src/github.com/mongodb/mongo-tools/vendor/go.mongodb.org/mongo-driver/x/mongo/driver/description/topology.go +++ b/src/mongo/gotools/src/github.com/mongodb/mongo-tools/vendor/go.mongodb.org/mongo-driver/x/mongo/driver/description/topology.go @@ -7,9 +7,6 @@ package description import ( - "sort" - "strings" - "go.mongodb.org/mongo-driver/x/mongo/driver/address" ) @@ -41,39 +38,24 @@ type TopologyDiff struct { func DiffTopology(old, new Topology) TopologyDiff { var diff TopologyDiff - // TODO: do this without sorting... - oldServers := serverSorter(old.Servers) - newServers := serverSorter(new.Servers) - - sort.Sort(oldServers) - sort.Sort(newServers) - - i := 0 - j := 0 - for { - if i < len(oldServers) && j < len(newServers) { - comp := strings.Compare(oldServers[i].Addr.String(), newServers[j].Addr.String()) - switch comp { - case 1: - //left is bigger than - diff.Added = append(diff.Added, newServers[j]) - j++ - case -1: - // right is bigger - diff.Removed = append(diff.Removed, oldServers[i]) - i++ - case 0: - i++ - j++ - } - } else if i < len(oldServers) { - diff.Removed = append(diff.Removed, oldServers[i]) - i++ - } else if j < len(newServers) { - diff.Added = append(diff.Added, newServers[j]) - j++ + oldServers := make(map[string]bool) + for _, s := range old.Servers { + oldServers[s.Addr.String()] = true + } + + for _, s := range new.Servers { + addr := s.Addr.String() + if oldServers[addr] { + delete(oldServers, addr) } else { - break + diff.Added = append(diff.Added, s) + } + } + + for _, s := range old.Servers { + addr := s.Addr.String() + if oldServers[addr] { + diff.Removed = append(diff.Removed, s) } } @@ -90,47 +72,22 @@ type HostlistDiff struct { func (t Topology) DiffHostlist(hostlist []string) HostlistDiff { var diff HostlistDiff - oldServers := serverSorter(t.Servers) - sort.Sort(oldServers) - sort.Strings(hostlist) - - i := 0 - j := 0 - for { - if i < len(oldServers) && j < len(hostlist) { - oldServer := oldServers[i].Addr.String() - comp := strings.Compare(oldServer, hostlist[j]) - switch comp { - case 1: - // oldServers[i] is bigger - diff.Added = append(diff.Added, hostlist[j]) - j++ - case -1: - // hostlist[j] is bigger - diff.Removed = append(diff.Removed, oldServer) - i++ - case 0: - i++ - j++ - } - } else if i < len(oldServers) { - diff.Removed = append(diff.Removed, oldServers[i].Addr.String()) - i++ - } else if j < len(hostlist) { - diff.Added = append(diff.Added, hostlist[j]) - j++ + oldServers := make(map[string]bool) + for _, s := range t.Servers { + oldServers[s.Addr.String()] = true + } + + for _, addr := range hostlist { + if oldServers[addr] { + delete(oldServers, addr) } else { - break + diff.Added = append(diff.Added, addr) } } - return diff -} - -type serverSorter []Server + for addr := range oldServers { + diff.Removed = append(diff.Removed, addr) + } -func (ss serverSorter) Len() int { return len(ss) } -func (ss serverSorter) Swap(i, j int) { ss[i], ss[j] = ss[j], ss[i] } -func (ss serverSorter) Less(i, j int) bool { - return strings.Compare(ss[i].Addr.String(), ss[j].Addr.String()) < 0 + return diff } |