You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by xe...@apache.org on 2012/10/04 07:19:16 UTC
git commit: Pluggable Thrift transport factories for CLI patch by
Jason Brown and Pavel Yaskevich;
reviewed by Pavel Yaskevich for CASSANDRA-4609
Updated Branches:
refs/heads/cassandra-1.1 d170a7a99 -> 59a6a5d82
Pluggable Thrift transport factories for CLI
patch by Jason Brown and Pavel Yaskevich; reviewed by Pavel Yaskevich for CASSANDRA-4609
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/59a6a5d8
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/59a6a5d8
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/59a6a5d8
Branch: refs/heads/cassandra-1.1
Commit: 59a6a5d82dc088dac8f1d98bc48a6426d75dc1a2
Parents: d170a7a
Author: Pavel Yaskevich <xe...@apache.org>
Authored: Tue Oct 2 18:13:01 2012 -0700
Committer: Pavel Yaskevich <xe...@apache.org>
Committed: Wed Oct 3 22:16:56 2012 -0700
----------------------------------------------------------------------
CHANGES.txt | 1 +
src/java/org/apache/cassandra/cli/CliMain.java | 14 +-----
src/java/org/apache/cassandra/cli/CliOptions.java | 28 +++++++++++++
.../org/apache/cassandra/cli/CliSessionState.java | 8 +++-
.../cli/transport/FramedTransportFactory.java | 30 ++++++++++++++
.../cli/transport/SimpleTransportFactory.java | 32 +++++++++++++++
6 files changed, 100 insertions(+), 13 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/59a6a5d8/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 292db49..d803c0f 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -15,6 +15,7 @@
* add authentication support to sstableloader (CASSANDRA-4712)
* Fix CQL3 'is reversed' logic (CASSANDRA-4716)
* (CQL3) Don't return ReversedType in result set metadata (CASSANDRA-4717)
+ * Pluggable Thrift transport factories for CLI (CASSANDRA-4609)
Merged from 1.0:
* Switch from NBHM to CHM in MessagingService's callback map, which
prevents OOM in long-running instances (CASSANDRA-4708)
http://git-wip-us.apache.org/repos/asf/cassandra/blob/59a6a5d8/src/java/org/apache/cassandra/cli/CliMain.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cli/CliMain.java b/src/java/org/apache/cassandra/cli/CliMain.java
index 2d900ba..9baf676 100644
--- a/src/java/org/apache/cassandra/cli/CliMain.java
+++ b/src/java/org/apache/cassandra/cli/CliMain.java
@@ -31,7 +31,6 @@ import org.apache.cassandra.auth.IAuthenticator;
import org.apache.cassandra.thrift.*;
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
-import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
@@ -62,21 +61,14 @@ public class CliMain
if (transport != null)
transport.close();
- if (sessionState.framed)
- {
- transport = new TFramedTransport(socket);
- }
- else
- {
- transport = socket;
- }
-
+ transport = sessionState.transportFactory.getTransport(socket);
TBinaryProtocol binaryProtocol = new TBinaryProtocol(transport, true, true);
Cassandra.Client cassandraClient = new Cassandra.Client(binaryProtocol);
try
{
- transport.open();
+ if (!transport.isOpen())
+ transport.open();
}
catch (Exception e)
{
http://git-wip-us.apache.org/repos/asf/cassandra/blob/59a6a5d8/src/java/org/apache/cassandra/cli/CliOptions.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cli/CliOptions.java b/src/java/org/apache/cassandra/cli/CliOptions.java
index c582728..982daf5 100644
--- a/src/java/org/apache/cassandra/cli/CliOptions.java
+++ b/src/java/org/apache/cassandra/cli/CliOptions.java
@@ -17,7 +17,9 @@
*/
package org.apache.cassandra.cli;
+import org.apache.cassandra.cli.transport.SimpleTransportFactory;
import org.apache.commons.cli.*;
+import org.apache.thrift.transport.TTransportFactory;
/**
*
@@ -35,6 +37,7 @@ public class CliOptions
private static final String HOST_OPTION = "host";
private static final String PORT_OPTION = "port";
private static final String UNFRAME_OPTION = "unframed";
+ private static final String TRANSPORT_FACTORY = "transport-factory";
private static final String DEBUG_OPTION = "debug";
private static final String USERNAME_OPTION = "username";
private static final String PASSWORD_OPTION = "password";
@@ -64,6 +67,7 @@ public class CliOptions
options.addOption("f", FILE_OPTION, "FILENAME", "load statements from the specific file");
options.addOption(null, JMX_PORT_OPTION, "JMX-PORT", "JMX service port");
options.addOption(null, SCHEMA_MIGRATION_WAIT_TIME, "TIME", "Schema migration wait time (secs.), default is 10 secs");
+ options.addOption("tf", TRANSPORT_FACTORY, "TRANSPORT-FACTORY", "Fully-qualified TTransportFactory class name for creating a connection to cassandra");
// options without argument
options.addOption("B", BATCH_OPTION, "enabled batch mode (suppress output; errors are fatal)");
@@ -98,9 +102,16 @@ public class CliOptions
// Look to see if frame has been specified
if (cmd.hasOption(UNFRAME_OPTION))
{
+ if (cmd.hasOption(TRANSPORT_FACTORY))
+ throw new IllegalArgumentException("--unframed and --transport-factory options should not be fixed.");
+
css.framed = false;
+ css.transportFactory = new SimpleTransportFactory();
}
+ if (cmd.hasOption(TRANSPORT_FACTORY))
+ css.transportFactory = validateAndSetTransportFactory(cmd.getOptionValue(TRANSPORT_FACTORY));
+
// Look to see if frame has been specified
if (cmd.hasOption(DEBUG_OPTION))
{
@@ -222,4 +233,21 @@ public class CliOptions
}
}
+ private static TTransportFactory validateAndSetTransportFactory(String transportFactory)
+ {
+ try
+ {
+ Class factory = Class.forName(transportFactory);
+
+ if(!TTransportFactory.class.isAssignableFrom(factory))
+ throw new IllegalArgumentException(String.format("transport factory '%s' " +
+ "not derived from TTransportFactory", transportFactory));
+
+ return (TTransportFactory) factory.newInstance();
+ }
+ catch (Exception e)
+ {
+ throw new IllegalArgumentException(String.format("Cannot create a transport factory '%s'.", transportFactory), e);
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/cassandra/blob/59a6a5d8/src/java/org/apache/cassandra/cli/CliSessionState.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cli/CliSessionState.java b/src/java/org/apache/cassandra/cli/CliSessionState.java
index 9f956fd..0284239 100644
--- a/src/java/org/apache/cassandra/cli/CliSessionState.java
+++ b/src/java/org/apache/cassandra/cli/CliSessionState.java
@@ -18,11 +18,13 @@
package org.apache.cassandra.cli;
-import org.apache.cassandra.tools.NodeProbe;
-
import java.io.InputStream;
import java.io.PrintStream;
+import org.apache.cassandra.cli.transport.FramedTransportFactory;
+import org.apache.cassandra.tools.NodeProbe;
+import org.apache.thrift.transport.TTransportFactory;
+
/**
* Used to hold the state for the CLI.
*/
@@ -41,6 +43,8 @@ public class CliSessionState
public int jmxPort = 7199;// JMX service port
public boolean verbose = false; // verbose output
public int schema_mwt = 10 * 1000; // Schema migration wait time (secs.)
+ public TTransportFactory transportFactory = new FramedTransportFactory();
+
/*
* Streams to read/write from
*/
http://git-wip-us.apache.org/repos/asf/cassandra/blob/59a6a5d8/src/java/org/apache/cassandra/cli/transport/FramedTransportFactory.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cli/transport/FramedTransportFactory.java b/src/java/org/apache/cassandra/cli/transport/FramedTransportFactory.java
new file mode 100644
index 0000000..ffe7b00
--- /dev/null
+++ b/src/java/org/apache/cassandra/cli/transport/FramedTransportFactory.java
@@ -0,0 +1,30 @@
+/**
+ * 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.cassandra.cli.transport;
+
+import org.apache.thrift.transport.TFramedTransport;
+import org.apache.thrift.transport.TTransport;
+import org.apache.thrift.transport.TTransportFactory;
+
+public class FramedTransportFactory extends TTransportFactory
+{
+ public TTransport getTransport(TTransport base)
+ {
+ return new TFramedTransport(base);
+ }
+}
http://git-wip-us.apache.org/repos/asf/cassandra/blob/59a6a5d8/src/java/org/apache/cassandra/cli/transport/SimpleTransportFactory.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cli/transport/SimpleTransportFactory.java b/src/java/org/apache/cassandra/cli/transport/SimpleTransportFactory.java
new file mode 100644
index 0000000..8b46646
--- /dev/null
+++ b/src/java/org/apache/cassandra/cli/transport/SimpleTransportFactory.java
@@ -0,0 +1,32 @@
+/**
+ * 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.cassandra.cli.transport;
+
+import org.apache.thrift.transport.TTransport;
+import org.apache.thrift.transport.TTransportFactory;
+
+/**
+ * Almost a noop factory, getTransport() method returns back the argument
+ */
+public class SimpleTransportFactory extends TTransportFactory
+{
+ public TTransport getTransport(TTransport transport)
+ {
+ return transport;
+ }
+}