| 213 | } |
| 214 | |
| 215 | bool ScanNode::WaitForRuntimeFilters() { |
| 216 | int32_t wait_time_ms = FLAGS_runtime_filter_wait_time_ms; |
| 217 | if (runtime_state_->query_options().runtime_filter_wait_time_ms > 0) { |
| 218 | wait_time_ms = runtime_state_->query_options().runtime_filter_wait_time_ms; |
| 219 | } |
| 220 | vector<string> arrived_filter_ids; |
| 221 | vector<string> missing_filter_ids; |
| 222 | int32_t max_arrival_delay = 0; |
| 223 | int64_t start = MonotonicMillis(); |
| 224 | for (auto& ctx: filter_ctxs_) { |
| 225 | string filter_id = Substitute("$0", ctx.filter->id()); |
| 226 | if (ctx.filter->WaitForArrival(wait_time_ms)) { |
| 227 | arrived_filter_ids.push_back(filter_id); |
| 228 | } else { |
| 229 | missing_filter_ids.push_back(filter_id); |
| 230 | } |
| 231 | max_arrival_delay = max(max_arrival_delay, ctx.filter->arrival_delay_ms()); |
| 232 | } |
| 233 | int64_t end = MonotonicMillis(); |
| 234 | const string& wait_time = PrettyPrinter::Print(end - start, TUnit::TIME_MS); |
| 235 | const string& arrival_delay = PrettyPrinter::Print(max_arrival_delay, TUnit::TIME_MS); |
| 236 | |
| 237 | if (arrived_filter_ids.size() == filter_ctxs_.size()) { |
| 238 | runtime_profile()->AddInfoString("Runtime filters", |
| 239 | Substitute("All filters arrived. Waited $0. Maximum arrival delay: $1.", |
| 240 | wait_time, arrival_delay)); |
| 241 | VLOG(2) << "Filters arrived. Waited " << wait_time |
| 242 | << ". Current time since reboot(ms) " << end; |
| 243 | return true; |
| 244 | } |
| 245 | |
| 246 | const string& filter_str = Substitute("Not all filters arrived (arrived: [$0], missing " |
| 247 | "[$1]), waited for $2. Arrival delay: $3.", |
| 248 | join(arrived_filter_ids, ", "), join(missing_filter_ids, ", "), wait_time, |
| 249 | arrival_delay); |
| 250 | runtime_profile()->AddInfoString("Runtime filters", filter_str); |
| 251 | VLOG(2) << filter_str; |
| 252 | return false; |
| 253 | } |
| 254 | |
| 255 | void ScanNode::ScannerThreadState::Prepare( |
| 256 | ScanNode* parent, int64_t estimated_per_thread_mem) { |
nothing calls this directly
no test coverage detected