Repository: hbase Updated Branches: refs/heads/master 77a7925c3 -> d2c5e4bf7
Revert "Thrift Http implementation" This reverts commit 1cf852119116a47254c2ce10c1ff8e4a46900163. Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/d918570c Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/d918570c Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/d918570c Branch: refs/heads/master Commit: d918570c80051ab9046156228f7915cc7e314e04 Parents: 77a7925 Author: Jimmy Xiang <[email protected]> Authored: Wed Dec 17 16:11:30 2014 -0800 Committer: Jimmy Xiang <[email protected]> Committed: Wed Dec 17 16:11:30 2014 -0800 ---------------------------------------------------------------------- .../hadoop/hbase/security/SecurityUtil.java | 8 - .../thrift/HttpAuthenticationException.java | 37 ---- .../hadoop/hbase/thrift/ThriftHttpServlet.java | 178 ------------------- .../hadoop/hbase/thrift/ThriftServer.java | 2 +- .../hadoop/hbase/thrift/ThriftServerRunner.java | 120 ++----------- .../hbase/thrift/TestThriftHttpServer.java | 162 ----------------- .../hbase/thrift/TestThriftServerCmdLine.java | 2 + 7 files changed, 16 insertions(+), 493 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/d918570c/hbase-server/src/main/java/org/apache/hadoop/hbase/security/SecurityUtil.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/security/SecurityUtil.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/security/SecurityUtil.java index b120d67..abbf784 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/security/SecurityUtil.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/security/SecurityUtil.java @@ -38,12 +38,4 @@ public class SecurityUtil { } return (i > -1) ? principal.substring(0, i) : principal; } - - /** - * Get the user name from a principal - */ - public static String getPrincipalWithoutRealm(final String principal) { - int i = principal.indexOf("@"); - return (i > -1) ? principal.substring(0, i) : principal; - } } http://git-wip-us.apache.org/repos/asf/hbase/blob/d918570c/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/HttpAuthenticationException.java ---------------------------------------------------------------------- diff --git a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/HttpAuthenticationException.java b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/HttpAuthenticationException.java deleted file mode 100644 index f3c2939..0000000 --- a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/HttpAuthenticationException.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. See accompanying LICENSE file. - */ -package org.apache.hadoop.hbase.thrift; - -public class HttpAuthenticationException extends Exception { - private static final long serialVersionUID = 0; - /** - * @param cause original exception - */ - public HttpAuthenticationException(Throwable cause) { - super(cause); - } - /** - * @param msg exception message - */ - public HttpAuthenticationException(String msg) { - super(msg); - } - /** - * @param msg exception message - * @param cause original exception - */ - public HttpAuthenticationException(String msg, Throwable cause) { - super(msg, cause); - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hbase/blob/d918570c/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftHttpServlet.java ---------------------------------------------------------------------- diff --git a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftHttpServlet.java b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftHttpServlet.java deleted file mode 100644 index 1e9b8c5..0000000 --- a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftHttpServlet.java +++ /dev/null @@ -1,178 +0,0 @@ -package org.apache.hadoop.hbase.thrift; - -import java.io.IOException; -import java.security.PrivilegedExceptionAction; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.commons.net.util.Base64; -import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.hbase.security.SecurityUtil; -import org.apache.hadoop.security.UserGroupInformation; -import org.apache.hadoop.security.authorize.AuthorizationException; -import org.apache.hadoop.security.authorize.ProxyUsers; -import org.apache.thrift.TProcessor; -import org.apache.thrift.protocol.TProtocolFactory; -import org.apache.thrift.server.TServlet; -import org.ietf.jgss.GSSContext; -import org.ietf.jgss.GSSCredential; -import org.ietf.jgss.GSSException; -import org.ietf.jgss.GSSManager; -import org.ietf.jgss.GSSName; -import org.ietf.jgss.Oid; - - -public class ThriftHttpServlet extends TServlet { - private static final long serialVersionUID = 1L; - public static final Log LOG = LogFactory.getLog(ThriftHttpServlet.class.getName()); - private final UserGroupInformation realUser; - private final Configuration conf; - private final boolean securityEnabled; - private final boolean doAsEnabled; - ThriftServerRunner.HBaseHandler hbaseHandler; - - public ThriftHttpServlet(TProcessor processor, TProtocolFactory protocolFactory, - UserGroupInformation realUser, Configuration conf, ThriftServerRunner.HBaseHandler - hbaseHandler, boolean securityEnabled, boolean doAsEnabled) { - super(processor, protocolFactory); - this.realUser = realUser; - this.conf = conf; - this.hbaseHandler = hbaseHandler; - this.securityEnabled = securityEnabled; - this.doAsEnabled = doAsEnabled; - } - - @Override - protected void doPost(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - String effectiveUser = realUser.getShortUserName(); - if (securityEnabled) { - try { - // As Thrift HTTP transport doesn't support SPNEGO yet (THRIFT-889), - // Kerberos authentication is being done at servlet level. - effectiveUser = doKerberosAuth(request); - } catch (HttpAuthenticationException e) { - LOG.error("Kerberos Authentication failed", e); - // Send a 401 to the client - response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); - response.getWriter().println("Authentication Error: " + e.getMessage()); - } - } - String doAsUserFromQuery = request.getHeader("doAs"); - if (doAsUserFromQuery != null) { - if (!doAsEnabled) { - throw new ServletException("Support for proxyuser is not configured"); - } - // create and attempt to authorize a proxy user (the client is attempting - // to do proxy user) - UserGroupInformation ugi = UserGroupInformation.createProxyUser(doAsUserFromQuery, realUser); - // validate the proxy user authorization - try { - ProxyUsers.authorize(ugi, request.getRemoteAddr()); - } catch (AuthorizationException e) { - throw new ServletException(e.getMessage()); - } - effectiveUser = doAsUserFromQuery; - } - hbaseHandler.setEffectiveUser(effectiveUser); - super.doPost(request, response); - } - - /** - * Do the GSS-API kerberos authentication. - * We already have a logged in subject in the form of serviceUGI, - * which GSS-API will extract information from. - */ - private String doKerberosAuth(HttpServletRequest request) - throws HttpAuthenticationException { - try { - return realUser.doAs(new HttpKerberosServerAction(request, realUser)); - } catch (Exception e) { - LOG.error("Failed to perform authentication"); - throw new HttpAuthenticationException(e); - } - } - - - class HttpKerberosServerAction implements PrivilegedExceptionAction<String> { - HttpServletRequest request; - UserGroupInformation serviceUGI; - HttpKerberosServerAction(HttpServletRequest request, UserGroupInformation serviceUGI) { - this.request = request; - this.serviceUGI = serviceUGI; - } - - @Override - public String run() throws HttpAuthenticationException { - // Get own Kerberos credentials for accepting connection - GSSManager manager = GSSManager.getInstance(); - GSSContext gssContext = null; - String serverPrincipal = SecurityUtil.getPrincipalWithoutRealm(serviceUGI.getUserName()); - try { - // This Oid for Kerberos GSS-API mechanism. - Oid kerberosMechOid = new Oid("1.2.840.113554.1.2.2"); - // Oid for SPNego GSS-API mechanism. - Oid spnegoMechOid = new Oid("1.3.6.1.5.5.2"); - // Oid for kerberos principal name - Oid krb5PrincipalOid = new Oid("1.2.840.113554.1.2.2.1"); - // GSS name for server - GSSName serverName = manager.createName(serverPrincipal, krb5PrincipalOid); - // GSS credentials for server - GSSCredential serverCreds = manager.createCredential(serverName, - GSSCredential.DEFAULT_LIFETIME, - new Oid[]{kerberosMechOid, spnegoMechOid}, - GSSCredential.ACCEPT_ONLY); - // Create a GSS context - gssContext = manager.createContext(serverCreds); - // Get service ticket from the authorization header - String serviceTicketBase64 = getAuthHeader(request); - byte[] inToken = Base64.decodeBase64(serviceTicketBase64.getBytes()); - gssContext.acceptSecContext(inToken, 0, inToken.length); - // Authenticate or deny based on its context completion - if (!gssContext.isEstablished()) { - throw new HttpAuthenticationException("Kerberos authentication failed: " + - "unable to establish context with the service ticket " + - "provided by the client."); - } - return SecurityUtil.getUserFromPrincipal(gssContext.getSrcName().toString()); - } catch (GSSException e) { - throw new HttpAuthenticationException("Kerberos authentication failed: ", e); - } finally { - if (gssContext != null) { - try { - gssContext.dispose(); - } catch (GSSException e) { - } - } - } - } - - /** - * Returns the base64 encoded auth header payload - * - * @throws HttpAuthenticationException if a remote or network exception occurs - */ - private String getAuthHeader(HttpServletRequest request) - throws HttpAuthenticationException { - String authHeader = request.getHeader("Authorization"); - // Each http request must have an Authorization header - if (authHeader == null || authHeader.isEmpty()) { - throw new HttpAuthenticationException("Authorization header received " + - "from the client is empty."); - } - String authHeaderBase64String; - int beginIndex = ("Negotiate ").length(); - authHeaderBase64String = authHeader.substring(beginIndex); - // Authorization header must have a payload - if (authHeaderBase64String == null || authHeaderBase64String.isEmpty()) { - throw new HttpAuthenticationException("Authorization header received " + - "from the client does not contain any data."); - } - return authHeaderBase64String; - } - } -} http://git-wip-us.apache.org/repos/asf/hbase/blob/d918570c/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServer.java ---------------------------------------------------------------------- diff --git a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServer.java b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServer.java index c87e5f5..052c9e1 100644 --- a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServer.java +++ b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServer.java @@ -28,10 +28,10 @@ import org.apache.commons.cli.Options; import org.apache.commons.cli.PosixParser; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hbase.classification.InterfaceAudience; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.HBaseInterfaceAudience; -import org.apache.hadoop.hbase.classification.InterfaceAudience; import org.apache.hadoop.hbase.http.InfoServer; import org.apache.hadoop.hbase.thrift.ThriftServerRunner.ImplType; import org.apache.hadoop.hbase.util.VersionInfo; http://git-wip-us.apache.org/repos/asf/hbase/blob/d918570c/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServerRunner.java ---------------------------------------------------------------------- diff --git a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServerRunner.java b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServerRunner.java index 9f23c09..7d2441e 100644 --- a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServerRunner.java +++ b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServerRunner.java @@ -50,6 +50,7 @@ import org.apache.commons.cli.Option; import org.apache.commons.cli.OptionGroup; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hbase.classification.InterfaceAudience; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.HColumnDescriptor; @@ -60,7 +61,6 @@ import org.apache.hadoop.hbase.KeyValue; import org.apache.hadoop.hbase.ServerName; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.TableNotFoundException; -import org.apache.hadoop.hbase.classification.InterfaceAudience; import org.apache.hadoop.hbase.client.Append; import org.apache.hadoop.hbase.client.Delete; import org.apache.hadoop.hbase.client.Durability; @@ -99,7 +99,6 @@ import org.apache.hadoop.hbase.util.Strings; import org.apache.hadoop.net.DNS; import org.apache.hadoop.security.SaslRpcServer.SaslGssCallbackHandler; import org.apache.hadoop.security.UserGroupInformation; -import org.apache.hadoop.security.authorize.ProxyUsers; import org.apache.thrift.TException; import org.apache.thrift.TProcessor; import org.apache.thrift.protocol.TBinaryProtocol; @@ -109,7 +108,6 @@ import org.apache.thrift.protocol.TProtocolFactory; import org.apache.thrift.server.THsHaServer; import org.apache.thrift.server.TNonblockingServer; import org.apache.thrift.server.TServer; -import org.apache.thrift.server.TServlet; import org.apache.thrift.server.TThreadedSelectorServer; import org.apache.thrift.transport.TFramedTransport; import org.apache.thrift.transport.TNonblockingServerSocket; @@ -118,13 +116,6 @@ import org.apache.thrift.transport.TSaslServerTransport; import org.apache.thrift.transport.TServerSocket; import org.apache.thrift.transport.TServerTransport; import org.apache.thrift.transport.TTransportFactory; -import org.mortbay.jetty.Connector; -import org.mortbay.jetty.Server; -import org.mortbay.jetty.nio.SelectChannelConnector; -import org.mortbay.jetty.security.SslSelectChannelConnector; -import org.mortbay.jetty.servlet.Context; -import org.mortbay.jetty.servlet.ServletHolder; -import org.mortbay.thread.QueuedThreadPool; import com.google.common.base.Joiner; import com.google.common.util.concurrent.ThreadFactoryBuilder; @@ -148,15 +139,6 @@ public class ThriftServerRunner implements Runnable { static final String MAX_FRAME_SIZE_CONF_KEY = "hbase.regionserver.thrift.framed.max_frame_size_in_mb"; static final String PORT_CONF_KEY = "hbase.regionserver.thrift.port"; static final String COALESCE_INC_KEY = "hbase.regionserver.thrift.coalesceIncrement"; - static final String USE_HTTP_CONF_KEY = "hbase.regionserver.thrift.http"; - static final String HTTP_MIN_THREADS = "hbase.thrift.http_threads.min"; - static final String HTTP_MAX_THREADS = "hbase.thrift.http_threads.max"; - - static final String THRIFT_SSL_ENABLED = "hbase.thrift.ssl.enabled"; - static final String THRIFT_SSL_KEYSTORE_STORE = "hbase.thrift.ssl.keystore.store"; - static final String THRIFT_SSL_KEYSTORE_PASSWORD = "hbase.thrift.ssl.keystore.password"; - static final String THRIFT_SSL_KEYSTORE_KEYPASSWORD = "hbase.thrift.ssl.keystore.keypassword"; - /** * Thrift quality of protection configuration key. Valid values can be: @@ -172,12 +154,10 @@ public class ThriftServerRunner implements Runnable { private static final String DEFAULT_BIND_ADDR = "0.0.0.0"; public static final int DEFAULT_LISTEN_PORT = 9090; public static final int HREGION_VERSION = 1; - static final String THRIFT_SUPPORT_PROXYUSER = "hbase.thrift.support.proxyuser"; private final int listenPort; private Configuration conf; volatile TServer tserver; - volatile Server httpServer; private final Hbase.Iface handler; private final ThriftMetrics metrics; private final HBaseHandler hbaseHandler; @@ -186,9 +166,6 @@ public class ThriftServerRunner implements Runnable { private final String qop; private String host; - private final boolean securityEnabled; - private final boolean doAsEnabled; - /** An enum of server implementation selections */ enum ImplType { HS_HA("hsha", true, THsHaServer.class, true), @@ -290,7 +267,7 @@ public class ThriftServerRunner implements Runnable { public ThriftServerRunner(Configuration conf) throws IOException { UserProvider userProvider = UserProvider.instantiate(conf); // login the server principal (if using secure Hadoop) - securityEnabled = userProvider.isHadoopSecurityEnabled() + boolean securityEnabled = userProvider.isHadoopSecurityEnabled() && userProvider.isHBaseSecurityEnabled(); if (securityEnabled) { host = Strings.domainNamePointerToHostName(DNS.getDefaultHost( @@ -308,7 +285,6 @@ public class ThriftServerRunner implements Runnable { hbaseHandler, metrics, conf); this.realUser = userProvider.getCurrent().getUGI(); qop = conf.get(THRIFT_QOP_KEY); - doAsEnabled = conf.getBoolean(THRIFT_SUPPORT_PROXYUSER, false); if (qop != null) { if (!qop.equals("auth") && !qop.equals("auth-int") && !qop.equals("auth-conf")) { @@ -327,27 +303,21 @@ public class ThriftServerRunner implements Runnable { */ @Override public void run() { - realUser.doAs(new PrivilegedAction<Object>() { - @Override - public Object run() { - try { - if (conf.getBoolean(USE_HTTP_CONF_KEY, false)) { - setupHTTPServer(); - httpServer.start(); - httpServer.join(); - } else { + realUser.doAs( + new PrivilegedAction<Object>() { + @Override + public Object run() { + try { setupServer(); tserver.serve(); + } catch (Exception e) { + LOG.fatal("Cannot run ThriftServer", e); + // Crash the process if the ThriftServer is not running + System.exit(-1); } - } catch (Exception e) { - LOG.fatal("Cannot run ThriftServer", e); - // Crash the process if the ThriftServer is not running - System.exit(-1); + return null; } - return null; - } - }); - + }); } public void shutdown() { @@ -355,70 +325,6 @@ public class ThriftServerRunner implements Runnable { tserver.stop(); tserver = null; } - if (httpServer != null) { - try { - httpServer.stop(); - httpServer = null; - } catch (Exception e) { - LOG.error("Problem encountered in shutting down HTTP server " + e.getCause()); - } - httpServer = null; - } - } - - private void setupHTTPServer() throws IOException { - TProtocolFactory protocolFactory = new TBinaryProtocol.Factory(); - TProcessor processor = new Hbase.Processor<Hbase.Iface>(handler); - TServlet thriftHttpServlet = new ThriftHttpServlet(processor, protocolFactory, realUser, - conf, hbaseHandler, securityEnabled, doAsEnabled); - - httpServer = new Server(); - // Context handler - Context context = new Context(httpServer, "/", Context.SESSIONS); - context.setContextPath("/"); - String httpPath = "/*"; - httpServer.setHandler(context); - context.addServlet(new ServletHolder(thriftHttpServlet), httpPath); - - // set up Jetty and run the embedded server - Connector connector = new SelectChannelConnector(); - if(conf.getBoolean(THRIFT_SSL_ENABLED, false)) { - SslSelectChannelConnector sslConnector = new SslSelectChannelConnector(); - String keystore = conf.get(THRIFT_SSL_KEYSTORE_STORE); - String password = HBaseConfiguration.getPassword(conf, - THRIFT_SSL_KEYSTORE_PASSWORD, null); - String keyPassword = HBaseConfiguration.getPassword(conf, - THRIFT_SSL_KEYSTORE_KEYPASSWORD, password); - sslConnector.setKeystore(keystore); - sslConnector.setPassword(password); - sslConnector.setKeyPassword(keyPassword); - connector = sslConnector; - } - String host = getBindAddress(conf).getHostAddress(); - connector.setPort(listenPort); - connector.setHost(host); - httpServer.addConnector(connector); - - if (doAsEnabled) { - ProxyUsers.refreshSuperUserGroupsConfiguration(conf); - } - - // Set the default max thread number to 100 to limit - // the number of concurrent requests so that Thrfit HTTP server doesn't OOM easily. - // Jetty set the default max thread number to 250, if we don't set it. - // - // Our default min thread number 2 is the same as that used by Jetty. - int minThreads = conf.getInt(HTTP_MIN_THREADS, 2); - int maxThreads = conf.getInt(HTTP_MAX_THREADS, 100); - QueuedThreadPool threadPool = new QueuedThreadPool(maxThreads); - threadPool.setMinThreads(minThreads); - httpServer.setThreadPool(threadPool); - - httpServer.setSendServerVersion(false); - httpServer.setSendDateHeader(false); - httpServer.setStopAtShutdown(true); - - LOG.info("Starting Thrift HTTP Server on " + Integer.toString(listenPort)); } /** http://git-wip-us.apache.org/repos/asf/hbase/blob/d918570c/hbase-thrift/src/test/java/org/apache/hadoop/hbase/thrift/TestThriftHttpServer.java ---------------------------------------------------------------------- diff --git a/hbase-thrift/src/test/java/org/apache/hadoop/hbase/thrift/TestThriftHttpServer.java b/hbase-thrift/src/test/java/org/apache/hadoop/hbase/thrift/TestThriftHttpServer.java deleted file mode 100644 index 92d05d8..0000000 --- a/hbase-thrift/src/test/java/org/apache/hadoop/hbase/thrift/TestThriftHttpServer.java +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright The Apache Software Foundation - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ -package org.apache.hadoop.hbase.thrift; - -import java.util.ArrayList; -import java.util.List; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.hadoop.hbase.HBaseTestingUtility; -import org.apache.hadoop.hbase.HConstants; -import org.apache.hadoop.hbase.testclassification.ClientTests; -import org.apache.hadoop.hbase.testclassification.LargeTests; -import org.apache.hadoop.hbase.thrift.generated.Hbase; -import org.apache.hadoop.hbase.util.EnvironmentEdgeManager; -import org.apache.hadoop.hbase.util.EnvironmentEdgeManagerTestHelper; -import org.apache.hadoop.hbase.util.IncrementingEnvironmentEdge; -import org.apache.thrift.protocol.TBinaryProtocol; -import org.apache.thrift.protocol.TProtocol; -import org.apache.thrift.transport.THttpClient; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.experimental.categories.Category; - -import com.google.common.base.Joiner; - -/** - * Start the HBase Thrift HTTP server on a random port through the command-line - * interface and talk to it from client side. - */ -@Category({ClientTests.class, LargeTests.class}) - -public class TestThriftHttpServer { - - public static final Log LOG = - LogFactory.getLog(TestThriftHttpServer.class); - - private static final HBaseTestingUtility TEST_UTIL = - new HBaseTestingUtility(); - - private Thread httpServerThread; - private volatile Exception httpServerException; - - private Exception clientSideException; - - private ThriftServer thriftServer; - private int port; - - @BeforeClass - public static void setUpBeforeClass() throws Exception { - TEST_UTIL.getConfiguration().setBoolean("hbase.regionserver.thrift.http", true); - TEST_UTIL.startMiniCluster(); - //ensure that server time increments every time we do an operation, otherwise - //successive puts having the same timestamp will override each other - EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge()); - } - - @AfterClass - public static void tearDownAfterClass() throws Exception { - TEST_UTIL.shutdownMiniCluster(); - EnvironmentEdgeManager.reset(); - } - - private void startHttpServerThread(final String[] args) { - LOG.info("Starting HBase Thrift server with HTTP server: " + Joiner.on(" ").join(args)); - - httpServerException = null; - httpServerThread = new Thread(new Runnable() { - @Override - public void run() { - try { - thriftServer.doMain(args); - } catch (Exception e) { - httpServerException = e; - } - } - }); - httpServerThread.setName(ThriftServer.class.getSimpleName() + - "-httpServer"); - httpServerThread.start(); - } - - @Test(timeout=600000) - public void testRunThriftServer() throws Exception { - List<String> args = new ArrayList<String>(); - port = HBaseTestingUtility.randomFreePort(); - args.add("-" + ThriftServer.PORT_OPTION); - args.add(String.valueOf(port)); - args.add("start"); - - thriftServer = new ThriftServer(TEST_UTIL.getConfiguration()); - startHttpServerThread(args.toArray(new String[args.size()])); - - // wait up to 10s for the server to start - for (int i = 0; i < 100 - && ( thriftServer.serverRunner == null || thriftServer.serverRunner.httpServer == - null); i++) { - Thread.sleep(100); - } - - try { - talkToThriftServer(); - } catch (Exception ex) { - clientSideException = ex; - } finally { - stopHttpServerThread(); - } - - if (clientSideException != null) { - LOG.error("Thrift client threw an exception " + clientSideException); - throw new Exception(clientSideException); - } - } - - private static volatile boolean tableCreated = false; - - private void talkToThriftServer() throws Exception { - THttpClient httpClient = new THttpClient( - "http://"+ HConstants.LOCALHOST + ":" + port); - httpClient.open(); - try { - TProtocol prot; - prot = new TBinaryProtocol(httpClient); - Hbase.Client client = new Hbase.Client(prot); - if (!tableCreated){ - TestThriftServer.createTestTables(client); - tableCreated = true; - } - TestThriftServer.checkTableList(client); - } finally { - httpClient.close(); - } - } - - private void stopHttpServerThread() throws Exception { - LOG.debug("Stopping " + " Thrift HTTP server"); - thriftServer.stop(); - httpServerThread.join(); - if (httpServerException != null) { - LOG.error("Command-line invocation of HBase Thrift server threw an " + - "exception", httpServerException); - throw new Exception(httpServerException); - } - } -} http://git-wip-us.apache.org/repos/asf/hbase/blob/d918570c/hbase-thrift/src/test/java/org/apache/hadoop/hbase/thrift/TestThriftServerCmdLine.java ---------------------------------------------------------------------- diff --git a/hbase-thrift/src/test/java/org/apache/hadoop/hbase/thrift/TestThriftServerCmdLine.java b/hbase-thrift/src/test/java/org/apache/hadoop/hbase/thrift/TestThriftServerCmdLine.java index 9446d2f..b350d80 100644 --- a/hbase-thrift/src/test/java/org/apache/hadoop/hbase/thrift/TestThriftServerCmdLine.java +++ b/hbase-thrift/src/test/java/org/apache/hadoop/hbase/thrift/TestThriftServerCmdLine.java @@ -241,5 +241,7 @@ public class TestThriftServerCmdLine { throw new Exception(cmdLineException); } } + + }
