1515
1616*/
1717
18- //! Block import queue implementation
18+ //! Import queue implementation
1919
2020#[ cfg( feature = "sgx" ) ]
2121use std:: sync:: SgxRwLock as RwLock ;
@@ -25,64 +25,64 @@ use std::sync::RwLock;
2525
2626use crate :: {
2727 error:: { Error , Result } ,
28- PeekBlockQueue , PopFromBlockQueue , PushToBlockQueue ,
28+ PeekQueue , PopFromQueue , PushToQueue ,
2929} ;
3030use std:: { collections:: VecDeque , vec:: Vec } ;
3131
32- /// Block import queue.
32+ /// Any import queue.
3333///
3434/// Uses RwLock internally to guard against concurrent access and ensure all operations are atomic.
35- pub struct BlockImportQueue < SignedBlock > {
36- queue : RwLock < VecDeque < SignedBlock > > ,
35+ pub struct ImportQueue < Item > {
36+ queue : RwLock < VecDeque < Item > > ,
3737}
3838
39- impl < SignedBlock > BlockImportQueue < SignedBlock > {
39+ impl < Item > ImportQueue < Item > {
4040 pub fn is_empty ( & self ) -> Result < bool > {
4141 let queue_lock = self . queue . read ( ) . map_err ( |_| Error :: PoisonedLock ) ?;
4242 Ok ( queue_lock. is_empty ( ) )
4343 }
4444}
4545
46- impl < SignedBlock > Default for BlockImportQueue < SignedBlock > {
46+ impl < Item > Default for ImportQueue < Item > {
4747 fn default ( ) -> Self {
48- BlockImportQueue { queue : Default :: default ( ) }
48+ ImportQueue { queue : Default :: default ( ) }
4949 }
5050}
5151
52- impl < SignedBlock > PushToBlockQueue < SignedBlock > for BlockImportQueue < SignedBlock > {
53- fn push_multiple ( & self , blocks : Vec < SignedBlock > ) -> Result < ( ) > {
52+ impl < Item > PushToQueue < Item > for ImportQueue < Item > {
53+ fn push_multiple ( & self , items : Vec < Item > ) -> Result < ( ) > {
5454 let mut queue_lock = self . queue . write ( ) . map_err ( |_| Error :: PoisonedLock ) ?;
55- queue_lock. extend ( blocks ) ;
55+ queue_lock. extend ( items ) ;
5656 Ok ( ( ) )
5757 }
5858
59- fn push_single ( & self , block : SignedBlock ) -> Result < ( ) > {
59+ fn push_single ( & self , item : Item ) -> Result < ( ) > {
6060 let mut queue_lock = self . queue . write ( ) . map_err ( |_| Error :: PoisonedLock ) ?;
61- queue_lock. push_back ( block ) ;
61+ queue_lock. push_back ( item ) ;
6262 Ok ( ( ) )
6363 }
6464}
6565
66- impl < SignedBlock > PopFromBlockQueue for BlockImportQueue < SignedBlock > {
67- type BlockType = SignedBlock ;
66+ impl < Item > PopFromQueue for ImportQueue < Item > {
67+ type ItemType = Item ;
6868
69- fn pop_all_but_last ( & self ) -> Result < Vec < SignedBlock > > {
69+ fn pop_all_but_last ( & self ) -> Result < Vec < Item > > {
7070 let mut queue_lock = self . queue . write ( ) . map_err ( |_| Error :: PoisonedLock ) ?;
7171 let queue_length = queue_lock. len ( ) ;
7272 if queue_length < 2 {
73- return Ok ( Vec :: < SignedBlock > :: default ( ) )
73+ return Ok ( Vec :: < Item > :: default ( ) )
7474 }
7575 Ok ( queue_lock. drain ( ..queue_length - 1 ) . collect :: < Vec < _ > > ( ) )
7676 }
7777
78- fn pop_all ( & self ) -> Result < Vec < SignedBlock > > {
78+ fn pop_all ( & self ) -> Result < Vec < Item > > {
7979 let mut queue_lock = self . queue . write ( ) . map_err ( |_| Error :: PoisonedLock ) ?;
8080 Ok ( queue_lock. drain ( ..) . collect :: < Vec < _ > > ( ) )
8181 }
8282
83- fn pop_until < Predicate > ( & self , predicate : Predicate ) -> Result < Vec < Self :: BlockType > >
83+ fn pop_until < Predicate > ( & self , predicate : Predicate ) -> Result < Vec < Self :: ItemType > >
8484 where
85- Predicate : FnMut ( & Self :: BlockType ) -> bool ,
85+ Predicate : FnMut ( & Self :: ItemType ) -> bool ,
8686 {
8787 let mut queue_lock = self . queue . write ( ) . map_err ( |_| Error :: PoisonedLock ) ?;
8888 match queue_lock. iter ( ) . position ( predicate) {
@@ -91,28 +91,38 @@ impl<SignedBlock> PopFromBlockQueue for BlockImportQueue<SignedBlock> {
9191 }
9292 }
9393
94- fn pop_front ( & self ) -> Result < Option < Self :: BlockType > > {
94+ fn pop_front ( & self ) -> Result < Option < Self :: ItemType > > {
9595 let mut queue_lock = self . queue . write ( ) . map_err ( |_| Error :: PoisonedLock ) ?;
9696 Ok ( queue_lock. pop_front ( ) )
9797 }
98+
99+ fn pop_from_front_until ( & self , amount : usize ) -> Result < Vec < Self :: ItemType > > {
100+ let mut queue_lock = self . queue . write ( ) . map_err ( |_| Error :: PoisonedLock ) ?;
101+ if amount > queue_lock. len ( ) {
102+ return Err ( Error :: Other (
103+ "Cannot Pop more items from the queue than are available" . into ( ) ,
104+ ) )
105+ }
106+ Ok ( queue_lock. drain ( ..amount) . collect :: < Vec < _ > > ( ) )
107+ }
98108}
99109
100- impl < SignedBlock > PeekBlockQueue for BlockImportQueue < SignedBlock >
110+ impl < Item > PeekQueue for ImportQueue < Item >
101111where
102- SignedBlock : Clone ,
112+ Item : Clone ,
103113{
104- type BlockType = SignedBlock ;
114+ type ItemType = Item ;
105115
106- fn peek_find < Predicate > ( & self , predicate : Predicate ) -> Result < Option < Self :: BlockType > >
116+ fn peek_find < Predicate > ( & self , predicate : Predicate ) -> Result < Option < Self :: ItemType > >
107117 where
108- Predicate : Fn ( & Self :: BlockType ) -> bool ,
118+ Predicate : Fn ( & Self :: ItemType ) -> bool ,
109119 {
110120 let queue_lock = self . queue . read ( ) . map_err ( |_| Error :: PoisonedLock ) ?;
111- let maybe_block = queue_lock. iter ( ) . find ( |& b| predicate ( b) ) ;
112- Ok ( maybe_block . cloned ( ) )
121+ let maybe_item = queue_lock. iter ( ) . find ( |& b| predicate ( b) ) ;
122+ Ok ( maybe_item . cloned ( ) )
113123 }
114124
115- fn peek_last ( & self ) -> Result < Option < Self :: BlockType > > {
125+ fn peek_last ( & self ) -> Result < Option < Self :: ItemType > > {
116126 let queue_lock = self . queue . read ( ) . map_err ( |_| Error :: PoisonedLock ) ?;
117127 Ok ( queue_lock. back ( ) . cloned ( ) )
118128 }
@@ -132,26 +142,26 @@ mod tests {
132142
133143 #[ test]
134144 fn default_queue_is_empty ( ) {
135- let queue = BlockImportQueue :: < TestBlock > :: default ( ) ;
145+ let queue = ImportQueue :: < TestBlock > :: default ( ) ;
136146 assert ! ( queue. is_empty( ) . unwrap( ) ) ;
137147 }
138148
139149 #[ test]
140150 fn pop_all_on_default_returns_empty_vec ( ) {
141- let queue = BlockImportQueue :: < TestBlock > :: default ( ) ;
151+ let queue = ImportQueue :: < TestBlock > :: default ( ) ;
142152 assert ! ( queue. pop_all( ) . unwrap( ) . is_empty( ) ) ;
143153 }
144154
145155 #[ test]
146156 fn after_inserting_queue_is_not_empty ( ) {
147- let queue = BlockImportQueue :: < TestBlock > :: default ( ) ;
157+ let queue = ImportQueue :: < TestBlock > :: default ( ) ;
148158 queue. push_single ( TestBlock :: default ( ) ) . unwrap ( ) ;
149159 assert ! ( !queue. is_empty( ) . unwrap( ) ) ;
150160 }
151161
152162 #[ test]
153163 fn pop_all_after_inserting_leaves_empty_queue ( ) {
154- let queue = BlockImportQueue :: < TestBlock > :: default ( ) ;
164+ let queue = ImportQueue :: < TestBlock > :: default ( ) ;
155165 queue
156166 . push_multiple ( vec ! [ TestBlock :: default ( ) , TestBlock :: default ( ) , TestBlock :: default ( ) ] )
157167 . unwrap ( ) ;
@@ -163,20 +173,20 @@ mod tests {
163173
164174 #[ test]
165175 fn pop_all_except_last_on_default_returns_empty_vec ( ) {
166- let queue = BlockImportQueue :: < TestBlock > :: default ( ) ;
176+ let queue = ImportQueue :: < TestBlock > :: default ( ) ;
167177 assert ! ( queue. pop_all_but_last( ) . unwrap( ) . is_empty( ) ) ;
168178 }
169179
170180 #[ test]
171181 fn pop_all_except_last_with_single_element_returns_empty_vec ( ) {
172- let queue = BlockImportQueue :: < TestBlock > :: default ( ) ;
182+ let queue = ImportQueue :: < TestBlock > :: default ( ) ;
173183 queue. push_single ( TestBlock :: default ( ) ) . unwrap ( ) ;
174184 assert ! ( queue. pop_all_but_last( ) . unwrap( ) . is_empty( ) ) ;
175185 }
176186
177187 #[ test]
178188 fn pop_all_except_last_with_multiple_elements_returns_all_but_last_inserted ( ) {
179- let queue = BlockImportQueue :: < TestBlock > :: default ( ) ;
189+ let queue = ImportQueue :: < TestBlock > :: default ( ) ;
180190 queue. push_multiple ( vec ! [ 1 , 3 , 5 , 7 ] ) . unwrap ( ) ;
181191 assert_eq ! ( 3 , queue. pop_all_but_last( ) . unwrap( ) . len( ) ) ;
182192 assert ! ( !queue. is_empty( ) . unwrap( ) ) ;
@@ -185,7 +195,7 @@ mod tests {
185195
186196 #[ test]
187197 fn pop_until_returns_empty_vec_if_nothing_matches ( ) {
188- let queue = BlockImportQueue :: < TestBlock > :: default ( ) ;
198+ let queue = ImportQueue :: < TestBlock > :: default ( ) ;
189199 queue. push_multiple ( vec ! [ 1 , 3 , 5 , 7 ] ) . unwrap ( ) ;
190200
191201 let popped_elements = queue. pop_until ( |i| i > & 10u32 ) . unwrap ( ) ;
@@ -194,36 +204,36 @@ mod tests {
194204
195205 #[ test]
196206 fn pop_until_returns_elements_until_and_including_match ( ) {
197- let queue = BlockImportQueue :: < TestBlock > :: default ( ) ;
207+ let queue = ImportQueue :: < TestBlock > :: default ( ) ;
198208 queue. push_multiple ( vec ! [ 1 , 2 , 3 , 10 ] ) . unwrap ( ) ;
199209
200210 assert_eq ! ( queue. pop_until( |i| i == & 3 ) . unwrap( ) , vec![ 1 , 2 , 3 ] ) ;
201211 }
202212
203213 #[ test]
204214 fn pop_until_returns_all_elements_if_last_matches ( ) {
205- let queue = BlockImportQueue :: < TestBlock > :: default ( ) ;
215+ let queue = ImportQueue :: < TestBlock > :: default ( ) ;
206216 queue. push_multiple ( vec ! [ 1 , 2 , 3 , 10 ] ) . unwrap ( ) ;
207217
208218 assert_eq ! ( queue. pop_until( |i| i == & 10 ) . unwrap( ) , vec![ 1 , 2 , 3 , 10 ] ) ;
209219 }
210220
211221 #[ test]
212222 fn pop_until_returns_first_element_if_it_matches ( ) {
213- let queue = BlockImportQueue :: < TestBlock > :: default ( ) ;
223+ let queue = ImportQueue :: < TestBlock > :: default ( ) ;
214224 queue. push_single ( 4 ) . unwrap ( ) ;
215225 assert_eq ! ( queue. pop_until( |i| i == & 4 ) . unwrap( ) , vec![ 4 ] )
216226 }
217227
218228 #[ test]
219229 fn pop_front_returns_none_if_queue_is_empty ( ) {
220- let queue = BlockImportQueue :: < TestBlock > :: default ( ) ;
230+ let queue = ImportQueue :: < TestBlock > :: default ( ) ;
221231 assert_matches ! ( queue. pop_front( ) . unwrap( ) , None ) ;
222232 }
223233
224234 #[ test]
225235 fn pop_front_works ( ) {
226- let queue = BlockImportQueue :: < TestBlock > :: default ( ) ;
236+ let queue = ImportQueue :: < TestBlock > :: default ( ) ;
227237 queue. push_multiple ( vec ! [ 1 , 2 , 3 , 5 ] ) . unwrap ( ) ;
228238 assert_eq ! ( queue. pop_front( ) . unwrap( ) , Some ( 1 ) ) ;
229239 assert_eq ! ( queue. pop_front( ) . unwrap( ) , Some ( 2 ) ) ;
@@ -234,7 +244,7 @@ mod tests {
234244
235245 #[ test]
236246 fn peek_find_works ( ) {
237- let queue = BlockImportQueue :: < TestBlock > :: default ( ) ;
247+ let queue = ImportQueue :: < TestBlock > :: default ( ) ;
238248 queue. push_multiple ( vec ! [ 1 , 2 , 3 , 5 ] ) . unwrap ( ) ;
239249
240250 assert_eq ! ( None , queue. peek_find( |i| i == & 4 ) . unwrap( ) ) ;
@@ -244,20 +254,20 @@ mod tests {
244254
245255 #[ test]
246256 fn peek_find_on_empty_queue_returns_none ( ) {
247- let queue = BlockImportQueue :: < TestBlock > :: default ( ) ;
257+ let queue = ImportQueue :: < TestBlock > :: default ( ) ;
248258 assert_eq ! ( None , queue. peek_find( |i| i == & 1 ) . unwrap( ) ) ;
249259 }
250260
251261 #[ test]
252262 fn peek_last_works ( ) {
253- let queue = BlockImportQueue :: < TestBlock > :: default ( ) ;
263+ let queue = ImportQueue :: < TestBlock > :: default ( ) ;
254264 queue. push_multiple ( vec ! [ 1 , 2 , 3 , 5 , 6 , 9 , 10 ] ) . unwrap ( ) ;
255265 assert_eq ! ( queue. peek_last( ) . unwrap( ) , Some ( 10 ) ) ;
256266 }
257267
258268 #[ test]
259269 fn peek_last_on_empty_queue_returns_none ( ) {
260- let queue = BlockImportQueue :: < TestBlock > :: default ( ) ;
270+ let queue = ImportQueue :: < TestBlock > :: default ( ) ;
261271 assert_eq ! ( None , queue. peek_last( ) . unwrap( ) ) ;
262272 }
263273}
0 commit comments