7
7
package description
8
8
9
9
import (
10
- "sort"
11
- "strings"
12
-
13
10
"go.mongodb.org/mongo-driver/x/mongo/driver/address"
14
11
)
15
12
@@ -41,39 +38,24 @@ type TopologyDiff struct {
41
38
func DiffTopology (old , new Topology ) TopologyDiff {
42
39
var diff TopologyDiff
43
40
44
- // TODO: do this without sorting...
45
- oldServers := serverSorter (old .Servers )
46
- newServers := serverSorter (new .Servers )
47
-
48
- sort .Sort (oldServers )
49
- sort .Sort (newServers )
50
-
51
- i := 0
52
- j := 0
53
- for {
54
- if i < len (oldServers ) && j < len (newServers ) {
55
- comp := strings .Compare (oldServers [i ].Addr .String (), newServers [j ].Addr .String ())
56
- switch comp {
57
- case 1 :
58
- //left is bigger than
59
- diff .Added = append (diff .Added , newServers [j ])
60
- j ++
61
- case - 1 :
62
- // right is bigger
63
- diff .Removed = append (diff .Removed , oldServers [i ])
64
- i ++
65
- case 0 :
66
- i ++
67
- j ++
68
- }
69
- } else if i < len (oldServers ) {
70
- diff .Removed = append (diff .Removed , oldServers [i ])
71
- i ++
72
- } else if j < len (newServers ) {
73
- diff .Added = append (diff .Added , newServers [j ])
74
- j ++
41
+ oldServers := make (map [string ]bool )
42
+ for _ , s := range old .Servers {
43
+ oldServers [s .Addr .String ()] = true
44
+ }
45
+
46
+ for _ , s := range new .Servers {
47
+ addr := s .Addr .String ()
48
+ if oldServers [addr ] {
49
+ delete (oldServers , addr )
75
50
} else {
76
- break
51
+ diff .Added = append (diff .Added , s )
52
+ }
53
+ }
54
+
55
+ for _ , s := range old .Servers {
56
+ addr := s .Addr .String ()
57
+ if oldServers [addr ] {
58
+ diff .Removed = append (diff .Removed , s )
77
59
}
78
60
}
79
61
@@ -90,47 +72,22 @@ type HostlistDiff struct {
90
72
func (t Topology ) DiffHostlist (hostlist []string ) HostlistDiff {
91
73
var diff HostlistDiff
92
74
93
- oldServers := serverSorter (t .Servers )
94
- sort .Sort (oldServers )
95
- sort .Strings (hostlist )
96
-
97
- i := 0
98
- j := 0
99
- for {
100
- if i < len (oldServers ) && j < len (hostlist ) {
101
- oldServer := oldServers [i ].Addr .String ()
102
- comp := strings .Compare (oldServer , hostlist [j ])
103
- switch comp {
104
- case 1 :
105
- // oldServers[i] is bigger
106
- diff .Added = append (diff .Added , hostlist [j ])
107
- j ++
108
- case - 1 :
109
- // hostlist[j] is bigger
110
- diff .Removed = append (diff .Removed , oldServer )
111
- i ++
112
- case 0 :
113
- i ++
114
- j ++
115
- }
116
- } else if i < len (oldServers ) {
117
- diff .Removed = append (diff .Removed , oldServers [i ].Addr .String ())
118
- i ++
119
- } else if j < len (hostlist ) {
120
- diff .Added = append (diff .Added , hostlist [j ])
121
- j ++
75
+ oldServers := make (map [string ]bool )
76
+ for _ , s := range t .Servers {
77
+ oldServers [s .Addr .String ()] = true
78
+ }
79
+
80
+ for _ , addr := range hostlist {
81
+ if oldServers [addr ] {
82
+ delete (oldServers , addr )
122
83
} else {
123
- break
84
+ diff . Added = append ( diff . Added , addr )
124
85
}
125
86
}
126
87
127
- return diff
128
- }
129
-
130
- type serverSorter []Server
88
+ for addr := range oldServers {
89
+ diff .Removed = append (diff .Removed , addr )
90
+ }
131
91
132
- func (ss serverSorter ) Len () int { return len (ss ) }
133
- func (ss serverSorter ) Swap (i , j int ) { ss [i ], ss [j ] = ss [j ], ss [i ] }
134
- func (ss serverSorter ) Less (i , j int ) bool {
135
- return strings .Compare (ss [i ].Addr .String (), ss [j ].Addr .String ()) < 0
92
+ return diff
136
93
}
0 commit comments