| 716 | } |
| 717 | |
| 718 | void ImpalaHttpHandler::QueryStateHandler(const Webserver::WebRequest& req, |
| 719 | Document* document) { |
| 720 | AddQueryRecordTips(document); |
| 721 | |
| 722 | set<QueryStateRecord, QueryStateRecord::StartTimeComparator> |
| 723 | sorted_query_records; |
| 724 | |
| 725 | server_->query_driver_map_.DoFuncForAllEntries( |
| 726 | [&](const std::shared_ptr<QueryDriver>& query_driver) { |
| 727 | sorted_query_records.insert( |
| 728 | QueryStateRecord(*query_driver->GetActiveClientRequestState())); |
| 729 | }); |
| 730 | |
| 731 | unordered_set<TUniqueId> in_flight_query_ids; |
| 732 | Value in_flight_queries(kArrayType); |
| 733 | int64_t num_waiting_queries = 0; |
| 734 | for (const QueryStateRecord& record: sorted_query_records) { |
| 735 | Value record_json(kObjectType); |
| 736 | QueryStateToJson(record, &record_json, document, true); |
| 737 | |
| 738 | if (record_json["waiting"].GetBool()) ++num_waiting_queries; |
| 739 | |
| 740 | in_flight_queries.PushBack(record_json, document->GetAllocator()); |
| 741 | in_flight_query_ids.insert(record.id); |
| 742 | } |
| 743 | document->AddMember("in_flight_queries", in_flight_queries, document->GetAllocator()); |
| 744 | document->AddMember("num_in_flight_queries", |
| 745 | static_cast<uint64_t>(sorted_query_records.size()), |
| 746 | document->GetAllocator()); |
| 747 | document->AddMember("num_executing_queries", |
| 748 | sorted_query_records.size() - num_waiting_queries, |
| 749 | document->GetAllocator()); |
| 750 | document->AddMember("num_waiting_queries", num_waiting_queries, |
| 751 | document->GetAllocator()); |
| 752 | document->AddMember("waiting-tooltip", "These queries are no longer executing, either " |
| 753 | "because they encountered an error or because they have returned all of their " |
| 754 | "results, but they are still active so that their results can be inspected. To " |
| 755 | "free the resources they are using, they must be closed.", |
| 756 | document->GetAllocator()); |
| 757 | |
| 758 | Value completed_queries(kArrayType); |
| 759 | { |
| 760 | lock_guard<mutex> l(server_->query_log_lock_); |
| 761 | for (const shared_ptr<QueryStateRecord>& log_entry : |
| 762 | server_->query_log_) { |
| 763 | // Don't show duplicated entries between in-flight and completed queries. |
| 764 | if (in_flight_query_ids.find(log_entry->id) != in_flight_query_ids.end()) continue; |
| 765 | Value record_json(kObjectType); |
| 766 | QueryStateToJson(*log_entry, &record_json, document, false); |
| 767 | completed_queries.PushBack(record_json, document->GetAllocator()); |
| 768 | } |
| 769 | } |
| 770 | document->AddMember("completed_queries", completed_queries, document->GetAllocator()); |
| 771 | document->AddMember("completed_log_size", FLAGS_query_log_size, |
| 772 | document->GetAllocator()); |
| 773 | document->AddMember("completed_log_size_in_bytes", FLAGS_query_log_size_in_bytes, |
| 774 | document->GetAllocator()); |
| 775 |
nothing calls this directly
no test coverage detected