blob: caf447d27ee50351b1b414af3b93f6aef99b02e6 [file] [log] [blame]
Don Newton379ae252019-04-01 12:17:06 -04001// Copyright (C) MongoDB, Inc. 2017-present.
2//
3// Licensed under the Apache License, Version 2.0 (the "License"); you may
4// not use this file except in compliance with the License. You may obtain
5// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
6
7package description
8
9import (
10 "sort"
11 "strings"
12
13 "github.com/mongodb/mongo-go-driver/x/network/address"
14)
15
16// Topology represents a description of a mongodb topology
17type Topology struct {
18 Servers []Server
19 Kind TopologyKind
20 SessionTimeoutMinutes uint32
21}
22
23// Server returns the server for the given address. Returns false if the server
24// could not be found.
25func (t Topology) Server(addr address.Address) (Server, bool) {
26 for _, server := range t.Servers {
27 if server.Addr.String() == addr.String() {
28 return server, true
29 }
30 }
31 return Server{}, false
32}
33
34// TopologyDiff is the difference between two different topology descriptions.
35type TopologyDiff struct {
36 Added []Server
37 Removed []Server
38}
39
40// DiffTopology compares the two topology descriptions and returns the difference.
41func DiffTopology(old, new Topology) TopologyDiff {
42 var diff TopologyDiff
43
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++
75 } else {
76 break
77 }
78 }
79
80 return diff
81}
82
83type serverSorter []Server
84
85func (ss serverSorter) Len() int { return len(ss) }
86func (ss serverSorter) Swap(i, j int) { ss[i], ss[j] = ss[j], ss[i] }
87func (ss serverSorter) Less(i, j int) bool {
88 return strings.Compare(ss[i].Addr.String(), ss[j].Addr.String()) < 0
89}