提交 bfaa1bd2 编写于 作者: D Dhruba Borthakur

Cleanup thrift header files.

Move thrift api  from thrift/leveldb.thrift to thrift/if/leveldb.thrift

Summary:

Test Plan:

Reviewers:

CC:

Task ID: #

Blame Rev:
上级 d11b637f
This directory has the thrift server code that exposes leveldb apis.
The thrift api is specified in thrift/if/leveldb.thrift.
The thrift header files are in ./thrift/lib. These are part of
Apache Thrift code base and are needed for compilation of the leveldb
thrift server. The thrift libraries are copied into ./thrift/libs.
......@@ -16,3 +18,8 @@ enviroment variables appropriately:
You can run the leveldb server unit tests by
./leveldb_server_test
You can regenerate the thrift cpp files by doing the following
cd ./thrift
thrift --gen cpp if/leveldb.thrift
......@@ -28,6 +28,19 @@ extern const std::map<int, const char*> _CompressionType_VALUES_TO_NAMES;
extern const std::map<const char*, int, apache::thrift::ltstr> _CompressionType_NAMES_TO_VALUES;
} // namespace
namespace apache { namespace thrift {
template<>
inline constexpr ::Tleveldb::CompressionType TEnumTraits< ::Tleveldb::CompressionType>::min() {
return ::Tleveldb::CompressionType::kNoCompression;
}
template<>
inline constexpr ::Tleveldb::CompressionType TEnumTraits< ::Tleveldb::CompressionType>::max() {
return ::Tleveldb::CompressionType::kSnappyCompression;
}
}} // apache:thrift
namespace Tleveldb {
enum Code {
kOk = 0,
kNotFound = 1,
......@@ -42,6 +55,19 @@ extern const std::map<int, const char*> _Code_VALUES_TO_NAMES;
extern const std::map<const char*, int, apache::thrift::ltstr> _Code_NAMES_TO_VALUES;
} // namespace
namespace apache { namespace thrift {
template<>
inline constexpr ::Tleveldb::Code TEnumTraits< ::Tleveldb::Code>::min() {
return ::Tleveldb::Code::kOk;
}
template<>
inline constexpr ::Tleveldb::Code TEnumTraits< ::Tleveldb::Code>::max() {
return ::Tleveldb::Code::kEnd;
}
}} // apache:thrift
namespace Tleveldb {
enum IteratorType {
seekToFirst = 0,
seekToLast = 1,
......@@ -52,6 +78,19 @@ extern const std::map<int, const char*> _IteratorType_VALUES_TO_NAMES;
extern const std::map<const char*, int, apache::thrift::ltstr> _IteratorType_NAMES_TO_VALUES;
} // namespace
namespace apache { namespace thrift {
template<>
inline constexpr ::Tleveldb::IteratorType TEnumTraits< ::Tleveldb::IteratorType>::min() {
return ::Tleveldb::IteratorType::seekToFirst;
}
template<>
inline constexpr ::Tleveldb::IteratorType TEnumTraits< ::Tleveldb::IteratorType>::max() {
return ::Tleveldb::IteratorType::seekToKey;
}
}} // apache:thrift
namespace Tleveldb {
typedef std::string Text;
typedef std::string Bytes;
......
# TARGETS file for thrift/lib/cpp
cpp_library (
name = "thrift_exception",
srcs = [
"TApplicationException.cpp",
],
external_deps = [
('boost', None),
],
)
cpp_library (
name = "thrift",
srcs = [
"VirtualProfiling.cpp",
],
deps = [
"@/thrift/lib/cpp:thrift_base",
"@/thrift/lib/cpp/concurrency",
"@/thrift/lib/cpp/processor",
"@/thrift/lib/cpp/protocol",
"@/thrift/lib/cpp/server",
"@/thrift/lib/cpp/transport",
"@/thrift/lib/cpp:thrift_exception",
]
)
cpp_library (
name = "thrift_base",
srcs = [
"Thrift.cpp",
"EventHandlerBase.cpp",
],
external_deps = [
('boost', None),
],
)
cpp_library(
name = "reflection",
srcs = [],
deps = [
"@/thrift/lib/thrift:reflection-cpp",
],
)
......@@ -77,6 +77,16 @@ struct TEnumTraits {
* Note the use of helper function 'findValue(...)', below.
*/
static bool findValue(const char* name, T* outValue);
/**
* Return the minimum value.
*/
static constexpr T min();
/**
* Return the maximum value.
*/
static constexpr T max();
private:
/**
* Helper method used by codegen implementation of findName, Supports
......@@ -216,6 +226,12 @@ extern TOutput GlobalOutput;
* Should never be instantiated, only caught.
*/
class TException : public std::exception {
public:
TException() {}
TException(TException&&) {}
TException(const TException&) {}
TException& operator=(const TException&) { return *this; }
TException& operator=(TException&&) { return *this; }
};
/**
......
# The base async library
cpp_library(
name = 'async_base',
srcs = [
'TAsyncServerSocket.cpp',
'TAsyncSignalHandler.cpp',
'TAsyncSocket.cpp',
'TAsyncTimeout.cpp',
'TBinaryAsyncChannel.cpp',
'THeaderAsyncChannel.cpp',
'TEventBase.cpp',
'TEventBaseManager.cpp',
'TEventHandler.cpp',
'TFramedAsyncChannel.cpp',
'TNotificationPipe.cpp',
'TUnframedAsyncChannel.cpp',
'THttpAsyncChannel.cpp',
],
deps = [
'@/folly/experimental/io',
'@/thrift/lib/cpp:thrift_base',
'@/thrift/lib/cpp/transport',
'@/thrift/lib/cpp/transport:header',
'@/thrift/lib/cpp/protocol',
'@/thrift/lib/cpp/server',
'@/thrift/lib/cpp/util:httpparser',
],
external_deps = [ ('libevent', None) ],
)
# TEventServer library (async name is used all over), now depends on ssl
cpp_library(
name = 'async',
srcs = [
'TEventConnection.cpp',
'TEventServer.cpp',
'TEventTask.cpp',
'TEventWorker.cpp',
],
deps = [
':async_ssl',
],
)
cpp_library (
name = "async_ssl",
srcs = [
'TAsyncSSLServerSocket.cpp',
'TAsyncSSLSocket.cpp',
],
deps = [
":async_base",
"@/thrift/lib/cpp/transport:transport_ssl",
],
external_deps = [ ("openssl", None, "ssl"),
("openssl", None, "crypto") ],
)
# This library is the same as async_ssl, except that it has the debug
# logging level set to 4, whereas async_ssl has debug logging disabled.
cpp_library (
name = "async_ssl_log",
srcs = [
'TAsyncSSLServerSocket.cpp',
'TAsyncSSLSocket.cpp',
],
deps = [
":async_base",
"@/thrift/lib/cpp/transport:transport_ssl",
],
external_deps = [ ("openssl", None, "ssl"),
("openssl", None, "crypto") ],
preprocessor_flags = [
"-DT_GLOBAL_DEBUGGING_LEVEL=4"
],
output_subdir = "async_ssl_log",
)
cpp_library(
name = 'zlib',
srcs = [
'TZlibAsyncChannel.cpp',
],
deps = [
':async',
'@/thrift/lib/cpp/transport:zlib',
],
)
# Parts of the async library that depend on C++11 features.
# This is separate from the main async library for now so that users who cannot
# depend on C++11 features yet will still be able to use the bulk of the async
# library.
cpp_library(
name = 'async_cxx11',
srcs = [
'TAsyncTimeoutSet.cpp',
],
deps = [
':async_base',
'@/folly',
],
)
......@@ -103,6 +103,12 @@ class TAsyncChannel {
return sendAndRecvMessage(cob, cob, sendBuf, recvBuf);
}
/**
* Cancel pending callbacks. Use this when the channel is closing because the
* server had been shut down.
*/
virtual void cancelCallbacks() = 0;
// TODO(dreiss): Make this nonvirtual when TFramedSocketAsyncChannel gets
// renamed to TFramedAsyncChannel.
virtual boost::shared_ptr<TAsyncTransport> getTransport() = 0;
......
......@@ -120,6 +120,14 @@ class TAsyncSSLSocket : public TAsyncSocket {
TAsyncSSLSocket* sslSocket_;
};
/**
* These are passed to the application via errno, so values have to be
* outside the valid errno range
*/
enum SSLError {
SSL_CLIENT_RENEGOTIATION_ATTEMPT = 0x8001
};
/**
* Create a client TAsyncSSLSocket
*/
......@@ -128,6 +136,8 @@ class TAsyncSSLSocket : public TAsyncSocket {
TAsyncSocket(evb),
corked_(false),
server_(false),
handshakeComplete_(false),
renegotiateAttempted_(false),
sslState_(STATE_UNINIT),
ctx_(ctx),
handshakeCallback_(NULL),
......@@ -176,7 +186,7 @@ class TAsyncSSLSocket : public TAsyncSocket {
}
/**
* TODO: implement support for SSL renegosiation.
* TODO: implement support for SSL renegotiation.
*
* This involves proper handling of the SSL_ERROR_WANT_READ/WRITE
* code as a result of SSL_write/read(), instead of returning an
......@@ -293,6 +303,41 @@ class TAsyncSSLSocket : public TAsyncSocket {
*/
bool getSSLSessionReused() const;
/**
* Get the negociated cipher name for this SSL connection.
* Returns the cipher used or the constant value "NONE" when no SSL session
* has been established.
*/
const char *getNegotiatedCipherName() const;
/**
* Get the SSL version for this connection.
* Possible return values are SSL2_VERSION, SSL3_VERSION, TLS1_VERSION,
* with hexa representations 0x200, 0x300, 0x301,
* or 0 if no SSL session has been established.
*/
int getSSLVersion() const;
/* Get the number of bytes read from the wire (including protocol
* overhead). Returns 0 once the connection has been closed.
*/
unsigned long getBytesRead() const {
if (ssl_ != NULL) {
return BIO_number_read(SSL_get_rbio(ssl_));
}
return 0;
}
/* Get the number of bytes written to the wire (including protocol
* overhead). Returns 0 once the connection has been closed.
*/
unsigned long getBytesWritten() const {
if (ssl_ != NULL) {
return BIO_number_written(SSL_get_wbio(ssl_));
}
return 0;
}
virtual void attachEventBase(TEventBase* eventBase) {
TAsyncSocket::attachEventBase(eventBase);
handshakeTimeout_.attachEventBase(eventBase);
......@@ -339,10 +384,18 @@ class TAsyncSSLSocket : public TAsyncSocket {
void invokeHandshakeCallback();
static void sslInfoCallback(const SSL *ssl, int type, int val);
// Whether we've applied the TCP_CORK option to the socket
bool corked_;
// SSL related members.
bool server_;
// Used to prevent client-initiated renegotiation. Note that TAsyncSSLSocket
// doesn't fully support renegotiation, so we could just fail all attempts
// to enforce this. Once it is supported, we should make it an option
// to disable client-initiated renegotiation.
bool handshakeComplete_;
bool renegotiateAttempted_;
SSLStateEnum sslState_;
boost::shared_ptr<transport::SSLContext> ctx_;
// Callback for SSL_accept() or SSL_connect()
......
......@@ -285,6 +285,32 @@ class TAsyncSocket : public TAsyncTransport,
return sendTimeout_;
}
/**
* Set the maximum number of reads to execute from the underlying
* socket each time the TEventBase detects that new ingress data is
* available. The default is unlimited, but callers can use this method
* to limit the amount of data read from the socket per event loop
* iteration.
*
* @param maxReads Maximum number of reads per data-available event;
* a value of zero means unlimited.
*/
void setMaxReadsPerEvent(uint16_t maxReads) {
maxReadsPerEvent_ = maxReads;
}
/**
* Get the maximum number of reads this object will execute from
* the underlying socket each time the TEventBase detects that new
* ingress data is available.
*
* @returns Maximum number of reads per data-available event; a value
* of zero means unlimited.
*/
uint16_t getMaxReadsPerEvent() const {
return maxReadsPerEvent_;
}
// Methods inherited from TAsyncTransport
// See the documentation in TAsyncTransport.h
virtual void setReadCallback(ReadCallback* callback);
......@@ -298,6 +324,7 @@ class TAsyncSocket : public TAsyncTransport,
virtual void close();
virtual void closeNow();
virtual void closeWithReset();
virtual void shutdownWrite();
virtual void shutdownWriteNow();
......@@ -333,6 +360,24 @@ class TAsyncSocket : public TAsyncTransport,
*/
int setNoDelay(bool noDelay);
/*
* Forces ACKs to be sent immediately
*
* @return Returns 0 if the TCP_QUICKACK flag was successfully updated,
* or a non-zero errno value on error.
*/
int setQuickAck(bool quickack);
/**
* Set the send bufsize
*/
int setSendBufSize(size_t bufsize);
/**
* Set the recv bufsize
*/
int setRecvBufSize(size_t bufsize);
/**
* Generic API for reading a socket option.
*
......@@ -459,6 +504,19 @@ class TAsyncSocket : public TAsyncTransport,
*/
virtual ssize_t performRead(void* buf, size_t buflen);
/**
* Populate an iovec array from an IOBuf and attempt to write it.
*
* @param callback Write completion/error callback.
* @param vec Target iovec array; caller retains ownership.
* @param count Number of IOBufs to write, beginning at start of buf.
* @param buf Chain of iovecs.
* @param cork Whether to delay the output until a subsequent
* non-corked write.
*/
void writeChainImpl(WriteCallback* callback, iovec* vec,
size_t count, std::unique_ptr<folly::IOBuf>&& buf, bool cork);
/**
* Write as much data as possible to the socket without blocking,
* and queue up any leftover data to send when the socket can
......@@ -536,6 +594,7 @@ class TAsyncSocket : public TAsyncTransport,
uint16_t eventFlags_; ///< TEventBase::HandlerFlags settings
int fd_; ///< The socket file descriptor
uint32_t sendTimeout_; ///< The send timeout, in milliseconds
uint16_t maxReadsPerEvent_; ///< Max reads per event loop iteration
TEventBase* eventBase_; ///< The TEventBase
WriteTimeout writeTimeout_; ///< A timeout for connect and write
IoHandler ioHandler_; ///< A TEventHandler to monitor the fd
......
......@@ -286,6 +286,20 @@ class TAsyncTransport {
*/
virtual void closeNow() = 0;
/**
* Reset the transport immediately.
*
* This closes the transport immediately, sending a reset to the remote peer
* if possible to indicate abnormal shutdown.
*
* Note that not all subclasses implement this reset functionality: some
* subclasses may treat reset() the same as closeNow(). Subclasses that use
* TCP transports should terminate the connection with a TCP reset.
*/
virtual void closeWithReset() {
closeNow();
}
/**
* Perform a half-shutdown of the write side of the transport.
*
......
......@@ -246,6 +246,11 @@ class TEventServer : public apache::thrift::server::TServer {
*/
uint32_t maxNumMsgsInPipe_;
/**
* The max number of active connections for each worker
*/
int32_t maxNumActiveConnectionsPerWorker_;
/**
* The transport type to use
*/
......@@ -320,6 +325,7 @@ class TEventServer : public apache::thrift::server::TServer {
queuingMode_(false),
acceptRateAdjustSpeed_(0),
maxNumMsgsInPipe_(T_MAX_NUM_MESSAGES_IN_PIPE),
maxNumActiveConnectionsPerWorker_(0),
transportType_(T_ASYNC_DEFAULT_TRANSPORT_TYPE) {
processor->setAsyncServer(this);
}
......@@ -360,6 +366,7 @@ class TEventServer : public apache::thrift::server::TServer {
queuingMode_(false),
acceptRateAdjustSpeed_(0),
maxNumMsgsInPipe_(T_MAX_NUM_MESSAGES_IN_PIPE),
maxNumActiveConnectionsPerWorker_(0),
transportType_(T_ASYNC_DEFAULT_TRANSPORT_TYPE) {
processor->setAsyncServer(this);
......@@ -407,6 +414,7 @@ class TEventServer : public apache::thrift::server::TServer {
queuingMode_(false),
acceptRateAdjustSpeed_(0),
maxNumMsgsInPipe_(T_MAX_NUM_MESSAGES_IN_PIPE),
maxNumActiveConnectionsPerWorker_(0),
transportType_(T_ASYNC_DEFAULT_TRANSPORT_TYPE) {
processor->setAsyncServer(this);
......@@ -452,6 +460,7 @@ class TEventServer : public apache::thrift::server::TServer {
queuingMode_(false),
acceptRateAdjustSpeed_(0),
maxNumMsgsInPipe_(T_MAX_NUM_MESSAGES_IN_PIPE),
maxNumActiveConnectionsPerWorker_(0),
transportType_(T_ASYNC_DEFAULT_TRANSPORT_TYPE) {
processor->setAsyncServer(this);
......@@ -498,6 +507,7 @@ class TEventServer : public apache::thrift::server::TServer {
queuingMode_(true),
acceptRateAdjustSpeed_(0),
maxNumMsgsInPipe_(T_MAX_NUM_MESSAGES_IN_PIPE),
maxNumActiveConnectionsPerWorker_(0),
transportType_(T_ASYNC_DEFAULT_TRANSPORT_TYPE) {
setProtocolFactory(protocolFactory);
setThreadManager(threadManager);
......@@ -542,6 +552,7 @@ class TEventServer : public apache::thrift::server::TServer {
queuingMode_(true),
acceptRateAdjustSpeed_(0),
maxNumMsgsInPipe_(T_MAX_NUM_MESSAGES_IN_PIPE),
maxNumActiveConnectionsPerWorker_(0),
transportType_(T_ASYNC_DEFAULT_TRANSPORT_TYPE) {
setDuplexProtocolFactory(duplexProtocolFactory);
setThreadManager(threadManager);
......@@ -671,6 +682,21 @@ class TEventServer : public apache::thrift::server::TServer {
maxNumMsgsInPipe_ = num;
}
/**
* Get the maxmum number of active connections each TAsyncWorker can have
*/
int32_t getMaxNumActiveConnectionsPerWorker() const {
return maxNumActiveConnectionsPerWorker_;
}
/**
* Set the maxmum number of active connections each TAsyncWorker can have.
* Zero means unlimited
*/
void setMaxNumActiveConnectionsPerWorker(int32_t num) {
maxNumActiveConnectionsPerWorker_ = num;
}
/**
* Get the speed of adjusting connection accept rate.
*/
......
......@@ -129,6 +129,9 @@ class TEventWorker :
*/
ConnectionMap activeConnectionMap_;
// Max number of active connections
int32_t maxNumActiveConnections_;
public:
/**
......@@ -156,7 +159,8 @@ class TEventWorker :
server_(server),
eventBase_(),
workerID_(workerID),
transportType_(TEventServer::FRAMED) {
transportType_(TEventServer::FRAMED),
maxNumActiveConnections_(0) {
setDuplexProtocolFactory(protocolFactory);
transportType_ = server->getTransportType();
......@@ -212,6 +216,14 @@ class TEventWorker :
return workerID_;
}
void setMaxNumActiveConnections(int32_t numActiveConnections) {
maxNumActiveConnections_ = numActiveConnections;
}
int32_t getMaxNumActiveConnections() const {
return maxNumActiveConnections_;
}
/**
* Dispose of a TEventConnection object.
* Will add to a pool of these objects or destroy as necessary.
......
......@@ -175,7 +175,7 @@ class TNotificationQueue {
FdType fdType = FdType::EVENTFD)
: spinlock_(),
eventfd_(-1),
pipeFds_({-1, -1}),
pipeFds_{-1, -1},
advisoryMaxQueueSize_(maxSize),
queue_() {
if (fdType == FdType::EVENTFD) {
......
......@@ -194,7 +194,8 @@ class TStreamAsyncChannel : public TAsyncEventChannel,
protected TAsyncTransport::WriteCallback,
protected TAsyncTimeout {
public:
TStreamAsyncChannel(const boost::shared_ptr<TAsyncTransport>& transport);
explicit TStreamAsyncChannel(
const boost::shared_ptr<TAsyncTransport>& transport);
/**
* Helper function to create a shared_ptr<TStreamAsyncChannel>.
......@@ -328,6 +329,15 @@ class TStreamAsyncChannel : public TAsyncEventChannel,
return recvTimeout_;
}
/**
* Cancel pending callbacks. Use this when the channel is closing because the
* server had been shut down.
*/
virtual void cancelCallbacks() {
readCallback_ = NULL;
readErrorCallback_ = NULL;
}
/**
* Get the TAsyncTransport used by this channel.
*/
......@@ -407,6 +417,11 @@ class TStreamAsyncChannel : public TAsyncEventChannel,
return req;
}
void clearCallbacks() {
readCallback_ = NULL;
readErrorCallback_ = NULL;
}
void failAllReads();
boost::shared_ptr<TAsyncTransport> transport_;
......
......@@ -26,7 +26,8 @@ namespace apache { namespace thrift { namespace async {
class TZlibAsyncChannel : public TAsyncEventChannel {
public:
TZlibAsyncChannel(const boost::shared_ptr<TAsyncEventChannel>& channel);
explicit TZlibAsyncChannel(
const boost::shared_ptr<TAsyncEventChannel>& channel);
/**
* Helper function to create a shared_ptr<TZlibAsyncChannel>.
......@@ -85,6 +86,11 @@ class TZlibAsyncChannel : public TAsyncEventChannel {
channel_->setRecvTimeout(milliseconds);
}
virtual void cancelCallbacks() {
sendRequest_.cancelCallbacks();
recvRequest_.cancelCallbacks();
}
protected:
/**
* Protected destructor.
......@@ -109,6 +115,11 @@ class TZlibAsyncChannel : public TAsyncEventChannel {
void send(TAsyncEventChannel* channel);
void cancelCallbacks() {
callback_ = NULL;
errorCallback_ = NULL;
}
private:
void invokeCallback(VoidCallback callback);
void sendSuccess();
......@@ -137,6 +148,11 @@ class TZlibAsyncChannel : public TAsyncEventChannel {
void recv(TAsyncEventChannel* channel);
void cancelCallbacks() {
callback_ = NULL;
errorCallback_ = NULL;
}
private:
void invokeCallback(VoidCallback callback);
void recvSuccess();
......
......@@ -68,27 +68,37 @@ class PosixThreadFactory : public ThreadFactory {
DECREMENT = 8
};
static const POLICY kDefaultPolicy = ROUND_ROBIN;
static const PRIORITY kDefaultPriority = NORMAL;
static const int kDefaultStackSizeMB = 1;
/**
* Posix thread (pthread) factory. All threads created by a factory are reference-counted
* via boost::shared_ptr and boost::weak_ptr. The factory guarantees that threads and
* the Runnable tasks they host will be properly cleaned up once the last strong reference
* to both is given up.
* Posix thread (pthread) factory. All threads created by a factory are
* reference-counted via boost::shared_ptr and boost::weak_ptr. The factory
* guarantees that threads and the Runnable tasks they host will be properly
* cleaned up once the last strong reference to both is given up.
*
* Threads are created with the specified policy, priority, stack-size and detachable-mode
* detached means the thread is free-running and will release all system resources the
* when it completes. A detachable thread is not joinable. The join method
* of a detachable thread will return immediately with no error.
* Threads are created with the specified policy, priority, stack-size and
* detachable-mode detached means the thread is free-running and will release
* all system resources the when it completes. A detachable thread is not
* joinable. The join method of a detachable thread will return immediately
* with no error.
*
* By default threads are not joinable.
*/
explicit PosixThreadFactory(POLICY policy=ROUND_ROBIN,
PRIORITY priority=NORMAL,
int stackSize=1,
explicit PosixThreadFactory(POLICY policy=kDefaultPolicy,
PRIORITY priority=kDefaultPriority,
int stackSize=kDefaultStackSizeMB,
bool detached=true);
explicit PosixThreadFactory(DetachState detached);
// From ThreadFactory;
boost::shared_ptr<Thread> newThread(boost::shared_ptr<Runnable> runnable) const;
boost::shared_ptr<Thread> newThread(
const boost::shared_ptr<Runnable>& runnable) const;
boost::shared_ptr<Thread> newThread(
const boost::shared_ptr<Runnable>& runnable,
DetachState detachState) const;
// From ThreadFactory;
Thread::id_t getCurrentThreadId() const;
......@@ -121,6 +131,7 @@ class PosixThreadFactory : public ThreadFactory {
* Sets detached mode of threads
*/
virtual void setDetached(bool detached);
virtual void setDetached(DetachState detached);
/**
* Gets current detached mode
......
# TARGETS file for thrift/lib/cpp/concurrency
cpp_library (
name = "concurrency",
srcs = [
"Util.cpp",
"Monitor.cpp",
"Mutex.cpp",
"PosixThreadFactory.cpp",
"ThreadManager.cpp",
"TimerManager.cpp"
],
deps = [ '@/common/base:profiler',
'@/thrift/lib/cpp:thrift_base' ],
)
......@@ -110,8 +110,18 @@ class Thread {
class ThreadFactory {
public:
enum DetachState {
ATTACHED,
DETACHED
};
virtual ~ThreadFactory() {}
virtual boost::shared_ptr<Thread> newThread(boost::shared_ptr<Runnable> runnable) const = 0;
virtual boost::shared_ptr<Thread> newThread(
const boost::shared_ptr<Runnable>& runnable) const = 0;
virtual boost::shared_ptr<Thread> newThread(
const boost::shared_ptr<Runnable>& runnable,
DetachState detachState) const = 0;
/** Gets the current thread id or unknown_thread_id if the current thread is not a thrift thread */
......
# TARGETS file for thrift/lib/cpp/concurrency/test
cpp_binary (
name = "test",
srcs = [
"Tests.cpp"
],
deps = [
"@/thrift/lib/cpp/concurrency"
]
)
cpp_unittest (
name = "test_mutex",
srcs = [
"RWMutexTest.cpp"
],
deps = [
"@/thrift/lib/cpp/concurrency",
"@/thrift/lib/cpp:thrift",
],
external_deps = [
('boost', '>= 1.37', 'boost_unit_test_framework'),
],
type = 'boost',
owner = 'putivsky',
emails = ['adback-dev@lists.facebook.com',
'thrift-team@lists.facebook.com'],
)
cpp_unittest(
name = 'ThreadManagerTests',
srcs = [
'ThreadManagerTests.cpp',
],
deps = [
'@/thrift/lib/cpp/concurrency',
],
external_deps = [
('boost', '>= 1.37', 'boost_unit_test_framework'),
],
type = 'boost',
emails = ['thrift-team@lists.facebook.com'],
)
# TARGETS file for thrift/lib/cpp/processor
cpp_library (
name = "processor",
srcs = [
"PeekProcessor.cpp"
],
deps = [ "@/thrift/lib/cpp/transport" ]
)
cpp_unittest(
name = 'ProcessorTest',
srcs = [
'EventLog.cpp',
'ProcessorTest.cpp',
'ServerThread.cpp',
],
deps = [
':thrift',
'@/thrift/lib/cpp/server:nonblocking',
],
external_deps = [
# Versions of boost lower than 1.37 don't support BOOST_AUTO_TEST_CASE.
('boost', '>= 1.37', 'boost_unit_test_framework'),
],
type = 'boost',
emails = ['thrift-team@lists.facebook.com'],
)
cpp_library(
name = 'thrift',
thrift_srcs = { 'proc.thrift' : ['ParentService', 'ChildService']},
thrift_cpp_options = 'templates',
)
# TARGETS file for thrift/lib/cpp/protocol
cpp_library (
name = "protocol",
srcs = [
"TBase64Utils.cpp",
"TDebugProtocol.cpp",
"TJSONProtocol.cpp",
"TSimpleJSONProtocol.cpp",
"THeaderProtocol.cpp",
"TPhpSerializeProtocol.cpp",
],
deps = [
"@/thrift/lib/cpp/transport",
"@/thrift/lib/cpp/transport:header",
"@/thrift/lib/cpp:thrift_exception",
],
)
......@@ -37,6 +37,8 @@ class TCompactProtocolT
static const int8_t VERSION_N = 2;
static const int8_t VERSION_LOW = 1;
static const int8_t VERSION_DOUBLE_BE = 2;
static const int8_t PROTOCOL_ID = static_cast<int8_t>(0x82);
static const int8_t VERSION_MASK = 0x1f; // 0001 1111
protected:
// Normally we can define static const data members of integral
......@@ -44,10 +46,8 @@ class TCompactProtocolT
// high bit is set (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49896)
// unless we cast to a value that fits in an int8_t (0x82 and 0xE0 are
// uint8_t)
static const int8_t PROTOCOL_ID = static_cast<int8_t>(0x82);
static const int8_t TYPE_MASK = static_cast<int8_t>(0xE0);
static const int8_t VERSION_MASK = 0x1f; // 0001 1111
static const int8_t TYPE_MASK = static_cast<int8_t>(0xE0);
static const int32_t TYPE_SHIFT_AMOUNT = 5;
Transport_* trans_;
......
# Copyright 2011 Facebook
# @author Tudor Bosman (tudorb@fb.com)
cpp_library(
name = "neutronium",
srcs = [
"Schema.cpp",
"Encoder.cpp",
"Decoder.cpp",
"InternTable.cpp",
],
thrift_srcs = {
"intern_table.thrift": [],
},
deps = [
"@/folly",
"@/folly/experimental/io",
"@/thrift/lib/cpp/protocol",
],
external_deps = [
("boost", None, "boost"),
],
)
# Copyright 2011 Facebook
# @author Tudor Bosman (tudorb@fb.com)
thrift_library(
name = "if",
thrift_srcs = {
"neutronium_test.thrift" : [],
},
languages = ["cpp"],
thrift_cpp_options = "templates=only,neutronium",
cpp_deps = [],
)
cpp_unittest(
name = "intern_table_test",
srcs = ["InternTableTest.cpp"],
deps = [
"@/thrift/lib/cpp/protocol/neutronium",
"@/external/gflags",
],
external_deps = [
("gtest", None, "gtest_main"),
],
type = 'gtest',
)
cpp_unittest(
name = "neutronium_test",
srcs = ["NeutroniumTest.cpp"],
deps = [
"@/thrift/lib/cpp/protocol/neutronium",
"@/thrift/lib/cpp/util",
":if-cpp",
"@/common/fbunit:old_folly_benchmark",
],
external_deps = [
("gtest", None),
],
type = 'gtest',
)
# TARGETS file for thrift/lib/cpp/server
cpp_library (
name = "server",
srcs = [
"TRpcTransportContext.cpp",
"TServer.cpp",
"TSimpleServer.cpp",
"TThreadedServer.cpp",
"TThreadPoolServer.cpp",
],
deps = [
"@/thrift/lib/cpp/concurrency",
"@/thrift/lib/cpp/transport",
]
)
cpp_library (
name = "nonblocking",
srcs = [ "TNonblockingServer.cpp" ],
deps = [
":server",
"@/thrift/lib/cpp/concurrency",
"@/thrift/lib/cpp/transport",
"@/thrift/lib/cpp/transport:header",
"@/thrift/lib/cpp/protocol:protocol",
],
preprocessor_flags = [ "-DTCP_LOW_MIN_RTO=15" ],
external_deps = [ ('libevent', None) ],
)
cpp_binary (
name = "aggregatorserver_test",
srcs = [
"AggregatorServerTest.cpp",
],
deps = [
"@/thrift/lib/cpp/async",
"@/thrift/lib/cpp/concurrency",
"@/thrift/lib/cpp/protocol",
"@/thrift/lib/cpp/server:nonblocking",
"@/common/fb303/cpp:fb303",
"@/common/base:profiler",
":aggregator_test_thrift",
],
allocator='tcmalloc',
)
cpp_binary (
name = "aggregatorclient_test",
srcs = [
"AggregatorClientTest.cpp",
],
deps = [
"@/thrift/lib/cpp/async",
"@/thrift/lib/cpp/concurrency",
"@/thrift/lib/cpp/protocol",
"@/common/fb303/cpp:fb303",
"@/common/base:profiler",
"@/common/client_mgmt:asyncclient",
"@/common/logging:logging",
":aggregator_test_thrift",
],
allocator='tcmalloc',
)
cpp_library (
name = "aggregator_test_thrift",
thrift_srcs = { "AggregatorTest.thrift" : [ "AggregatorTest" ] },
thrift_cpp_options = "cob_style",
deps = [
"@/common/fb303/if:fb303-cpp",
],
)
cpp_unittest(
name = "conn_ctx_test",
srcs = [
"ConnCtxTest.cpp",
],
thrift_srcs = { "connctx.thrift" : [ "ConnCtxService" ] },
deps = [
"@/thrift/lib/cpp/test:util",
"@/thrift/lib/cpp/util:nonblocking",
],
external_deps = [
('boost', '>= 1.37', 'boost_unit_test_framework'),
],
type = 'boost',
emails = ['thrift-team@lists.facebook.com'],
)
cpp_unittest(
name = 'TEventBaseTest',
srcs = [
'TEventBaseTest.cpp',
],
deps = [
':util',
'@/thrift/lib/cpp/async',
],
external_deps = [
('boost', '>= 1.37', 'boost_unit_test_framework'),
],
type = 'boost',
emails = ['thrift-team@lists.facebook.com'],
)
cpp_unittest(
name = 'TAsyncChannelTest',
srcs = [
'TAsyncChannelTest.cpp',
],
deps = [
':util',
'@/thrift/lib/cpp/async',
],
external_deps = [
('boost', '>= 1.37', 'boost_unit_test_framework'),
],
type = 'boost',
emails = ['thrift-team@lists.facebook.com'],
)
cpp_unittest(
name = 'TAsyncChannelClientTest',
srcs = [
'TAsyncChannelClientTest.cpp',
],
deps = [
':util',
'@/thrift/lib/cpp/async:zlib',
'@/thrift/lib/cpp/util:nonblocking',
'@/thrift/lib/cpp/util:httpparser',
'@/thrift/perf/cpp:load-handler',
],
external_deps = [
('boost', '>= 1.37', 'boost_unit_test_framework'),
],
type = 'boost',
emails = ['thrift-team@lists.facebook.com'],
)
cpp_unittest(
name = 'TAsyncSocketTest',
srcs = [
'TAsyncSocketTest.cpp',
],
deps = [
':util',
'@/thrift/lib/cpp/async',
],
external_deps = [
('boost', '>= 1.37', 'boost_unit_test_framework'),
],
type = 'boost',
emails = ['thrift-team@lists.facebook.com'],
)
cpp_unittest(
name = 'TAsyncSSLSocketTest',
srcs = [
'TAsyncSSLSocketTest.cpp',
],
deps = [
':util',
'@/thrift/lib/cpp/async:async_ssl',
],
external_deps = [
('boost', '>= 1.37', 'boost_unit_test_framework'),
],
type = 'boost',
emails = ['ti-bugs@lists.facebook.com',
'thrift-team@lists.facebook.com'],
)
cpp_unittest(
name = 'TAsyncTimeoutSetTest',
srcs = [
'TAsyncTimeoutSetTest.cpp',
],
deps = [
':util',
'@/thrift/lib/cpp/async:async_cxx11',
],
type = 'boost',
emails = ['thrift-team@lists.facebook.com'],
)
cpp_unittest(
name = 'TNotificationQueueTest',
srcs = [
'TNotificationQueueTest.cpp',
],
deps = [
':async_util',
'@/thrift/lib/cpp/async:async_cxx11',
],
type = 'boost',
emails = ['thrift-team@lists.facebook.com'],
)
cpp_unittest(
name = 'TNotificationPipeTest',
srcs = [
'TNotificationPipeTest.cpp',
],
deps = [
':async_util',
':util',
'@/thrift/lib/cpp/async',
],
external_deps = [
('boost', '>= 1.37', 'boost_unit_test_framework'),
],
type = 'boost',
emails = ['thrift-team@lists.facebook.com'],
)
cpp_library(
name = 'util',
srcs = [
'NetworkUtil.cpp',
'SocketPair.cpp',
'TimeUtil.cpp',
],
deps = [
'@/thrift/lib/cpp/transport',
],
)
cpp_library(
name = 'async_util',
srcs = [
'ScopedEventBaseThread.cpp',
],
deps = [
'@/thrift/lib/cpp/async',
'@/thrift/lib/cpp/concurrency',
],
)
cpp_library (
name = "DebugProtocolLib",
thrift_srcs = {
"DebugProtocolTest.thrift" : "DebugProtocolService"
},
thrift_cpp_options = "templates"
)
cpp_binary (
name = "DebugProtocol",
srcs = [
"DebugProtocolTest.cpp",
],
deps = [
":DebugProtocolLib",
],
)
cpp_library(
name = 'loadgen',
srcs = [
'Controller.cpp',
'LatencyMonitor.cpp',
'LatencyScoreBoard.cpp',
'LoadConfig.cpp',
'loadgen.cpp',
'QpsMonitor.cpp',
'QpsScoreBoard.cpp',
'RNG.cpp',
'TerminalMonitor.cpp',
'WeightedLoadConfig.cpp',
],
deps = [
'@/common/time:time',
],
external_deps = [
('boost', None, 'boost'),
],
)
cpp_binary(
name = 'perftest',
srcs = [
'PerfTest.cpp',
],
deps = [
':loadgen',
'@/common/config',
],
)
# TARGETS file for thrift/lib/cpp/transport
cpp_library(
name = "transport",
srcs = [
"TFileTransport.cpp",
"TFDTransport.cpp",
"THttpClient.cpp",
"THttpServer.cpp",
"THttpTransport.cpp",
"TServerSocket.cpp",
"TSimpleFileTransport.cpp",
"TSocket.cpp",
"TSocketAddress.cpp",
"TSocketPool.cpp",
"TTransportException.cpp",
"TTransportUtils.cpp",
"TBufferTransports.cpp",
"TMemPagedFactory.cpp",
"TMemPagedTransport.cpp",
],
deps = [
"@/thrift/lib/cpp:thrift_base",
"@/thrift/lib/cpp/concurrency",
"@/external/google_base",
],
preprocessor_flags = [ "-DTCP_LOW_MIN_RTO=15" ],
)
cpp_library(
name = "transport_ssl",
srcs = [
"TSSLSocket.cpp",
"TSSLServerSocket.cpp",
],
deps = [
":transport",
"@/thrift/lib/cpp/concurrency",
],
external_deps = [ ('openssl', None, 'ssl') ],
)
cpp_library(
name = "header",
srcs = [ "THeaderTransport.cpp",
"THeader.cpp" ],
deps = [
":transport",
"@/folly/experimental/io:io",
"@/thrift/lib/cpp/util:internal_util",
],
external_deps = [ ('zlib', None, 'z'),
('snappy', None)
],
)
cpp_library(
name = "zlib",
srcs = [ "TZlibTransport.cpp" ],
deps = [
":transport",
],
external_deps = [ ('zlib', None, 'z') ],
)
cpp_library(
name = "hdfs_transport",
srcs = [ "HDFS.cpp",
"THDFSFileTransport.cpp",
],
system_deps = [ "-Lexternal/hadoop/latest/",
"-L$(JAVA_HOME)/jre/lib/amd64/server/",
"-Lexternal/jvm/",
"-ljvm",
"-lhdfs"
],
preprocessor_flags = [ "-I@@@JAVA_HOME@@@/include",
"-I@@@JAVA_HOME@@@/include/linux",
"-Iexternal/hadoop/latest",
],
shared_system_deps = [ "hdfs",
"jvm",
],
deps = [
"@/thrift/lib/cpp:thrift_base",
],
)
......@@ -23,6 +23,7 @@
#include <tr1/functional>
#include "thrift/lib/cpp/protocol/TBinaryProtocol.h"
#include "thrift/lib/cpp/protocol/TCompactProtocol.h"
#include "thrift/lib/cpp/protocol/TProtocolTypes.h"
#include "folly/experimental/io/IOBuf.h"
......@@ -34,14 +35,15 @@
#include <unistd.h>
// Don't include the unknown client.
#define CLIENT_TYPES_LEN 4
#define CLIENT_TYPES_LEN 5
enum CLIENT_TYPE {
THRIFT_HEADER_CLIENT_TYPE = 0,
THRIFT_FRAMED_DEPRECATED = 1,
THRIFT_UNFRAMED_DEPRECATED = 2,
THRIFT_HTTP_CLIENT_TYPE = 3,
THRIFT_UNKNOWN_CLIENT_TYPE = 4,
THRIFT_FRAMED_COMPACT = 4,
THRIFT_UNKNOWN_CLIENT_TYPE = 5,
};
namespace apache { namespace thrift { namespace transport {
......@@ -270,6 +272,12 @@ class THeader {
*/
size_t getMaxWriteHeadersSize() const;
/**
* Returns whether the 1st byte of the protocol payload should be hadled
* as compact framed.
*/
bool compactFramed(uint32_t magic);
struct infoIdType {
enum idType {
// start at 1 to avoid confusing header padding for an infoId
......
cpp_unittest(
name = 'THeaderTest',
srcs = [
'THeaderTest.cpp',
],
deps = [
'@/thrift/lib/cpp/transport:header',
],
external_deps = [
('boost', '>= 1.37', 'boost_unit_test_framework'),
],
type = 'boost',
emails = ['thrift-team@lists.facebook.com'],
)
cpp_unittest(
name = 'TSocketAddressTest',
srcs = [
'TSocketAddressTest.cpp',
],
deps = [
'@/thrift/lib/cpp/transport',
],
external_deps = [
('boost', '>= 1.37', 'boost_unit_test_framework'),
],
type = 'boost',
emails = ['thrift-team@lists.facebook.com'],
)
cpp_unittest(
name = 'TSSLSocketTest',
srcs = [
'TSSLSocketTest.cpp',
],
deps = [
'@/thrift/lib/cpp/transport:transport_ssl',
'@/thrift/lib/cpp/util',
],
external_deps = [
('boost', '>= 1.37', 'boost_unit_test_framework'),
],
type = 'boost',
emails = [
'ti-bugs@lists.facebook.com',
'thrift-team@lists.facebook.com',
],
)
cpp_unittest (
name = "TSocketPoolTest",
srcs = [
"TSocketPoolTest.cpp",
],
deps = [
'@/common/fbunit',
'@/thrift/lib/cpp/transport',
],
)
cpp_binary (
name = "ttransport_test",
srcs = [
"TransportTest.cpp",
],
deps = [
"@/thrift/lib/cpp/transport",
]
)
cpp_library(
name = 'util',
srcs = [
'ScopedServerThread.cpp',
'ServerCreatorBase.cpp',
'SyncServerCreator.cpp',
'TSimpleServerCreator.cpp',
'TThreadedServerCreator.cpp',
'TThreadPoolServerCreator.cpp',
],
deps = [
'@/thrift/lib/cpp/server',
'@/thrift/lib/cpp/protocol',
'@/folly',
],
)
cpp_library(
name = 'internal_util',
srcs = [
'VarintUtils.cpp',
],
deps = [
'@/folly',
],
external_deps = [
('gflags', None, 'gflags'),
('glog', None, 'glog'),
],
)
cpp_library(
name = 'nonblocking',
srcs = [
'TNonblockingServerCreator.cpp',
],
deps = [
':util',
'@/thrift/lib/cpp/server:nonblocking',
],
)
cpp_library(
name = 'async',
srcs = [
'TEventServerCreator.cpp',
],
deps = [
':util',
'@/thrift/lib/cpp/async',
],
)
cpp_library(
name = 'httpparser',
srcs = [
'THttpParser.cpp',
],
deps = [
'@/thrift/lib/cpp/transport',
],
)
cpp_unittest(
name = 'ThriftSerializerTest',
srcs = [ 'ThriftSerializerTest.cpp' ],
thrift_srcs = { 'ThriftSerializerTest.thrift' : [ ] },
thrift_cpp_options = 'templates',
deps = [ '@/common/strings:strings',
'@/common/fbunit',
],
)
cpp_unittest(
name = 'ServerCreatorTest',
srcs = [
'ServerCreatorTest.cpp',
],
deps = [
'@/thrift/lib/cpp/util:async',
'@/thrift/lib/cpp/util:nonblocking',
'@/thrift/perf/cpp:load-handler',
'@/thrift/perf/cpp:async-load-handler',
],
external_deps = [
('boost', '>= 1.37', 'boost_unit_test_framework'),
],
type = 'boost',
emails = ['thrift-team@lists.facebook.com'],
)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册