Skip to content

Commit 9197028

Browse files
authored
fix: max_wait_time in http handler not work when result set is large โ€ฆ (#16267)
* fix: max_wait_time in http handler not work when result set is large and return fast. * fix
1 parent a8da519 commit 9197028

File tree

1 file changed

+34
-38
lines changed

1 file changed

+34
-38
lines changed

โ€Žsrc/query/service/src/servers/http/v1/query/page_manager.rs

Lines changed: 34 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -124,75 +124,71 @@ impl PageManager {
124124

125125
fn append_block(
126126
&mut self,
127-
rows: &mut Vec<Vec<Option<String>>>,
127+
res: &mut Vec<Vec<Option<String>>>,
128128
block: DataBlock,
129-
remain_rows: usize,
129+
remain_rows: &mut usize,
130130
remain_size: &mut usize,
131131
) -> Result<()> {
132132
let format_settings = {
133133
let guard = self.format_settings.read();
134134
guard.as_ref().unwrap().clone()
135135
};
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();
153150
Ok(())
154151
}
155152

156153
#[async_backtrace::framed]
157154
async fn collect_new_page(&mut self, tp: &Wait) -> Result<(StringBlock, bool)> {
158155
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 {
161159
if let Some(row) = self.row_buffer.pop_front() {
162160
let size = row_size(&row);
163-
if max_size_per_page > size {
161+
if remain_size > size {
164162
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;
167167
}
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 {
175169
break;
176170
}
171+
}
172+
173+
while remain_rows > 0 && remain_size > 0 {
177174
match tp {
178175
Wait::Async => match self.block_receiver.try_recv() {
179176
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)?
181178
}
182179
None => break,
183180
},
184181
Wait::Deadline(t) => {
185182
let now = Instant::now();
186183
let d = *t - now;
184+
if d.is_zero() {
185+
// timeout() will return Ok if the future completes immediately
186+
break;
187+
}
187188
match tokio::time::timeout(d, self.block_receiver.recv()).await {
188189
Ok(Some(block)) => {
189190
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)?;
196192
}
197193
Ok(None) => {
198194
info!("http query reach end of blocks");

0 commit comments

Comments
ย (0)