@@ -15,6 +15,7 @@ use std::{
1515} ;
1616
1717use crossbeam_channel:: { select, tick} ;
18+ use dashmap:: DashMap ;
1819use derive_more:: Deref ;
1920use lazy_static:: lazy_static;
2021use openssl:: {
@@ -78,7 +79,7 @@ pub struct MountsRouter {
7879 pub barrier : Arc < dyn SecurityBarrier > ,
7980 pub barrier_prefix : String ,
8081 pub router_prefix : String ,
81- pub backends : Mutex < HashMap < String , Arc < LogicalBackendNewFunc > > > ,
82+ pub backends : DashMap < String , Arc < LogicalBackendNewFunc > > ,
8283}
8384
8485#[ derive( Debug , Clone , Default , PartialEq , Serialize , Deserialize ) ]
@@ -118,7 +119,7 @@ impl MountsRouter {
118119 barrier,
119120 barrier_prefix : barrier_prefix. to_string ( ) ,
120121 router_prefix : router_prefix. to_string ( ) ,
121- backends : Mutex :: new ( HashMap :: new ( ) ) ,
122+ backends : DashMap :: new ( ) ,
122123 }
123124 }
124125
@@ -150,26 +151,25 @@ impl MountsRouter {
150151 }
151152
152153 pub fn get_backend ( & self , logical_type : & str ) -> Result < Arc < LogicalBackendNewFunc > , RvError > {
153- let backends = self . backends . lock ( ) . unwrap ( ) ;
154- if let Some ( backend) = backends. get ( logical_type) {
154+ if let Some ( backend) = self . backends . get ( logical_type) {
155155 Ok ( backend. clone ( ) )
156156 } else {
157157 Err ( RvError :: ErrCoreLogicalBackendNoExist )
158158 }
159159 }
160160
161161 pub fn add_backend ( & self , logical_type : & str , backend : Arc < LogicalBackendNewFunc > ) -> Result < ( ) , RvError > {
162- let mut backends = self . backends . lock ( ) . unwrap ( ) ;
163- if backends. contains_key ( logical_type) {
162+ let result = self . backends . entry ( logical_type. to_string ( ) ) . or_try_insert_with ( || Ok :: < _ , ( ) > ( backend) ) ;
163+
164+ if result. is_err ( ) {
164165 return Err ( RvError :: ErrCoreLogicalBackendExist ) ;
165166 }
166- backends . insert ( logical_type . to_string ( ) , backend ) ;
167+
167168 Ok ( ( ) )
168169 }
169170
170171 pub fn delete_backend ( & self , logical_type : & str ) -> Result < ( ) , RvError > {
171- let mut backends = self . backends . lock ( ) . unwrap ( ) ;
172- backends. remove ( logical_type) ;
172+ self . backends . remove ( logical_type) ;
173173 Ok ( ( ) )
174174 }
175175}
0 commit comments