Alan Jackoway created IMPALA-8532:
-------------------------------------

             Summary: Query Plan Page Fails When Profile is Large
                 Key: IMPALA-8532
                 URL: https://issues.apache.org/jira/browse/IMPALA-8532
             Project: IMPALA
          Issue Type: Bug
            Reporter: Alan Jackoway


We discovered that on queries with large profiles, the query plan page with the 
boxes fails to load.

In Chrome, we saw an increasing number of backend XHR requests, and this JS 
error:
{quote}
Uncaught SyntaxError: Unexpected end of JSON input
    at JSON.parse (<anonymous>)
    at XMLHttpRequest.renderGraph 
(query_plan?query_id=ec422d433862a401:5b5855a700000000:232)
{quote}

Our backend requests to the retrieve the plan JSON were returning 1.5MB in 
between 1.5 and 4 seconds.

I believe the issue is that the code is set up like this:
{code}
function renderGraph(ignored_arg) {
  if (req.status != 200) return;
  var json = JSON.parse(req.responseText);
 // Doesn't get here
...
}
...
// Called periodically, fetches the plan JSON from Impala and passes it to 
renderGraph()
// for display.
function refresh() {
  req = new XMLHttpRequest();
  req.onload = renderGraph;
  req.open("GET", 
"/query_plan?query_id=ec422d433862a401:5b5855a700000000&json", true);
  req.send();
}

// Force one refresh before starting the timer.
refresh();

setInterval(refresh, 1000);
{code}

The issue is that req variable is in global scope. If it takes more than one 
second to fulfill the request, {{setInterval}} has run again and replaced the 
req variable with a new one that is running. Then in the renderGraph step, 
either status = 0 (because the variable is new) or the data gets cut off and 
fails to load. I saw both happening pretty regularly, with no obvious pattern 
between status=0 and status=200 but data being incomplete.

Some options I see to fix it:
* Change scope of the req variable so that renderGraph always gets the request 
that is complete rather than the most recent request created
* replace setInterval with an approach that kicks off the new request only when 
the previous request is complete.

This should be easy to reproduce if you can generate a plan that takes > 1 
second to return from your impalad to your browser.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

---------------------------------------------------------------------
To unsubscribe, e-mail: issues-all-unsubscr...@impala.apache.org
For additional commands, e-mail: issues-all-h...@impala.apache.org

Reply via email to