[ https://issues.apache.org/jira/browse/AMBARI-16146?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15292389#comment-15292389 ]
Hudson commented on AMBARI-16146: --------------------------------- ABORTED: Integrated in Ambari-trunk-Commit #4880 (See [https://builds.apache.org/job/Ambari-trunk-Commit/4880/]) AMBARI-16146. Hive View Synchronized Around Entire Connection Creation (pallav.kul: [http://git-wip-us.apache.org/repos/asf?p=ambari.git&a=commit&h=5660554ec0568bb9764017e0c54bd7a626036c71]) * contrib/views/utils/src/main/java/org/apache/ambari/view/utils/UserLocal.java * contrib/views/hive/src/main/java/org/apache/ambari/view/hive/client/UserLocalConnection.java * contrib/views/hive/src/main/java/org/apache/ambari/view/hive/client/UserLocalHiveAuthCredentials.java > Hive View Synchronized Around Entire Connection Creation Causing Deadlock > ------------------------------------------------------------------------- > > Key: AMBARI-16146 > URL: https://issues.apache.org/jira/browse/AMBARI-16146 > Project: Ambari > Issue Type: Bug > Affects Versions: ambari-2.4.0 > Reporter: Mahadev konar > Assignee: Nitiraj Singh Rathore > Priority: Critical > Fix For: ambari-2.4.0 > > Attachments: AMBARI-16146_trunk.patch > > > Hive View Synchronized Around Entire Connection Creation Causing Deadlock > The Hive view uses two {{synchronized}} methods when creating connections: > [ConnectionFactory|https://github.com/apache/ambari/blob/trunk/contrib/views/hive/src/main/java/org/apache/ambari/view/hive/client/ConnectionFactory.java#L54] > {code} > public synchronized HdfsApi getHDFSApi() { > if (hdfsApi == null) { > try { > hdfsApi = HdfsUtil.connectToHDFSApi(context); > } catch (Exception ex) { > throw new ServiceFormattedException("HdfsApi connection failed. Check > \"webhdfs.url\" property", ex); > } > } > return hdfsApi; > } > {code} > [Connection|https://github.com/apache/ambari/blob/trunk/contrib/views/hive/src/main/java/org/apache/ambari/view/hive/client/Connection.java#L104] > {code} > public synchronized void openConnection() throws HiveClientException, > HiveAuthRequiredException { > try { > transport = isHttpTransportMode() ? createHttpTransport() : > createBinaryTransport(); > transport.open(); > client = new TCLIService.Client(new TBinaryProtocol(transport)); > } catch (TTransportException e) { > throw new HiveClientException("H020 Could not establish connection to " > + host + ":" + port + ": " + e.toString(), e); > } catch (SQLException e) { > throw new HiveClientException(e.getMessage(), e); > } > LOG.info("Hive connection opened"); > } > {code} > [UserLocationConnection|https://github.com/apache/ambari/blob/trunk/contrib/views/hive/src/main/java/org/apache/ambari/view/hive/client/UserLocalConnection.java#L37] > {code} > @Override > protected synchronized Connection initialValue(ViewContext context) { > ConnectionFactory hiveConnectionFactory = new ConnectionFactory(context, > authCredentialsLocal.get(context)); > authCredentialsLocal.remove(context); // we should not store credentials > in memory, > // password is erased after > connection established > return hiveConnectionFactory.create(); > } > {code} > The problem with this approach is that views must share the Jetty thread pool > with the Ambari Server. When the Hive view is requested, several threads are > spawned and each waits for a single connection to Hive. One thread enters the > {{synchronized}} block and attempts to make the connections. All other > threads are blocked - and that means that Ambari's Jetty threads are not > blocked as well and not able to answer requests. > Between opening connections to HDFS, Ambari, and Hive, these calls can easily > take between several seconds to a minute to complete. During that time, no > other requests can be fulfilled by Ambari on those threads. If there are > several users using Ambari, then this means that all available Jetty threads > are going to be waiting for the sole hive thread to complete it's > {{synchronized}} block. > *This essentially makes Ambari single-threaded* > AMBARI-16131 is a workaround to alleviate this problem by denying access to > the view if there are already too many threads being held by various views. > However, this problem also needs to be fixed in the Hive view. Using a new > workflow of callbacks and/or asynchronous returns/polling while waiting for > the connection, you can prevent the use of these {{synchronized}} blocks. > Here's an example of a thread dump showing the problem: > This thread is stuck inside of the synchronized trying to make a connection > back to Ambari: > {code} > "qtp-ambari-client-117" prio=10 tid=0x00007efbbc029800 nid=0x135e runnable > [0x00007efb929e5000] > java.lang.Thread.State: RUNNABLE > at java.net.SocketInputStream.socketRead0(Native Method) > at java.net.SocketInputStream.read(SocketInputStream.java:152) > at java.net.SocketInputStream.read(SocketInputStream.java:122) > at java.io.BufferedInputStream.fill(BufferedInputStream.java:235) > at java.io.BufferedInputStream.read1(BufferedInputStream.java:275) > at java.io.BufferedInputStream.read(BufferedInputStream.java:334) > - locked <0x000000077769e870> (a java.io.BufferedInputStream) > at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:690) > at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:633) > at > sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1325) > - locked <0x0000000777692ff8> (a > sun.net.www.protocol.http.HttpURLConnection) > at > java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:468) > at > org.apache.ambari.server.controller.internal.URLStreamProvider.processURL(URLStreamProvider.java:209) > at > org.apache.ambari.server.view.ViewAmbariStreamProvider.getInputStream(ViewAmbariStreamProvider.java:118) > at > org.apache.ambari.server.view.ViewAmbariStreamProvider.readFrom(ViewAmbariStreamProvider.java:78) > at > org.apache.ambari.view.utils.ambari.URLStreamProviderBasicAuth.readFrom(URLStreamProviderBasicAuth.java:65) > at > org.apache.ambari.view.utils.ambari.AmbariApi.requestClusterAPI(AmbariApi.java:173) > at > org.apache.ambari.view.utils.ambari.AmbariApi.requestClusterAPI(AmbariApi.java:142) > at > org.apache.ambari.view.utils.ambari.AmbariApi.getHostsWithComponent(AmbariApi.java:99) > at > org.apache.ambari.view.hive.client.ConnectionFactory.getHiveHost(ConnectionFactory.java:79) > at > org.apache.ambari.view.hive.client.ConnectionFactory.create(ConnectionFactory.java:68) > at > org.apache.ambari.view.hive.client.UserLocalConnection.initialValue(UserLocalConnection.java:42) > - locked <0x0000000798772aa8> (a > org.apache.ambari.view.hive.client.UserLocalConnection) > {code} > However it can't be answered because all of the available Jetty threads are > currently used waiting for the above thread to finish its {{synchronized}} > block: > {code} > "qtp-ambari-client-118" prio=10 tid=0x00007efbbc02b000 nid=0x135f waiting for > monitor entry [0x00007efb928e4000] > java.lang.Thread.State: BLOCKED (on object monitor) > at > org.apache.ambari.view.hive.client.UserLocalConnection.initialValue(UserLocalConnection.java:39) > - waiting to lock <0x0000000798772aa8> (a > org.apache.ambari.view.hive.client.UserLocalConnection) > at > org.apache.ambari.view.hive.client.UserLocalConnection.initialValue(UserLocalConnection.java:26) > at org.apache.ambari.view.utils.UserLocal.get(UserLocal.java:66) > at > org.apache.ambari.view.hive.resources.browser.HiveBrowserService.databases(HiveBrowserService.java:87) > ... > "qtp-ambari-client-25" prio=10 tid=0x00007efc1b235800 nid=0xaab waiting for > monitor entry [0x00007efbfb7f7000] > java.lang.Thread.State: BLOCKED (on object monitor) > at > org.apache.ambari.view.hive.client.UserLocalConnection.initialValue(UserLocalConnection.java:39) > - waiting to lock <0x0000000798772aa8> (a > org.apache.ambari.view.hive.client.UserLocalConnection) > at > org.apache.ambari.view.hive.client.UserLocalConnection.initialValue(UserLocalConnection.java:26) > at org.apache.ambari.view.utils.UserLocal.get(UserLocal.java:66) > at > org.apache.ambari.view.hive.resources.browser.HiveBrowserService.databases(HiveBrowserService.java:87) > {code} -- This message was sent by Atlassian JIRA (v6.3.4#6332)