@@ -124,75 +124,71 @@ impl PageManager {
124
124
125
125
fn append_block (
126
126
& mut self ,
127
- rows : & mut Vec < Vec < Option < String > > > ,
127
+ res : & mut Vec < Vec < Option < String > > > ,
128
128
block : DataBlock ,
129
- remain_rows : usize ,
129
+ remain_rows : & mut usize ,
130
130
remain_size : & mut usize ,
131
131
) -> Result < ( ) > {
132
132
let format_settings = {
133
133
let guard = self . format_settings . read ( ) ;
134
134
guard. as_ref ( ) . unwrap ( ) . clone ( )
135
135
} ;
136
- let mut iter = block_to_strings ( & block, & format_settings) ?
137
- . into_iter ( )
138
- . peekable ( ) ;
139
- let chunk: Vec < _ > = iter
140
- . by_ref ( )
141
- . take ( remain_rows)
142
- . take_while ( |r| {
143
- let size = row_size ( r) ;
144
- let ok = * remain_size > size;
145
- if ok {
146
- * remain_size -= size;
147
- }
148
- ok
149
- } )
150
- . collect ( ) ;
151
- rows. extend ( chunk) ;
152
- self . row_buffer = iter. by_ref ( ) . collect ( ) ;
136
+ let rows = block_to_strings ( & block, & format_settings) ?;
137
+ let mut i = 0 ;
138
+ while * remain_rows > 0 && * remain_size > 0 && i < rows. len ( ) {
139
+ let size = row_size ( & rows[ i] ) ;
140
+ if * remain_size > size {
141
+ * remain_size -= size;
142
+ * remain_rows -= 1 ;
143
+ i += 1 ;
144
+ } else {
145
+ * remain_size = 0 ;
146
+ }
147
+ }
148
+ res. extend_from_slice ( & rows[ ..i] ) ;
149
+ self . row_buffer = rows[ i..] . iter ( ) . cloned ( ) . collect ( ) ;
153
150
Ok ( ( ) )
154
151
}
155
152
156
153
#[ async_backtrace:: framed]
157
154
async fn collect_new_page ( & mut self , tp : & Wait ) -> Result < ( StringBlock , bool ) > {
158
155
let mut res: Vec < Vec < Option < String > > > = Vec :: with_capacity ( self . max_rows_per_page ) ;
159
- let mut max_size_per_page = 10 * 1024 * 1024 ;
160
- while res. len ( ) < self . max_rows_per_page {
156
+ let mut remain_size = 10 * 1024 * 1024 ;
157
+ let mut remain_rows = self . max_rows_per_page ;
158
+ while remain_rows > 0 && remain_size > 0 {
161
159
if let Some ( row) = self . row_buffer . pop_front ( ) {
162
160
let size = row_size ( & row) ;
163
- if max_size_per_page > size {
161
+ if remain_size > size {
164
162
res. push ( row) ;
165
- max_size_per_page -= size;
166
- continue ;
163
+ remain_size -= size;
164
+ remain_rows -= 1 ;
165
+ } else {
166
+ remain_size = 0 ;
167
167
}
168
- }
169
- break ;
170
- }
171
- loop {
172
- assert ! ( self . max_rows_per_page >= res. len( ) ) ;
173
- let remain_rows = self . max_rows_per_page - res. len ( ) ;
174
- if remain_rows == 0 {
168
+ } else {
175
169
break ;
176
170
}
171
+ }
172
+
173
+ while remain_rows > 0 && remain_size > 0 {
177
174
match tp {
178
175
Wait :: Async => match self . block_receiver . try_recv ( ) {
179
176
Some ( block) => {
180
- self . append_block ( & mut res, block, remain_rows, & mut max_size_per_page ) ?
177
+ self . append_block ( & mut res, block, & mut remain_rows, & mut remain_size ) ?
181
178
}
182
179
None => break ,
183
180
} ,
184
181
Wait :: Deadline ( t) => {
185
182
let now = Instant :: now ( ) ;
186
183
let d = * t - now;
184
+ if d. is_zero ( ) {
185
+ // timeout() will return Ok if the future completes immediately
186
+ break ;
187
+ }
187
188
match tokio:: time:: timeout ( d, self . block_receiver . recv ( ) ) . await {
188
189
Ok ( Some ( block) ) => {
189
190
debug ! ( "http query got new block with {} rows" , block. num_rows( ) ) ;
190
- self . append_block (
191
- & mut res,
192
- block,
193
- remain_rows,
194
- & mut max_size_per_page,
195
- ) ?;
191
+ self . append_block ( & mut res, block, & mut remain_rows, & mut remain_size) ?;
196
192
}
197
193
Ok ( None ) => {
198
194
info ! ( "http query reach end of blocks" ) ;
0 commit comments