| 191 | } |
| 192 | |
| 193 | void AdmissionControlService::GetQueryStatus(const GetQueryStatusRequestPB* req, |
| 194 | GetQueryStatusResponsePB* resp, kudu::rpc::RpcContext* rpc_context) { |
| 195 | VLOG(2) << "GetQueryStatus " << req->query_id(); |
| 196 | |
| 197 | shared_ptr<AdmissionState> admission_state; |
| 198 | RESPOND_IF_ERROR(admission_state_map_.Get(req->query_id(), &admission_state)); |
| 199 | |
| 200 | Status status = Status::OK(); |
| 201 | { |
| 202 | lock_guard<mutex> l(admission_state->lock); |
| 203 | if (admission_state->submitted) { |
| 204 | if (!admission_state->admission_done) { |
| 205 | bool timed_out; |
| 206 | int64_t wait_start_time_ms, wait_end_time_ms; |
| 207 | admission_state->admit_status = |
| 208 | AdmissiondEnv::GetInstance()->admission_controller()->WaitOnQueued( |
| 209 | req->query_id(), &admission_state->schedule, |
| 210 | FLAGS_admission_status_wait_time_ms, &timed_out, |
| 211 | &wait_start_time_ms, &wait_end_time_ms); |
| 212 | resp->set_wait_start_time_ms(wait_start_time_ms); |
| 213 | resp->set_wait_end_time_ms(wait_end_time_ms); |
| 214 | if (!timed_out) { |
| 215 | admission_state->admission_done = true; |
| 216 | if (admission_state->admit_status.ok()) { |
| 217 | for (const auto& entry : admission_state->schedule->backend_exec_params()) { |
| 218 | admission_state->unreleased_backends.emplace(entry.address()); |
| 219 | } |
| 220 | } |
| 221 | } else { |
| 222 | DCHECK(admission_state->admit_status.ok()); |
| 223 | } |
| 224 | } |
| 225 | |
| 226 | if (admission_state->admission_done) { |
| 227 | if (admission_state->admit_status.ok()) { |
| 228 | *resp->mutable_query_schedule() = *admission_state->schedule.get(); |
| 229 | // Free TQueryExecRequest since it's not required after admission is done |
| 230 | admission_state->ReleaseQueryExecRequest(); |
| 231 | } else { |
| 232 | status = admission_state->admit_status; |
| 233 | } |
| 234 | } |
| 235 | |
| 236 | // Always send the profile even if admission isn't done yet. |
| 237 | TRuntimeProfileTree tree; |
| 238 | admission_state->summary_profile->ToThrift(&tree); |
| 239 | int sidecar_idx; |
| 240 | int64_t sidecar_length = 0; |
| 241 | Status sidecar_status = SetFaststringSidecar(tree, rpc_context, &sidecar_idx, |
| 242 | &sidecar_length); |
| 243 | if (!sidecar_status.ok()) { |
| 244 | // We don't need to fail the query just because we can't return the profile, so |
| 245 | // just log the error. |
| 246 | LOG(WARNING) << "Failed to set profile sidecar in GetQueryStatus: " |
| 247 | << sidecar_status; |
| 248 | } else { |
| 249 | resp->set_summary_profile_sidecar_idx(sidecar_idx); |
| 250 | } |
no test coverage detected