[
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)