1515 * limitations under the License.
1616 */
1717use std:: collections:: HashMap ;
18+ use std:: collections:: HashSet ;
1819use std:: sync:: atomic:: AtomicI64 ;
1920use std:: sync:: Arc ;
2021
@@ -34,7 +35,7 @@ lazy_static! {
3435 } ;
3536}
3637
37- type MessageQueueLockTable = HashMap < String , HashMap < Arc < MessageQueue > , LockEntry > > ;
38+ type MessageQueueLockTable = HashMap < String , HashMap < MessageQueue , LockEntry > > ;
3839
3940#[ derive( Clone , Default ) ]
4041pub struct RebalanceLockManager {
@@ -60,26 +61,25 @@ impl RebalanceLockManager {
6061 pub fn try_lock_batch (
6162 & self ,
6263 group : & str ,
63- mqs : Vec < Arc < MessageQueue > > ,
64+ mqs : & HashSet < MessageQueue > ,
6465 client_id : & str ,
65- ) -> Vec < Arc < MessageQueue > > {
66- let mut lock_mqs = Vec :: new ( ) ;
67- let mut not_locked_mqs = Vec :: new ( ) ;
66+ ) -> HashSet < MessageQueue > {
67+ let mut lock_mqs = HashSet :: with_capacity ( mqs . len ( ) ) ;
68+ let mut not_locked_mqs = HashSet :: with_capacity ( mqs . len ( ) ) ;
6869 for mq in mqs. iter ( ) {
6970 if self . is_locked ( group, mq, client_id) {
70- lock_mqs. push ( mq. clone ( ) ) ;
71+ lock_mqs. insert ( mq. clone ( ) ) ;
7172 } else {
72- not_locked_mqs. push ( mq. clone ( ) ) ;
73+ not_locked_mqs. insert ( mq. clone ( ) ) ;
7374 }
7475 }
7576 if !not_locked_mqs. is_empty ( ) {
7677 let mut write_guard = self . mq_lock_table . write ( ) ;
77- let mut group_value = write_guard. get_mut ( group) ;
78- if group_value. is_none ( ) {
79- group_value = Some ( write_guard. entry ( group. to_string ( ) ) . or_default ( ) ) ;
80- }
81- let group_value = group_value. unwrap ( ) ;
82- for mq in not_locked_mqs. iter ( ) {
78+ let group_value = write_guard
79+ . entry ( group. to_string ( ) )
80+ . or_insert ( HashMap :: with_capacity ( 32 ) ) ;
81+
82+ for mq in not_locked_mqs {
8383 let lock_entry = group_value. entry ( mq. clone ( ) ) . or_insert_with ( || {
8484 info ! (
8585 "RebalanceLockManager#tryLockBatch: lock a message which has not been \
@@ -96,7 +96,7 @@ impl RebalanceLockManager {
9696 get_current_millis ( ) as i64 ,
9797 std:: sync:: atomic:: Ordering :: Relaxed ,
9898 ) ;
99- lock_mqs. push ( mq. clone ( ) ) ;
99+ lock_mqs. insert ( mq) ;
100100 continue ;
101101 }
102102 let old_client_id = lock_entry. client_id . as_str ( ) . to_string ( ) ;
@@ -106,12 +106,12 @@ impl RebalanceLockManager {
106106 get_current_millis ( ) as i64 ,
107107 std:: sync:: atomic:: Ordering :: Relaxed ,
108108 ) ;
109- lock_mqs. push ( mq. clone ( ) ) ;
110109 warn ! (
111110 "RebalanceLockManager#tryLockBatch: try to lock a expired message queue, \
112111 group={} mq={:?}, old client id={}, new client id={}",
113112 group, mq, old_client_id, client_id
114113 ) ;
114+ lock_mqs. insert ( mq) ;
115115 continue ;
116116 }
117117 warn ! (
@@ -124,7 +124,7 @@ impl RebalanceLockManager {
124124 lock_mqs
125125 }
126126
127- pub fn unlock_batch ( & self , group : & str , mqs : Vec < Arc < MessageQueue > > , client_id : & str ) {
127+ pub fn unlock_batch ( & self , group : & str , mqs : & HashSet < MessageQueue > , client_id : & str ) {
128128 let mut write_guard = self . mq_lock_table . write ( ) ;
129129 let group_value = write_guard. get_mut ( group) ;
130130 if group_value. is_none ( ) {
@@ -163,7 +163,7 @@ impl RebalanceLockManager {
163163 }
164164 }
165165
166- fn is_locked ( & self , group : & str , mq : & Arc < MessageQueue > , client_id : & str ) -> bool {
166+ fn is_locked ( & self , group : & str , mq : & MessageQueue , client_id : & str ) -> bool {
167167 let lock_table = self . mq_lock_table . read ( ) ;
168168 let group_value = lock_table. get ( group) ;
169169 if group_value. is_none ( ) {
@@ -231,59 +231,71 @@ mod rebalance_lock_manager_tests {
231231 #[ test]
232232 fn lock_all_expired_returns_false_when_active_locks_exist ( ) {
233233 let manager = RebalanceLockManager :: default ( ) ;
234- let mq = Arc :: new ( MessageQueue :: default ( ) ) ;
235- manager. try_lock_batch ( "test_group" , vec ! [ mq. clone( ) ] , "client_1" ) ;
234+ let mq = MessageQueue :: default ( ) ;
235+ let mut set = HashSet :: new ( ) ;
236+ set. insert ( mq. clone ( ) ) ;
237+ manager. try_lock_batch ( "test_group" , & set, "client_1" ) ;
236238 assert ! ( !manager. is_lock_all_expired( "test_group" ) ) ;
237239 }
238240
239241 #[ test]
240242 fn try_lock_batch_locks_message_queues_for_new_group ( ) {
241243 let manager = RebalanceLockManager :: default ( ) ;
242- let mq = Arc :: new ( MessageQueue :: default ( ) ) ;
243- let locked_mqs = manager. try_lock_batch ( "test_group" , vec ! [ mq. clone( ) ] , "client_1" ) ;
244+ let mq = MessageQueue :: default ( ) ;
245+ let mut set = HashSet :: new ( ) ;
246+ set. insert ( mq. clone ( ) ) ;
247+ let locked_mqs = manager. try_lock_batch ( "test_group" , & set, "client_1" ) ;
244248 assert_eq ! ( locked_mqs. len( ) , 1 ) ;
245249 }
246250
247251 #[ test]
248252 fn try_lock_batch_does_not_lock_already_locked_message_queues ( ) {
249253 let manager = RebalanceLockManager :: default ( ) ;
250- let mq = Arc :: new ( MessageQueue :: default ( ) ) ;
251- manager. try_lock_batch ( "test_group" , vec ! [ mq. clone( ) ] , "client_1" ) ;
252- let locked_mqs = manager. try_lock_batch ( "test_group" , vec ! [ mq. clone( ) ] , "client_2" ) ;
254+ let mq = MessageQueue :: default ( ) ;
255+ let mut set = HashSet :: new ( ) ;
256+ set. insert ( mq. clone ( ) ) ;
257+ manager. try_lock_batch ( "test_group" , & set, "client_1" ) ;
258+ let locked_mqs = manager. try_lock_batch ( "test_group" , & set, "client_2" ) ;
253259 assert ! ( locked_mqs. is_empty( ) ) ;
254260 }
255261
256262 #[ test]
257263 fn unlock_batch_unlocks_message_queues_locked_by_client ( ) {
258264 let manager = RebalanceLockManager :: default ( ) ;
259- let mq = Arc :: new ( MessageQueue :: default ( ) ) ;
260- manager. try_lock_batch ( "test_group" , vec ! [ mq. clone( ) ] , "client_1" ) ;
261- manager. unlock_batch ( "test_group" , vec ! [ mq. clone( ) ] , "client_1" ) ;
262- let locked_mqs = manager. try_lock_batch ( "test_group" , vec ! [ mq. clone( ) ] , "client_2" ) ;
265+ let mq = MessageQueue :: default ( ) ;
266+ let mut set = HashSet :: new ( ) ;
267+ set. insert ( mq. clone ( ) ) ;
268+ manager. try_lock_batch ( "test_group" , & set, "client_1" ) ;
269+ manager. unlock_batch ( "test_group" , & set, "client_1" ) ;
270+ let locked_mqs = manager. try_lock_batch ( "test_group" , & set, "client_2" ) ;
263271 assert_eq ! ( locked_mqs. len( ) , 1 ) ;
264272 }
265273
266274 #[ test]
267275 fn unlock_batch_does_not_unlock_message_queues_locked_by_other_clients ( ) {
268276 let manager = RebalanceLockManager :: default ( ) ;
269- let mq = Arc :: new ( MessageQueue :: default ( ) ) ;
270- manager. try_lock_batch ( "test_group" , vec ! [ mq. clone( ) ] , "client_1" ) ;
271- manager. unlock_batch ( "test_group" , vec ! [ mq. clone( ) ] , "client_2" ) ;
277+ let mq = MessageQueue :: default ( ) ;
278+ let mut set = HashSet :: new ( ) ;
279+ set. insert ( mq. clone ( ) ) ;
280+ manager. try_lock_batch ( "test_group" , & set, "client_1" ) ;
281+ manager. unlock_batch ( "test_group" , & set, "client_2" ) ;
272282 assert ! ( !manager. is_lock_all_expired( "test_group" ) ) ;
273283 }
274284
275285 #[ test]
276286 fn is_locked_returns_true_for_locked_message_queue ( ) {
277287 let manager = RebalanceLockManager :: default ( ) ;
278- let mq = Arc :: new ( MessageQueue :: default ( ) ) ;
279- manager. try_lock_batch ( "test_group" , vec ! [ mq. clone( ) ] , "client_1" ) ;
288+ let mq = MessageQueue :: default ( ) ;
289+ let mut set = HashSet :: new ( ) ;
290+ set. insert ( mq. clone ( ) ) ;
291+ manager. try_lock_batch ( "test_group" , & set, "client_1" ) ;
280292 assert ! ( manager. is_locked( "test_group" , & mq, "client_1" ) ) ;
281293 }
282294
283295 #[ test]
284296 fn is_locked_returns_false_for_unlocked_message_queue ( ) {
285297 let manager = RebalanceLockManager :: default ( ) ;
286- let mq = Arc :: new ( MessageQueue :: default ( ) ) ;
298+ let mq = MessageQueue :: default ( ) ;
287299 assert ! ( !manager. is_locked( "test_group" , & mq, "client_1" ) ) ;
288300 }
289301}
0 commit comments