File tree Expand file tree Collapse file tree 3 files changed +47
-6
lines changed Expand file tree Collapse file tree 3 files changed +47
-6
lines changed Original file line number Diff line number Diff line change @@ -12,6 +12,7 @@ use std::{
12
12
collections:: HashMap ,
13
13
convert:: TryInto ,
14
14
net:: SocketAddr ,
15
+ ops:: Index ,
15
16
result,
16
17
sync:: { Arc , Weak } ,
17
18
} ;
@@ -89,6 +90,21 @@ pub struct MultiNodeCut {
89
90
pub ( crate ) kicked : Arc < [ Member ] > ,
90
91
}
91
92
93
+ impl Index < SocketAddr > for MultiNodeCut {
94
+ type Output = Member ;
95
+
96
+ /// Binary search for the provided `addr`.
97
+ ///
98
+ /// O(log n)
99
+ ///
100
+ /// # Panics
101
+ /// Panics if a member with `addr` doesn't exist in the configuration.
102
+ #[ inline]
103
+ fn index ( & self , addr : SocketAddr ) -> & Self :: Output {
104
+ self . lookup ( addr) . unwrap ( )
105
+ }
106
+ }
107
+
92
108
impl MultiNodeCut {
93
109
/// Returns the number of cuts that were skipped between this and the last received
94
110
/// cut.
@@ -139,6 +155,18 @@ impl MultiNodeCut {
139
155
pub fn kicked ( & self ) -> & Arc < [ Member ] > {
140
156
& self . kicked
141
157
}
158
+
159
+ /// Lookup a specific member in the configuration by socket address.
160
+ ///
161
+ /// Executes in O(log n) time.
162
+ pub fn lookup ( & self , addr : SocketAddr ) -> Option < & Member > {
163
+ let key = |s : SocketAddr | ( s. ip ( ) , s. port ( ) ) ;
164
+
165
+ self . members
166
+ . binary_search_by_key ( & key ( addr) , |m| key ( m. addr ( ) ) )
167
+ . ok ( )
168
+ . map ( |i| & self . members [ i] )
169
+ }
142
170
}
143
171
144
172
/// A cluster member.
Original file line number Diff line number Diff line change @@ -633,14 +633,21 @@ impl<St: partition::Strategy> Cluster<St> {
633
633
634
634
let local_node = self . local_node ( ) ;
635
635
636
+ joined. sort_by_key ( |m| ( m. addr ( ) . ip ( ) , m. addr ( ) . port ( ) ) ) ;
637
+ kicked. sort_by_key ( |m| ( m. addr ( ) . ip ( ) , m. addr ( ) . port ( ) ) ) ;
638
+
639
+ let mut members: Vec < _ > = ( state. nodes . iter ( ) )
640
+ . map ( |node| self . resolve_member ( state, node) . unwrap ( ) )
641
+ . collect ( ) ;
642
+
643
+ members. sort_by_key ( |m| ( m. addr ( ) . ip ( ) , m. addr ( ) . port ( ) ) ) ;
644
+
636
645
let cut = MultiNodeCut {
637
646
skipped : 0 ,
638
647
local_addr : self . addr ,
639
648
degraded : !state. nodes . contains ( & local_node) ,
640
649
conf_id : state. refresh_config ( ) ,
641
- members : ( state. nodes . iter ( ) )
642
- . map ( |node| self . resolve_member ( state, node) . unwrap ( ) )
643
- . collect ( ) ,
650
+ members : members. into ( ) ,
644
651
joined : joined. into ( ) ,
645
652
kicked : kicked. into ( ) ,
646
653
} ;
Original file line number Diff line number Diff line change @@ -186,14 +186,20 @@ impl<St: Strategy> Cluster<St> {
186
186
assert ! ( state. uuids. insert( uuid) ) ;
187
187
}
188
188
189
+ joined. sort_by_key ( |m| ( m. addr ( ) . ip ( ) , m. addr ( ) . port ( ) ) ) ;
190
+
191
+ let mut members: Vec < _ > = ( state. nodes . iter ( ) )
192
+ . map ( |node| self . resolve_member ( & state, node) . unwrap ( ) )
193
+ . collect ( ) ;
194
+
195
+ members. sort_by_key ( |m| ( m. addr ( ) . ip ( ) , m. addr ( ) . port ( ) ) ) ;
196
+
189
197
let cut = MultiNodeCut {
190
198
skipped : 0 ,
191
199
local_addr : self . addr ,
192
200
degraded : !state. nodes . contains ( & self . local_node ( ) ) ,
193
201
conf_id : state. refresh_config ( ) ,
194
- members : ( state. nodes . iter ( ) )
195
- . map ( |node| self . resolve_member ( & state, node) . unwrap ( ) )
196
- . collect ( ) ,
202
+ members : members. into ( ) ,
197
203
joined : joined. into ( ) ,
198
204
kicked : vec ! [ ] . into ( ) ,
199
205
} ;
You can’t perform that action at this time.
0 commit comments