auser-poolparty 1.3.1 → 1.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/VERSION.yml +1 -1
- data/bin/cloud-compile +6 -1
- data/config/jeweler.rb +1 -3
- data/lib/cloud_providers/cloud_provider_instance.rb +11 -1
- data/lib/dependency_resolvers/chef/resources/chef_recipe.rb +51 -0
- data/lib/dependency_resolvers/chef.rb +12 -3
- data/lib/mixins/callbacks.rb +6 -2
- data/lib/poolparty/plugins/apache2/passenger_site.rb +2 -2
- data/test/fixtures/chef/recipes/sudo/attributes/sudoers.rb +30 -0
- data/test/fixtures/chef/recipes/sudo/recipes/default.rb +33 -0
- data/test/fixtures/chef/recipes/sudo/templates/default/sudoers.erb +22 -0
- data/test/lib/dependency_resolvers/chef/resources/chef_recipe_test.rb +21 -0
- data/test/lib/dependency_resolvers/chef_test.rb +8 -1
- data/vendor/gems/thrift/CHANGELOG +1 -0
- data/vendor/gems/thrift/Makefile.am +25 -6
- data/vendor/gems/thrift/Manifest +81 -0
- data/vendor/gems/thrift/README +17 -111
- data/vendor/gems/thrift/Rakefile +104 -0
- data/vendor/gems/thrift/{lib/hs/Setup.lhs → benchmark/Benchmark.thrift} +5 -4
- data/vendor/gems/thrift/benchmark/benchmark.rb +271 -0
- data/vendor/gems/thrift/benchmark/client.rb +74 -0
- data/vendor/gems/thrift/benchmark/server.rb +82 -0
- data/vendor/gems/thrift/benchmark/thin_server.rb +44 -0
- data/vendor/gems/thrift/ext/binary_protocol_accelerated.c +474 -0
- data/vendor/gems/thrift/{lib/cocoa/src/protocol/TProtocolException.m → ext/binary_protocol_accelerated.h} +1 -4
- data/vendor/gems/thrift/ext/compact_protocol.c +665 -0
- data/vendor/gems/thrift/{lib/cocoa/src/protocol/TProtocolException.h → ext/compact_protocol.h} +1 -6
- data/vendor/gems/thrift/ext/constants.h +95 -0
- data/vendor/gems/thrift/{contrib/fb303/Makefile.am → ext/extconf.rb} +8 -13
- data/vendor/gems/thrift/{compiler/cpp/src/platform.h → ext/macros.h} +18 -13
- data/vendor/gems/thrift/ext/memory_buffer.c +76 -0
- data/vendor/gems/thrift/{lib/csharp/src/Protocol/TMessageType.cs → ext/memory_buffer.h} +2 -13
- data/vendor/gems/thrift/ext/protocol.c +185 -0
- data/vendor/gems/thrift/{lib/csharp/src/TProcessor.cs → ext/protocol.h} +2 -11
- data/vendor/gems/thrift/ext/struct.c +606 -0
- data/vendor/gems/thrift/ext/struct.h +67 -0
- data/vendor/gems/thrift/ext/thrift_native.c +194 -0
- data/vendor/gems/thrift/lib/thrift/client.rb +62 -0
- data/vendor/gems/thrift/{contrib/fb303/py/fb303_scripts/__init__.py → lib/thrift/core_ext/fixnum.rb} +13 -4
- data/vendor/gems/thrift/{contrib/fb303/global_footer.mk → lib/thrift/core_ext.rb} +4 -2
- data/vendor/gems/thrift/lib/thrift/exceptions.rb +82 -0
- data/vendor/gems/thrift/lib/thrift/processor.rb +57 -0
- data/vendor/gems/thrift/lib/thrift/protocol/base_protocol.rb +290 -0
- data/vendor/gems/thrift/lib/thrift/protocol/binary_protocol.rb +225 -0
- data/vendor/gems/thrift/{cleanup.sh → lib/thrift/protocol/binary_protocol_accelerated.rb} +19 -42
- data/vendor/gems/thrift/lib/thrift/protocol/compact_protocol.rb +422 -0
- data/vendor/gems/thrift/lib/thrift/serializer/deserializer.rb +33 -0
- data/vendor/gems/thrift/{bootstrap.sh → lib/thrift/serializer/serializer.rb} +17 -18
- data/vendor/gems/thrift/lib/thrift/server/base_server.rb +31 -0
- data/vendor/gems/thrift/lib/thrift/server/mongrel_http_server.rb +58 -0
- data/vendor/gems/thrift/lib/thrift/server/nonblocking_server.rb +296 -0
- data/vendor/gems/thrift/lib/thrift/server/simple_server.rb +43 -0
- data/vendor/gems/thrift/lib/thrift/server/thread_pool_server.rb +75 -0
- data/vendor/gems/thrift/lib/thrift/server/threaded_server.rb +47 -0
- data/vendor/gems/thrift/lib/thrift/struct.rb +298 -0
- data/vendor/gems/thrift/{contrib/fb303/bootstrap.sh → lib/thrift/thrift_native.rb} +5 -7
- data/vendor/gems/thrift/lib/{erl/Makefile → thrift/transport/base_server_transport.rb} +20 -20
- data/vendor/gems/thrift/lib/thrift/transport/base_transport.rb +70 -0
- data/vendor/gems/thrift/lib/thrift/transport/buffered_transport.rb +77 -0
- data/vendor/gems/thrift/lib/thrift/transport/framed_transport.rb +90 -0
- data/vendor/gems/thrift/lib/thrift/transport/http_client_transport.rb +45 -0
- data/vendor/gems/thrift/lib/thrift/transport/io_stream_transport.rb +39 -0
- data/vendor/gems/thrift/lib/thrift/transport/memory_buffer_transport.rb +96 -0
- data/vendor/gems/thrift/lib/thrift/transport/server_socket.rb +63 -0
- data/vendor/gems/thrift/lib/thrift/transport/socket.rb +136 -0
- data/vendor/gems/thrift/lib/{java/Makefile.am → thrift/transport/unix_server_socket.rb} +39 -17
- data/vendor/gems/thrift/{contrib/fb303/global_header.mk → lib/thrift/transport/unix_socket.rb} +23 -21
- data/vendor/gems/thrift/lib/thrift/types.rb +101 -0
- data/vendor/gems/thrift/lib/thrift.rb +59 -0
- data/vendor/gems/thrift/script/proto_benchmark.rb +121 -0
- data/vendor/gems/thrift/{lib/Makefile.am → script/read_struct.rb} +24 -36
- data/vendor/gems/thrift/{contrib/fb303/py/setup.py → script/write_struct.rb} +8 -5
- data/vendor/gems/thrift/setup.rb +1585 -0
- data/vendor/gems/thrift/spec/ThriftSpec.thrift +84 -0
- data/vendor/gems/thrift/spec/base_protocol_spec.rb +160 -0
- data/vendor/gems/thrift/spec/base_transport_spec.rb +351 -0
- data/vendor/gems/thrift/{contrib/fb303/py/Makefile.am → spec/binary_protocol_accelerated_spec.rb} +22 -25
- data/vendor/gems/thrift/spec/binary_protocol_spec.rb +63 -0
- data/vendor/gems/thrift/spec/binary_protocol_spec_shared.rb +375 -0
- data/vendor/gems/thrift/spec/client_spec.rb +100 -0
- data/vendor/gems/thrift/spec/compact_protocol_spec.rb +117 -0
- data/vendor/gems/thrift/spec/exception_spec.rb +142 -0
- data/vendor/gems/thrift/spec/http_client_spec.rb +49 -0
- data/vendor/gems/thrift/spec/mongrel_http_server_spec.rb +117 -0
- data/vendor/gems/thrift/spec/nonblocking_server_spec.rb +265 -0
- data/vendor/gems/thrift/spec/processor_spec.rb +83 -0
- data/vendor/gems/thrift/spec/serializer_spec.rb +69 -0
- data/vendor/gems/thrift/spec/server_socket_spec.rb +80 -0
- data/vendor/gems/thrift/spec/server_spec.rb +160 -0
- data/vendor/gems/thrift/spec/socket_spec.rb +61 -0
- data/vendor/gems/thrift/spec/socket_spec_shared.rb +104 -0
- data/vendor/gems/thrift/spec/spec_helper.rb +60 -0
- data/vendor/gems/thrift/spec/struct_spec.rb +252 -0
- data/vendor/gems/thrift/spec/types_spec.rb +116 -0
- data/vendor/gems/thrift/spec/unix_socket_spec.rb +108 -0
- data/vendor/gems/trollop/FAQ.txt +84 -0
- data/vendor/gems/trollop/History.txt +101 -0
- data/vendor/gems/trollop/Manifest.txt +7 -0
- data/vendor/gems/trollop/README.txt +40 -0
- data/vendor/gems/trollop/Rakefile +36 -0
- data/vendor/gems/trollop/lib/trollop.rb +739 -0
- data/vendor/gems/trollop/release-script.txt +13 -0
- data/vendor/gems/trollop/test/test_trollop.rb +1048 -0
- data/vendor/gems/trollop/www/index.html +172 -0
- metadata +123 -347
- data/vendor/gems/thrift/CHANGES +0 -35
- data/vendor/gems/thrift/CONTRIBUTORS +0 -77
- data/vendor/gems/thrift/DISCLAIMER +0 -6
- data/vendor/gems/thrift/LICENSE +0 -202
- data/vendor/gems/thrift/NEWS +0 -79
- data/vendor/gems/thrift/NOTICE +0 -26
- data/vendor/gems/thrift/aclocal/ax_boost_base.m4 +0 -198
- data/vendor/gems/thrift/aclocal/ax_javac_and_java.m4 +0 -107
- data/vendor/gems/thrift/aclocal/ax_lib_event.m4 +0 -194
- data/vendor/gems/thrift/aclocal/ax_lib_zlib.m4 +0 -173
- data/vendor/gems/thrift/aclocal/ax_signed_right_shift.m4 +0 -127
- data/vendor/gems/thrift/aclocal/ax_thrift_internal.m4 +0 -39
- data/vendor/gems/thrift/compiler/cpp/Makefile.am +0 -136
- data/vendor/gems/thrift/compiler/cpp/README +0 -39
- data/vendor/gems/thrift/compiler/cpp/src/generate/t_cocoa_generator.cc +0 -2331
- data/vendor/gems/thrift/compiler/cpp/src/generate/t_cpp_generator.cc +0 -3003
- data/vendor/gems/thrift/compiler/cpp/src/generate/t_csharp_generator.cc +0 -1700
- data/vendor/gems/thrift/compiler/cpp/src/generate/t_erl_generator.cc +0 -932
- data/vendor/gems/thrift/compiler/cpp/src/generate/t_generator.cc +0 -173
- data/vendor/gems/thrift/compiler/cpp/src/generate/t_generator.h +0 -321
- data/vendor/gems/thrift/compiler/cpp/src/generate/t_hs_generator.cc +0 -1445
- data/vendor/gems/thrift/compiler/cpp/src/generate/t_html_generator.cc +0 -637
- data/vendor/gems/thrift/compiler/cpp/src/generate/t_java_generator.cc +0 -3069
- data/vendor/gems/thrift/compiler/cpp/src/generate/t_ocaml_generator.cc +0 -1673
- data/vendor/gems/thrift/compiler/cpp/src/generate/t_oop_generator.h +0 -77
- data/vendor/gems/thrift/compiler/cpp/src/generate/t_perl_generator.cc +0 -1812
- data/vendor/gems/thrift/compiler/cpp/src/generate/t_php_generator.cc +0 -2281
- data/vendor/gems/thrift/compiler/cpp/src/generate/t_py_generator.cc +0 -2310
- data/vendor/gems/thrift/compiler/cpp/src/generate/t_rb_generator.cc +0 -1114
- data/vendor/gems/thrift/compiler/cpp/src/generate/t_st_generator.cc +0 -1071
- data/vendor/gems/thrift/compiler/cpp/src/generate/t_xsd_generator.cc +0 -354
- data/vendor/gems/thrift/compiler/cpp/src/globals.h +0 -117
- data/vendor/gems/thrift/compiler/cpp/src/main.cc +0 -1207
- data/vendor/gems/thrift/compiler/cpp/src/main.h +0 -103
- data/vendor/gems/thrift/compiler/cpp/src/md5.c +0 -381
- data/vendor/gems/thrift/compiler/cpp/src/md5.h +0 -91
- data/vendor/gems/thrift/compiler/cpp/src/parse/t_base_type.h +0 -137
- data/vendor/gems/thrift/compiler/cpp/src/parse/t_const.h +0 -59
- data/vendor/gems/thrift/compiler/cpp/src/parse/t_const_value.h +0 -121
- data/vendor/gems/thrift/compiler/cpp/src/parse/t_container.h +0 -56
- data/vendor/gems/thrift/compiler/cpp/src/parse/t_doc.h +0 -51
- data/vendor/gems/thrift/compiler/cpp/src/parse/t_enum.h +0 -59
- data/vendor/gems/thrift/compiler/cpp/src/parse/t_enum_value.h +0 -64
- data/vendor/gems/thrift/compiler/cpp/src/parse/t_field.h +0 -150
- data/vendor/gems/thrift/compiler/cpp/src/parse/t_function.h +0 -93
- data/vendor/gems/thrift/compiler/cpp/src/parse/t_list.h +0 -56
- data/vendor/gems/thrift/compiler/cpp/src/parse/t_map.h +0 -64
- data/vendor/gems/thrift/compiler/cpp/src/parse/t_program.h +0 -223
- data/vendor/gems/thrift/compiler/cpp/src/parse/t_scope.h +0 -86
- data/vendor/gems/thrift/compiler/cpp/src/parse/t_service.h +0 -68
- data/vendor/gems/thrift/compiler/cpp/src/parse/t_set.h +0 -55
- data/vendor/gems/thrift/compiler/cpp/src/parse/t_struct.h +0 -127
- data/vendor/gems/thrift/compiler/cpp/src/parse/t_type.h +0 -176
- data/vendor/gems/thrift/compiler/cpp/src/parse/t_typedef.h +0 -70
- data/vendor/gems/thrift/compiler/cpp/src/thriftl.ll +0 -303
- data/vendor/gems/thrift/compiler/cpp/src/thrifty.yy +0 -1140
- data/vendor/gems/thrift/configure.ac +0 -255
- data/vendor/gems/thrift/contrib/fb303/LICENSE +0 -16
- data/vendor/gems/thrift/contrib/fb303/README +0 -37
- data/vendor/gems/thrift/contrib/fb303/acinclude.m4 +0 -258
- data/vendor/gems/thrift/contrib/fb303/aclocal/ax_boost_base.m4 +0 -198
- data/vendor/gems/thrift/contrib/fb303/configure.ac +0 -115
- data/vendor/gems/thrift/contrib/fb303/cpp/FacebookBase.cpp +0 -124
- data/vendor/gems/thrift/contrib/fb303/cpp/FacebookBase.h +0 -103
- data/vendor/gems/thrift/contrib/fb303/cpp/Makefile.am +0 -84
- data/vendor/gems/thrift/contrib/fb303/cpp/ServiceTracker.cpp +0 -481
- data/vendor/gems/thrift/contrib/fb303/cpp/ServiceTracker.h +0 -215
- data/vendor/gems/thrift/contrib/fb303/if/fb303.thrift +0 -112
- data/vendor/gems/thrift/contrib/fb303/java/FacebookBase.java +0 -103
- data/vendor/gems/thrift/contrib/fb303/java/build.xml +0 -84
- data/vendor/gems/thrift/contrib/fb303/php/FacebookBase.php +0 -89
- data/vendor/gems/thrift/contrib/fb303/py/fb303/FacebookBase.py +0 -82
- data/vendor/gems/thrift/contrib/fb303/py/fb303_scripts/fb303_simple_mgmt.py +0 -195
- data/vendor/gems/thrift/contrib/thrift.el +0 -126
- data/vendor/gems/thrift/contrib/thrift.spec +0 -206
- data/vendor/gems/thrift/contrib/thrift.vim +0 -91
- data/vendor/gems/thrift/contrib/thrift_dump.cpp +0 -91
- data/vendor/gems/thrift/doc/lgpl-2.1.txt +0 -504
- data/vendor/gems/thrift/doc/otp-base-license.txt +0 -20
- data/vendor/gems/thrift/doc/thrift.bnf +0 -96
- data/vendor/gems/thrift/doc/thrift.tex +0 -1057
- data/vendor/gems/thrift/lib/cocoa/README +0 -21
- data/vendor/gems/thrift/lib/cocoa/src/TApplicationException.h +0 -44
- data/vendor/gems/thrift/lib/cocoa/src/TApplicationException.m +0 -130
- data/vendor/gems/thrift/lib/cocoa/src/TException.h +0 -34
- data/vendor/gems/thrift/lib/cocoa/src/TException.m +0 -64
- data/vendor/gems/thrift/lib/cocoa/src/TProcessor.h +0 -29
- data/vendor/gems/thrift/lib/cocoa/src/TProcessorFactory.h +0 -27
- data/vendor/gems/thrift/lib/cocoa/src/TSharedProcessorFactory.h +0 -27
- data/vendor/gems/thrift/lib/cocoa/src/TSharedProcessorFactory.m +0 -51
- data/vendor/gems/thrift/lib/cocoa/src/protocol/TBinaryProtocol.h +0 -51
- data/vendor/gems/thrift/lib/cocoa/src/protocol/TBinaryProtocol.m +0 -477
- data/vendor/gems/thrift/lib/cocoa/src/protocol/TProtocol.h +0 -148
- data/vendor/gems/thrift/lib/cocoa/src/protocol/TProtocolFactory.h +0 -29
- data/vendor/gems/thrift/lib/cocoa/src/protocol/TProtocolUtil.h +0 -29
- data/vendor/gems/thrift/lib/cocoa/src/protocol/TProtocolUtil.m +0 -104
- data/vendor/gems/thrift/lib/cocoa/src/server/TSocketServer.h +0 -50
- data/vendor/gems/thrift/lib/cocoa/src/server/TSocketServer.m +0 -153
- data/vendor/gems/thrift/lib/cocoa/src/transport/THTTPClient.h +0 -42
- data/vendor/gems/thrift/lib/cocoa/src/transport/THTTPClient.m +0 -159
- data/vendor/gems/thrift/lib/cocoa/src/transport/TNSFileHandleTransport.h +0 -35
- data/vendor/gems/thrift/lib/cocoa/src/transport/TNSFileHandleTransport.m +0 -91
- data/vendor/gems/thrift/lib/cocoa/src/transport/TNSStreamTransport.h +0 -38
- data/vendor/gems/thrift/lib/cocoa/src/transport/TNSStreamTransport.m +0 -89
- data/vendor/gems/thrift/lib/cocoa/src/transport/TSocketClient.h +0 -32
- data/vendor/gems/thrift/lib/cocoa/src/transport/TSocketClient.m +0 -58
- data/vendor/gems/thrift/lib/cocoa/src/transport/TTransport.h +0 -36
- data/vendor/gems/thrift/lib/cocoa/src/transport/TTransportException.h +0 -30
- data/vendor/gems/thrift/lib/cocoa/src/transport/TTransportException.m +0 -43
- data/vendor/gems/thrift/lib/cpp/Makefile.am +0 -158
- data/vendor/gems/thrift/lib/cpp/README +0 -67
- data/vendor/gems/thrift/lib/cpp/src/TLogging.h +0 -163
- data/vendor/gems/thrift/lib/cpp/src/TProcessor.h +0 -53
- data/vendor/gems/thrift/lib/cpp/src/TReflectionLocal.h +0 -96
- data/vendor/gems/thrift/lib/cpp/src/Thrift.cpp +0 -148
- data/vendor/gems/thrift/lib/cpp/src/Thrift.h +0 -191
- data/vendor/gems/thrift/lib/cpp/src/concurrency/Exception.h +0 -60
- data/vendor/gems/thrift/lib/cpp/src/concurrency/FunctionRunner.h +0 -77
- data/vendor/gems/thrift/lib/cpp/src/concurrency/Monitor.cpp +0 -137
- data/vendor/gems/thrift/lib/cpp/src/concurrency/Monitor.h +0 -84
- data/vendor/gems/thrift/lib/cpp/src/concurrency/Mutex.cpp +0 -160
- data/vendor/gems/thrift/lib/cpp/src/concurrency/Mutex.h +0 -114
- data/vendor/gems/thrift/lib/cpp/src/concurrency/PosixThreadFactory.cpp +0 -314
- data/vendor/gems/thrift/lib/cpp/src/concurrency/PosixThreadFactory.h +0 -130
- data/vendor/gems/thrift/lib/cpp/src/concurrency/Thread.h +0 -125
- data/vendor/gems/thrift/lib/cpp/src/concurrency/ThreadManager.cpp +0 -493
- data/vendor/gems/thrift/lib/cpp/src/concurrency/ThreadManager.h +0 -169
- data/vendor/gems/thrift/lib/cpp/src/concurrency/TimerManager.cpp +0 -284
- data/vendor/gems/thrift/lib/cpp/src/concurrency/TimerManager.h +0 -122
- data/vendor/gems/thrift/lib/cpp/src/concurrency/Util.cpp +0 -55
- data/vendor/gems/thrift/lib/cpp/src/concurrency/Util.h +0 -100
- data/vendor/gems/thrift/lib/cpp/src/concurrency/test/Tests.cpp +0 -155
- data/vendor/gems/thrift/lib/cpp/src/concurrency/test/ThreadFactoryTests.h +0 -354
- data/vendor/gems/thrift/lib/cpp/src/concurrency/test/ThreadManagerTests.h +0 -379
- data/vendor/gems/thrift/lib/cpp/src/concurrency/test/TimerManagerTests.h +0 -155
- data/vendor/gems/thrift/lib/cpp/src/processor/PeekProcessor.cpp +0 -122
- data/vendor/gems/thrift/lib/cpp/src/processor/PeekProcessor.h +0 -77
- data/vendor/gems/thrift/lib/cpp/src/processor/StatsProcessor.h +0 -264
- data/vendor/gems/thrift/lib/cpp/src/protocol/TBase64Utils.cpp +0 -79
- data/vendor/gems/thrift/lib/cpp/src/protocol/TBase64Utils.h +0 -42
- data/vendor/gems/thrift/lib/cpp/src/protocol/TBinaryProtocol.cpp +0 -394
- data/vendor/gems/thrift/lib/cpp/src/protocol/TBinaryProtocol.h +0 -254
- data/vendor/gems/thrift/lib/cpp/src/protocol/TCompactProtocol.cpp +0 -736
- data/vendor/gems/thrift/lib/cpp/src/protocol/TCompactProtocol.h +0 -279
- data/vendor/gems/thrift/lib/cpp/src/protocol/TDebugProtocol.cpp +0 -346
- data/vendor/gems/thrift/lib/cpp/src/protocol/TDebugProtocol.h +0 -225
- data/vendor/gems/thrift/lib/cpp/src/protocol/TDenseProtocol.cpp +0 -762
- data/vendor/gems/thrift/lib/cpp/src/protocol/TDenseProtocol.h +0 -253
- data/vendor/gems/thrift/lib/cpp/src/protocol/TJSONProtocol.cpp +0 -998
- data/vendor/gems/thrift/lib/cpp/src/protocol/TJSONProtocol.h +0 -340
- data/vendor/gems/thrift/lib/cpp/src/protocol/TOneWayProtocol.h +0 -304
- data/vendor/gems/thrift/lib/cpp/src/protocol/TProtocol.h +0 -438
- data/vendor/gems/thrift/lib/cpp/src/protocol/TProtocolException.h +0 -104
- data/vendor/gems/thrift/lib/cpp/src/protocol/TProtocolTap.h +0 -187
- data/vendor/gems/thrift/lib/cpp/src/server/TNonblockingServer.cpp +0 -750
- data/vendor/gems/thrift/lib/cpp/src/server/TNonblockingServer.h +0 -435
- data/vendor/gems/thrift/lib/cpp/src/server/TServer.cpp +0 -38
- data/vendor/gems/thrift/lib/cpp/src/server/TServer.h +0 -213
- data/vendor/gems/thrift/lib/cpp/src/server/TSimpleServer.cpp +0 -118
- data/vendor/gems/thrift/lib/cpp/src/server/TSimpleServer.h +0 -70
- data/vendor/gems/thrift/lib/cpp/src/server/TThreadPoolServer.cpp +0 -217
- data/vendor/gems/thrift/lib/cpp/src/server/TThreadPoolServer.h +0 -79
- data/vendor/gems/thrift/lib/cpp/src/server/TThreadedServer.cpp +0 -243
- data/vendor/gems/thrift/lib/cpp/src/server/TThreadedServer.h +0 -74
- data/vendor/gems/thrift/lib/cpp/src/transport/TBufferTransports.cpp +0 -370
- data/vendor/gems/thrift/lib/cpp/src/transport/TBufferTransports.h +0 -667
- data/vendor/gems/thrift/lib/cpp/src/transport/TFDTransport.cpp +0 -77
- data/vendor/gems/thrift/lib/cpp/src/transport/TFDTransport.h +0 -73
- data/vendor/gems/thrift/lib/cpp/src/transport/TFileTransport.cpp +0 -953
- data/vendor/gems/thrift/lib/cpp/src/transport/TFileTransport.h +0 -442
- data/vendor/gems/thrift/lib/cpp/src/transport/THttpClient.cpp +0 -348
- data/vendor/gems/thrift/lib/cpp/src/transport/THttpClient.h +0 -111
- data/vendor/gems/thrift/lib/cpp/src/transport/TServerSocket.cpp +0 -368
- data/vendor/gems/thrift/lib/cpp/src/transport/TServerSocket.h +0 -76
- data/vendor/gems/thrift/lib/cpp/src/transport/TServerTransport.h +0 -92
- data/vendor/gems/thrift/lib/cpp/src/transport/TShortReadTransport.h +0 -96
- data/vendor/gems/thrift/lib/cpp/src/transport/TSimpleFileTransport.cpp +0 -54
- data/vendor/gems/thrift/lib/cpp/src/transport/TSimpleFileTransport.h +0 -41
- data/vendor/gems/thrift/lib/cpp/src/transport/TSocket.cpp +0 -591
- data/vendor/gems/thrift/lib/cpp/src/transport/TSocket.h +0 -242
- data/vendor/gems/thrift/lib/cpp/src/transport/TSocketPool.cpp +0 -235
- data/vendor/gems/thrift/lib/cpp/src/transport/TSocketPool.h +0 -191
- data/vendor/gems/thrift/lib/cpp/src/transport/TTransport.h +0 -224
- data/vendor/gems/thrift/lib/cpp/src/transport/TTransportException.cpp +0 -31
- data/vendor/gems/thrift/lib/cpp/src/transport/TTransportException.h +0 -117
- data/vendor/gems/thrift/lib/cpp/src/transport/TTransportUtils.cpp +0 -178
- data/vendor/gems/thrift/lib/cpp/src/transport/TTransportUtils.h +0 -287
- data/vendor/gems/thrift/lib/cpp/src/transport/TZlibTransport.cpp +0 -299
- data/vendor/gems/thrift/lib/cpp/src/transport/TZlibTransport.h +0 -219
- data/vendor/gems/thrift/lib/cpp/thrift-nb.pc.in +0 -30
- data/vendor/gems/thrift/lib/cpp/thrift-z.pc.in +0 -30
- data/vendor/gems/thrift/lib/cpp/thrift.pc.in +0 -29
- data/vendor/gems/thrift/lib/csharp/Makefile.am +0 -70
- data/vendor/gems/thrift/lib/csharp/README +0 -26
- data/vendor/gems/thrift/lib/csharp/ThriftMSBuildTask/Properties/AssemblyInfo.cs +0 -55
- data/vendor/gems/thrift/lib/csharp/ThriftMSBuildTask/ThriftBuild.cs +0 -242
- data/vendor/gems/thrift/lib/csharp/ThriftMSBuildTask/ThriftMSBuildTask.csproj +0 -62
- data/vendor/gems/thrift/lib/csharp/src/Collections/THashSet.cs +0 -142
- data/vendor/gems/thrift/lib/csharp/src/Protocol/TBase.cs +0 -34
- data/vendor/gems/thrift/lib/csharp/src/Protocol/TBinaryProtocol.cs +0 -392
- data/vendor/gems/thrift/lib/csharp/src/Protocol/TField.cs +0 -58
- data/vendor/gems/thrift/lib/csharp/src/Protocol/TList.cs +0 -50
- data/vendor/gems/thrift/lib/csharp/src/Protocol/TMap.cs +0 -58
- data/vendor/gems/thrift/lib/csharp/src/Protocol/TMessage.cs +0 -58
- data/vendor/gems/thrift/lib/csharp/src/Protocol/TProtocol.cs +0 -87
- data/vendor/gems/thrift/lib/csharp/src/Protocol/TProtocolException.cs +0 -61
- data/vendor/gems/thrift/lib/csharp/src/Protocol/TProtocolFactory.cs +0 -29
- data/vendor/gems/thrift/lib/csharp/src/Protocol/TProtocolUtil.cs +0 -94
- data/vendor/gems/thrift/lib/csharp/src/Protocol/TSet.cs +0 -50
- data/vendor/gems/thrift/lib/csharp/src/Protocol/TStruct.cs +0 -42
- data/vendor/gems/thrift/lib/csharp/src/Protocol/TType.cs +0 -40
- data/vendor/gems/thrift/lib/csharp/src/Server/TServer.cs +0 -135
- data/vendor/gems/thrift/lib/csharp/src/Server/TSimpleServer.cs +0 -148
- data/vendor/gems/thrift/lib/csharp/src/Server/TThreadPoolServer.cs +0 -186
- data/vendor/gems/thrift/lib/csharp/src/Server/TThreadedServer.cs +0 -234
- data/vendor/gems/thrift/lib/csharp/src/TApplicationException.cs +0 -131
- data/vendor/gems/thrift/lib/csharp/src/Thrift.csproj +0 -73
- data/vendor/gems/thrift/lib/csharp/src/Thrift.sln +0 -35
- data/vendor/gems/thrift/lib/csharp/src/Transport/TBufferedTransport.cs +0 -100
- data/vendor/gems/thrift/lib/csharp/src/Transport/TServerSocket.cs +0 -157
- data/vendor/gems/thrift/lib/csharp/src/Transport/TServerTransport.cs +0 -39
- data/vendor/gems/thrift/lib/csharp/src/Transport/TSocket.cs +0 -144
- data/vendor/gems/thrift/lib/csharp/src/Transport/TStreamTransport.cs +0 -103
- data/vendor/gems/thrift/lib/csharp/src/Transport/TTransport.cs +0 -66
- data/vendor/gems/thrift/lib/csharp/src/Transport/TTransportException.cs +0 -64
- data/vendor/gems/thrift/lib/csharp/src/Transport/TTransportFactory.cs +0 -38
- data/vendor/gems/thrift/lib/erl/README +0 -56
- data/vendor/gems/thrift/lib/erl/build/beamver +0 -59
- data/vendor/gems/thrift/lib/erl/build/buildtargets.mk +0 -15
- data/vendor/gems/thrift/lib/erl/build/colors.mk +0 -24
- data/vendor/gems/thrift/lib/erl/build/docs.mk +0 -12
- data/vendor/gems/thrift/lib/erl/build/mime.types +0 -98
- data/vendor/gems/thrift/lib/erl/build/otp.mk +0 -146
- data/vendor/gems/thrift/lib/erl/build/otp_subdir.mk +0 -85
- data/vendor/gems/thrift/lib/erl/build/raw_test.mk +0 -29
- data/vendor/gems/thrift/lib/erl/include/thrift_constants.hrl +0 -54
- data/vendor/gems/thrift/lib/erl/include/thrift_protocol.hrl +0 -31
- data/vendor/gems/thrift/lib/erl/src/Makefile +0 -116
- data/vendor/gems/thrift/lib/erl/src/test_handler.erl +0 -26
- data/vendor/gems/thrift/lib/erl/src/test_service.erl +0 -29
- data/vendor/gems/thrift/lib/erl/src/thrift.app.src +0 -44
- data/vendor/gems/thrift/lib/erl/src/thrift.appup.src +0 -1
- data/vendor/gems/thrift/lib/erl/src/thrift_base64_transport.erl +0 -64
- data/vendor/gems/thrift/lib/erl/src/thrift_binary_protocol.erl +0 -325
- data/vendor/gems/thrift/lib/erl/src/thrift_buffered_transport.erl +0 -180
- data/vendor/gems/thrift/lib/erl/src/thrift_client.erl +0 -384
- data/vendor/gems/thrift/lib/erl/src/thrift_disk_log_transport.erl +0 -118
- data/vendor/gems/thrift/lib/erl/src/thrift_file_transport.erl +0 -87
- data/vendor/gems/thrift/lib/erl/src/thrift_framed_transport.erl +0 -208
- data/vendor/gems/thrift/lib/erl/src/thrift_http_transport.erl +0 -199
- data/vendor/gems/thrift/lib/erl/src/thrift_memory_buffer.erl +0 -164
- data/vendor/gems/thrift/lib/erl/src/thrift_processor.erl +0 -188
- data/vendor/gems/thrift/lib/erl/src/thrift_protocol.erl +0 -356
- data/vendor/gems/thrift/lib/erl/src/thrift_server.erl +0 -183
- data/vendor/gems/thrift/lib/erl/src/thrift_service.erl +0 -25
- data/vendor/gems/thrift/lib/erl/src/thrift_socket_server.erl +0 -249
- data/vendor/gems/thrift/lib/erl/src/thrift_socket_transport.erl +0 -119
- data/vendor/gems/thrift/lib/erl/src/thrift_transport.erl +0 -57
- data/vendor/gems/thrift/lib/erl/vsn.mk +0 -1
- data/vendor/gems/thrift/lib/hs/README +0 -82
- data/vendor/gems/thrift/lib/hs/TODO +0 -2
- data/vendor/gems/thrift/lib/hs/Thrift.cabal +0 -20
- data/vendor/gems/thrift/lib/hs/src/Thrift/Protocol/Binary.hs +0 -147
- data/vendor/gems/thrift/lib/hs/src/Thrift/Protocol.hs +0 -191
- data/vendor/gems/thrift/lib/hs/src/Thrift/Server.hs +0 -65
- data/vendor/gems/thrift/lib/hs/src/Thrift/Transport/Handle.hs +0 -58
- data/vendor/gems/thrift/lib/hs/src/Thrift/Transport.hs +0 -60
- data/vendor/gems/thrift/lib/hs/src/Thrift.hs +0 -111
- data/vendor/gems/thrift/lib/java/README +0 -43
- data/vendor/gems/thrift/lib/java/build.xml +0 -195
- data/vendor/gems/thrift/lib/java/ivy.xml +0 -8
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/IntRangeSet.java +0 -171
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TApplicationException.java +0 -123
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TBase.java +0 -66
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TBaseHelper.java +0 -102
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TByteArrayOutputStream.java +0 -46
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TDeserializer.java +0 -94
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TException.java +0 -45
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TFieldRequirementType.java +0 -30
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TProcessor.java +0 -32
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TProcessorFactory.java +0 -39
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TSerializer.java +0 -110
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/meta_data/FieldMetaData.java +0 -69
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/meta_data/FieldValueMetaData.java +0 -42
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/meta_data/ListMetaData.java +0 -29
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/meta_data/MapMetaData.java +0 -31
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/meta_data/SetMetaData.java +0 -29
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/meta_data/StructMetaData.java +0 -31
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TBase64Utils.java +0 -128
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TBinaryProtocol.java +0 -331
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TCompactProtocol.java +0 -741
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TField.java +0 -48
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TJSONProtocol.java +0 -927
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TList.java +0 -38
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TMap.java +0 -40
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TMessage.java +0 -48
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TMessageType.java +0 -31
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TProtocol.java +0 -146
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TProtocolException.java +0 -81
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TProtocolFactory.java +0 -30
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TProtocolUtil.java +0 -158
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TSet.java +0 -42
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TSimpleJSONProtocol.java +0 -384
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TStruct.java +0 -36
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TType.java +0 -40
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/server/THsHaServer.java +0 -304
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/server/TNonblockingServer.java +0 -772
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/server/TServer.java +0 -126
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/server/TSimpleServer.java +0 -145
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/server/TThreadPoolServer.java +0 -271
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TFramedTransport.java +0 -126
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/THttpClient.java +0 -157
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TIOStreamTransport.java +0 -159
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TMemoryBuffer.java +0 -98
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TNonblockingServerSocket.java +0 -160
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TNonblockingServerTransport.java +0 -31
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TNonblockingSocket.java +0 -213
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TNonblockingTransport.java +0 -31
- data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TServerSocket.java +0 -145
|
@@ -1,750 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Licensed to the Apache Software Foundation (ASF) under one
|
|
3
|
-
* or more contributor license agreements. See the NOTICE file
|
|
4
|
-
* distributed with this work for additional information
|
|
5
|
-
* regarding copyright ownership. The ASF licenses this file
|
|
6
|
-
* to you under the Apache License, Version 2.0 (the
|
|
7
|
-
* "License"); you may not use this file except in compliance
|
|
8
|
-
* with the License. You may obtain a copy of the License at
|
|
9
|
-
*
|
|
10
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
-
*
|
|
12
|
-
* Unless required by applicable law or agreed to in writing,
|
|
13
|
-
* software distributed under the License is distributed on an
|
|
14
|
-
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
15
|
-
* KIND, either express or implied. See the License for the
|
|
16
|
-
* specific language governing permissions and limitations
|
|
17
|
-
* under the License.
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
#include "TNonblockingServer.h"
|
|
21
|
-
#include <concurrency/Exception.h>
|
|
22
|
-
|
|
23
|
-
#include <iostream>
|
|
24
|
-
#include <sys/socket.h>
|
|
25
|
-
#include <netinet/in.h>
|
|
26
|
-
#include <netinet/tcp.h>
|
|
27
|
-
#include <netdb.h>
|
|
28
|
-
#include <fcntl.h>
|
|
29
|
-
#include <errno.h>
|
|
30
|
-
#include <assert.h>
|
|
31
|
-
|
|
32
|
-
namespace apache { namespace thrift { namespace server {
|
|
33
|
-
|
|
34
|
-
using namespace apache::thrift::protocol;
|
|
35
|
-
using namespace apache::thrift::transport;
|
|
36
|
-
using namespace apache::thrift::concurrency;
|
|
37
|
-
using namespace std;
|
|
38
|
-
|
|
39
|
-
class TConnection::Task: public Runnable {
|
|
40
|
-
public:
|
|
41
|
-
Task(boost::shared_ptr<TProcessor> processor,
|
|
42
|
-
boost::shared_ptr<TProtocol> input,
|
|
43
|
-
boost::shared_ptr<TProtocol> output,
|
|
44
|
-
int taskHandle) :
|
|
45
|
-
processor_(processor),
|
|
46
|
-
input_(input),
|
|
47
|
-
output_(output),
|
|
48
|
-
taskHandle_(taskHandle) {}
|
|
49
|
-
|
|
50
|
-
void run() {
|
|
51
|
-
try {
|
|
52
|
-
while (processor_->process(input_, output_)) {
|
|
53
|
-
if (!input_->getTransport()->peek()) {
|
|
54
|
-
break;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
} catch (TTransportException& ttx) {
|
|
58
|
-
cerr << "TNonblockingServer client died: " << ttx.what() << endl;
|
|
59
|
-
} catch (TException& x) {
|
|
60
|
-
cerr << "TNonblockingServer exception: " << x.what() << endl;
|
|
61
|
-
} catch (...) {
|
|
62
|
-
cerr << "TNonblockingServer uncaught exception." << endl;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
// Signal completion back to the libevent thread via a socketpair
|
|
66
|
-
int8_t b = 0;
|
|
67
|
-
if (-1 == send(taskHandle_, &b, sizeof(int8_t), 0)) {
|
|
68
|
-
GlobalOutput.perror("TNonblockingServer::Task: send ", errno);
|
|
69
|
-
}
|
|
70
|
-
if (-1 == ::close(taskHandle_)) {
|
|
71
|
-
GlobalOutput.perror("TNonblockingServer::Task: close, possible resource leak ", errno);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
private:
|
|
76
|
-
boost::shared_ptr<TProcessor> processor_;
|
|
77
|
-
boost::shared_ptr<TProtocol> input_;
|
|
78
|
-
boost::shared_ptr<TProtocol> output_;
|
|
79
|
-
int taskHandle_;
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
void TConnection::init(int socket, short eventFlags, TNonblockingServer* s) {
|
|
83
|
-
socket_ = socket;
|
|
84
|
-
server_ = s;
|
|
85
|
-
appState_ = APP_INIT;
|
|
86
|
-
eventFlags_ = 0;
|
|
87
|
-
|
|
88
|
-
readBufferPos_ = 0;
|
|
89
|
-
readWant_ = 0;
|
|
90
|
-
|
|
91
|
-
writeBuffer_ = NULL;
|
|
92
|
-
writeBufferSize_ = 0;
|
|
93
|
-
writeBufferPos_ = 0;
|
|
94
|
-
|
|
95
|
-
socketState_ = SOCKET_RECV;
|
|
96
|
-
appState_ = APP_INIT;
|
|
97
|
-
|
|
98
|
-
taskHandle_ = -1;
|
|
99
|
-
|
|
100
|
-
// Set flags, which also registers the event
|
|
101
|
-
setFlags(eventFlags);
|
|
102
|
-
|
|
103
|
-
// get input/transports
|
|
104
|
-
factoryInputTransport_ = s->getInputTransportFactory()->getTransport(inputTransport_);
|
|
105
|
-
factoryOutputTransport_ = s->getOutputTransportFactory()->getTransport(outputTransport_);
|
|
106
|
-
|
|
107
|
-
// Create protocol
|
|
108
|
-
inputProtocol_ = s->getInputProtocolFactory()->getProtocol(factoryInputTransport_);
|
|
109
|
-
outputProtocol_ = s->getOutputProtocolFactory()->getProtocol(factoryOutputTransport_);
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
void TConnection::workSocket() {
|
|
113
|
-
int flags=0, got=0, left=0, sent=0;
|
|
114
|
-
uint32_t fetch = 0;
|
|
115
|
-
|
|
116
|
-
switch (socketState_) {
|
|
117
|
-
case SOCKET_RECV:
|
|
118
|
-
// It is an error to be in this state if we already have all the data
|
|
119
|
-
assert(readBufferPos_ < readWant_);
|
|
120
|
-
|
|
121
|
-
// Double the buffer size until it is big enough
|
|
122
|
-
if (readWant_ > readBufferSize_) {
|
|
123
|
-
while (readWant_ > readBufferSize_) {
|
|
124
|
-
readBufferSize_ *= 2;
|
|
125
|
-
}
|
|
126
|
-
readBuffer_ = (uint8_t*)std::realloc(readBuffer_, readBufferSize_);
|
|
127
|
-
if (readBuffer_ == NULL) {
|
|
128
|
-
GlobalOutput("TConnection::workSocket() realloc");
|
|
129
|
-
close();
|
|
130
|
-
return;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
// Read from the socket
|
|
135
|
-
fetch = readWant_ - readBufferPos_;
|
|
136
|
-
got = recv(socket_, readBuffer_ + readBufferPos_, fetch, 0);
|
|
137
|
-
|
|
138
|
-
if (got > 0) {
|
|
139
|
-
// Move along in the buffer
|
|
140
|
-
readBufferPos_ += got;
|
|
141
|
-
|
|
142
|
-
// Check that we did not overdo it
|
|
143
|
-
assert(readBufferPos_ <= readWant_);
|
|
144
|
-
|
|
145
|
-
// We are done reading, move onto the next state
|
|
146
|
-
if (readBufferPos_ == readWant_) {
|
|
147
|
-
transition();
|
|
148
|
-
}
|
|
149
|
-
return;
|
|
150
|
-
} else if (got == -1) {
|
|
151
|
-
// Blocking errors are okay, just move on
|
|
152
|
-
if (errno == EAGAIN || errno == EWOULDBLOCK) {
|
|
153
|
-
return;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
if (errno != ECONNRESET) {
|
|
157
|
-
GlobalOutput.perror("TConnection::workSocket() recv -1 ", errno);
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
// Whenever we get down here it means a remote disconnect
|
|
162
|
-
close();
|
|
163
|
-
|
|
164
|
-
return;
|
|
165
|
-
|
|
166
|
-
case SOCKET_SEND:
|
|
167
|
-
// Should never have position past size
|
|
168
|
-
assert(writeBufferPos_ <= writeBufferSize_);
|
|
169
|
-
|
|
170
|
-
// If there is no data to send, then let us move on
|
|
171
|
-
if (writeBufferPos_ == writeBufferSize_) {
|
|
172
|
-
GlobalOutput("WARNING: Send state with no data to send\n");
|
|
173
|
-
transition();
|
|
174
|
-
return;
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
flags = 0;
|
|
178
|
-
#ifdef MSG_NOSIGNAL
|
|
179
|
-
// Note the use of MSG_NOSIGNAL to suppress SIGPIPE errors, instead we
|
|
180
|
-
// check for the EPIPE return condition and close the socket in that case
|
|
181
|
-
flags |= MSG_NOSIGNAL;
|
|
182
|
-
#endif // ifdef MSG_NOSIGNAL
|
|
183
|
-
|
|
184
|
-
left = writeBufferSize_ - writeBufferPos_;
|
|
185
|
-
sent = send(socket_, writeBuffer_ + writeBufferPos_, left, flags);
|
|
186
|
-
|
|
187
|
-
if (sent <= 0) {
|
|
188
|
-
// Blocking errors are okay, just move on
|
|
189
|
-
if (errno == EAGAIN || errno == EWOULDBLOCK) {
|
|
190
|
-
return;
|
|
191
|
-
}
|
|
192
|
-
if (errno != EPIPE) {
|
|
193
|
-
GlobalOutput.perror("TConnection::workSocket() send -1 ", errno);
|
|
194
|
-
}
|
|
195
|
-
close();
|
|
196
|
-
return;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
writeBufferPos_ += sent;
|
|
200
|
-
|
|
201
|
-
// Did we overdo it?
|
|
202
|
-
assert(writeBufferPos_ <= writeBufferSize_);
|
|
203
|
-
|
|
204
|
-
// We are done!
|
|
205
|
-
if (writeBufferPos_ == writeBufferSize_) {
|
|
206
|
-
transition();
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
return;
|
|
210
|
-
|
|
211
|
-
default:
|
|
212
|
-
GlobalOutput.printf("Shit Got Ill. Socket State %d", socketState_);
|
|
213
|
-
assert(0);
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
/**
|
|
218
|
-
* This is called when the application transitions from one state into
|
|
219
|
-
* another. This means that it has finished writing the data that it needed
|
|
220
|
-
* to, or finished receiving the data that it needed to.
|
|
221
|
-
*/
|
|
222
|
-
void TConnection::transition() {
|
|
223
|
-
|
|
224
|
-
int sz = 0;
|
|
225
|
-
|
|
226
|
-
// Switch upon the state that we are currently in and move to a new state
|
|
227
|
-
switch (appState_) {
|
|
228
|
-
|
|
229
|
-
case APP_READ_REQUEST:
|
|
230
|
-
// We are done reading the request, package the read buffer into transport
|
|
231
|
-
// and get back some data from the dispatch function
|
|
232
|
-
// If we've used these transport buffers enough times, reset them to avoid bloating
|
|
233
|
-
|
|
234
|
-
inputTransport_->resetBuffer(readBuffer_, readBufferPos_);
|
|
235
|
-
++numReadsSinceReset_;
|
|
236
|
-
if (numWritesSinceReset_ < 512) {
|
|
237
|
-
outputTransport_->resetBuffer();
|
|
238
|
-
} else {
|
|
239
|
-
// reset the capacity of the output transport if we used it enough times that it might be bloated
|
|
240
|
-
try {
|
|
241
|
-
outputTransport_->resetBuffer(true);
|
|
242
|
-
numWritesSinceReset_ = 0;
|
|
243
|
-
} catch (TTransportException &ttx) {
|
|
244
|
-
GlobalOutput.printf("TTransportException: TMemoryBuffer::resetBuffer() %s", ttx.what());
|
|
245
|
-
close();
|
|
246
|
-
return;
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
// Prepend four bytes of blank space to the buffer so we can
|
|
251
|
-
// write the frame size there later.
|
|
252
|
-
outputTransport_->getWritePtr(4);
|
|
253
|
-
outputTransport_->wroteBytes(4);
|
|
254
|
-
|
|
255
|
-
if (server_->isThreadPoolProcessing()) {
|
|
256
|
-
// We are setting up a Task to do this work and we will wait on it
|
|
257
|
-
int sv[2];
|
|
258
|
-
if (-1 == socketpair(AF_LOCAL, SOCK_STREAM, 0, sv)) {
|
|
259
|
-
GlobalOutput.perror("TConnection::socketpair() failed ", errno);
|
|
260
|
-
// Now we will fall through to the APP_WAIT_TASK block with no response
|
|
261
|
-
} else {
|
|
262
|
-
// Create task and dispatch to the thread manager
|
|
263
|
-
boost::shared_ptr<Runnable> task =
|
|
264
|
-
boost::shared_ptr<Runnable>(new Task(server_->getProcessor(),
|
|
265
|
-
inputProtocol_,
|
|
266
|
-
outputProtocol_,
|
|
267
|
-
sv[1]));
|
|
268
|
-
// The application is now waiting on the task to finish
|
|
269
|
-
appState_ = APP_WAIT_TASK;
|
|
270
|
-
|
|
271
|
-
// Create an event to be notified when the task finishes
|
|
272
|
-
event_set(&taskEvent_,
|
|
273
|
-
taskHandle_ = sv[0],
|
|
274
|
-
EV_READ,
|
|
275
|
-
TConnection::taskHandler,
|
|
276
|
-
this);
|
|
277
|
-
|
|
278
|
-
// Attach to the base
|
|
279
|
-
event_base_set(server_->getEventBase(), &taskEvent_);
|
|
280
|
-
|
|
281
|
-
// Add the event and start up the server
|
|
282
|
-
if (-1 == event_add(&taskEvent_, 0)) {
|
|
283
|
-
GlobalOutput("TNonblockingServer::serve(): coult not event_add");
|
|
284
|
-
return;
|
|
285
|
-
}
|
|
286
|
-
try {
|
|
287
|
-
server_->addTask(task);
|
|
288
|
-
} catch (IllegalStateException & ise) {
|
|
289
|
-
// The ThreadManager is not ready to handle any more tasks (it's probably shutting down).
|
|
290
|
-
GlobalOutput.printf("IllegalStateException: Server::process() %s", ise.what());
|
|
291
|
-
close();
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
// Set this connection idle so that libevent doesn't process more
|
|
295
|
-
// data on it while we're still waiting for the threadmanager to
|
|
296
|
-
// finish this task
|
|
297
|
-
setIdle();
|
|
298
|
-
return;
|
|
299
|
-
}
|
|
300
|
-
} else {
|
|
301
|
-
try {
|
|
302
|
-
// Invoke the processor
|
|
303
|
-
server_->getProcessor()->process(inputProtocol_, outputProtocol_);
|
|
304
|
-
} catch (TTransportException &ttx) {
|
|
305
|
-
GlobalOutput.printf("TTransportException: Server::process() %s", ttx.what());
|
|
306
|
-
close();
|
|
307
|
-
return;
|
|
308
|
-
} catch (TException &x) {
|
|
309
|
-
GlobalOutput.printf("TException: Server::process() %s", x.what());
|
|
310
|
-
close();
|
|
311
|
-
return;
|
|
312
|
-
} catch (...) {
|
|
313
|
-
GlobalOutput.printf("Server::process() unknown exception");
|
|
314
|
-
close();
|
|
315
|
-
return;
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
// Intentionally fall through here, the call to process has written into
|
|
320
|
-
// the writeBuffer_
|
|
321
|
-
|
|
322
|
-
case APP_WAIT_TASK:
|
|
323
|
-
// We have now finished processing a task and the result has been written
|
|
324
|
-
// into the outputTransport_, so we grab its contents and place them into
|
|
325
|
-
// the writeBuffer_ for actual writing by the libevent thread
|
|
326
|
-
|
|
327
|
-
// Get the result of the operation
|
|
328
|
-
outputTransport_->getBuffer(&writeBuffer_, &writeBufferSize_);
|
|
329
|
-
|
|
330
|
-
// If the function call generated return data, then move into the send
|
|
331
|
-
// state and get going
|
|
332
|
-
// 4 bytes were reserved for frame size
|
|
333
|
-
if (writeBufferSize_ > 4) {
|
|
334
|
-
|
|
335
|
-
// Move into write state
|
|
336
|
-
writeBufferPos_ = 0;
|
|
337
|
-
socketState_ = SOCKET_SEND;
|
|
338
|
-
|
|
339
|
-
// Put the frame size into the write buffer
|
|
340
|
-
int32_t frameSize = (int32_t)htonl(writeBufferSize_ - 4);
|
|
341
|
-
memcpy(writeBuffer_, &frameSize, 4);
|
|
342
|
-
|
|
343
|
-
// Socket into write mode
|
|
344
|
-
appState_ = APP_SEND_RESULT;
|
|
345
|
-
setWrite();
|
|
346
|
-
|
|
347
|
-
// Try to work the socket immediately
|
|
348
|
-
// workSocket();
|
|
349
|
-
|
|
350
|
-
return;
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
// In this case, the request was oneway and we should fall through
|
|
354
|
-
// right back into the read frame header state
|
|
355
|
-
goto LABEL_APP_INIT;
|
|
356
|
-
|
|
357
|
-
case APP_SEND_RESULT:
|
|
358
|
-
|
|
359
|
-
++numWritesSinceReset_;
|
|
360
|
-
|
|
361
|
-
// N.B.: We also intentionally fall through here into the INIT state!
|
|
362
|
-
|
|
363
|
-
LABEL_APP_INIT:
|
|
364
|
-
case APP_INIT:
|
|
365
|
-
|
|
366
|
-
// reset the input buffer if we used it enough times that it might be bloated
|
|
367
|
-
if (numReadsSinceReset_ > 512)
|
|
368
|
-
{
|
|
369
|
-
void * new_buffer = std::realloc(readBuffer_, 1024);
|
|
370
|
-
if (new_buffer == NULL) {
|
|
371
|
-
GlobalOutput("TConnection::transition() realloc");
|
|
372
|
-
close();
|
|
373
|
-
return;
|
|
374
|
-
}
|
|
375
|
-
readBuffer_ = (uint8_t*) new_buffer;
|
|
376
|
-
readBufferSize_ = 1024;
|
|
377
|
-
numReadsSinceReset_ = 0;
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
// Clear write buffer variables
|
|
381
|
-
writeBuffer_ = NULL;
|
|
382
|
-
writeBufferPos_ = 0;
|
|
383
|
-
writeBufferSize_ = 0;
|
|
384
|
-
|
|
385
|
-
// Set up read buffer for getting 4 bytes
|
|
386
|
-
readBufferPos_ = 0;
|
|
387
|
-
readWant_ = 4;
|
|
388
|
-
|
|
389
|
-
// Into read4 state we go
|
|
390
|
-
socketState_ = SOCKET_RECV;
|
|
391
|
-
appState_ = APP_READ_FRAME_SIZE;
|
|
392
|
-
|
|
393
|
-
// Register read event
|
|
394
|
-
setRead();
|
|
395
|
-
|
|
396
|
-
// Try to work the socket right away
|
|
397
|
-
// workSocket();
|
|
398
|
-
|
|
399
|
-
return;
|
|
400
|
-
|
|
401
|
-
case APP_READ_FRAME_SIZE:
|
|
402
|
-
// We just read the request length, deserialize it
|
|
403
|
-
sz = *(int32_t*)readBuffer_;
|
|
404
|
-
sz = (int32_t)ntohl(sz);
|
|
405
|
-
|
|
406
|
-
if (sz <= 0) {
|
|
407
|
-
GlobalOutput.printf("TConnection:transition() Negative frame size %d, remote side not using TFramedTransport?", sz);
|
|
408
|
-
close();
|
|
409
|
-
return;
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
// Reset the read buffer
|
|
413
|
-
readWant_ = (uint32_t)sz;
|
|
414
|
-
readBufferPos_= 0;
|
|
415
|
-
|
|
416
|
-
// Move into read request state
|
|
417
|
-
appState_ = APP_READ_REQUEST;
|
|
418
|
-
|
|
419
|
-
// Work the socket right away
|
|
420
|
-
// workSocket();
|
|
421
|
-
|
|
422
|
-
return;
|
|
423
|
-
|
|
424
|
-
default:
|
|
425
|
-
GlobalOutput.printf("Totally Fucked. Application State %d", appState_);
|
|
426
|
-
assert(0);
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
void TConnection::setFlags(short eventFlags) {
|
|
431
|
-
// Catch the do nothing case
|
|
432
|
-
if (eventFlags_ == eventFlags) {
|
|
433
|
-
return;
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
// Delete a previously existing event
|
|
437
|
-
if (eventFlags_ != 0) {
|
|
438
|
-
if (event_del(&event_) == -1) {
|
|
439
|
-
GlobalOutput("TConnection::setFlags event_del");
|
|
440
|
-
return;
|
|
441
|
-
}
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
// Update in memory structure
|
|
445
|
-
eventFlags_ = eventFlags;
|
|
446
|
-
|
|
447
|
-
// Do not call event_set if there are no flags
|
|
448
|
-
if (!eventFlags_) {
|
|
449
|
-
return;
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
/**
|
|
453
|
-
* event_set:
|
|
454
|
-
*
|
|
455
|
-
* Prepares the event structure &event to be used in future calls to
|
|
456
|
-
* event_add() and event_del(). The event will be prepared to call the
|
|
457
|
-
* eventHandler using the 'sock' file descriptor to monitor events.
|
|
458
|
-
*
|
|
459
|
-
* The events can be either EV_READ, EV_WRITE, or both, indicating
|
|
460
|
-
* that an application can read or write from the file respectively without
|
|
461
|
-
* blocking.
|
|
462
|
-
*
|
|
463
|
-
* The eventHandler will be called with the file descriptor that triggered
|
|
464
|
-
* the event and the type of event which will be one of: EV_TIMEOUT,
|
|
465
|
-
* EV_SIGNAL, EV_READ, EV_WRITE.
|
|
466
|
-
*
|
|
467
|
-
* The additional flag EV_PERSIST makes an event_add() persistent until
|
|
468
|
-
* event_del() has been called.
|
|
469
|
-
*
|
|
470
|
-
* Once initialized, the &event struct can be used repeatedly with
|
|
471
|
-
* event_add() and event_del() and does not need to be reinitialized unless
|
|
472
|
-
* the eventHandler and/or the argument to it are to be changed. However,
|
|
473
|
-
* when an ev structure has been added to libevent using event_add() the
|
|
474
|
-
* structure must persist until the event occurs (assuming EV_PERSIST
|
|
475
|
-
* is not set) or is removed using event_del(). You may not reuse the same
|
|
476
|
-
* ev structure for multiple monitored descriptors; each descriptor needs
|
|
477
|
-
* its own ev.
|
|
478
|
-
*/
|
|
479
|
-
event_set(&event_, socket_, eventFlags_, TConnection::eventHandler, this);
|
|
480
|
-
event_base_set(server_->getEventBase(), &event_);
|
|
481
|
-
|
|
482
|
-
// Add the event
|
|
483
|
-
if (event_add(&event_, 0) == -1) {
|
|
484
|
-
GlobalOutput("TConnection::setFlags(): could not event_add");
|
|
485
|
-
}
|
|
486
|
-
}
|
|
487
|
-
|
|
488
|
-
/**
|
|
489
|
-
* Closes a connection
|
|
490
|
-
*/
|
|
491
|
-
void TConnection::close() {
|
|
492
|
-
// Delete the registered libevent
|
|
493
|
-
if (event_del(&event_) == -1) {
|
|
494
|
-
GlobalOutput("TConnection::close() event_del");
|
|
495
|
-
}
|
|
496
|
-
|
|
497
|
-
// Close the socket
|
|
498
|
-
if (socket_ > 0) {
|
|
499
|
-
::close(socket_);
|
|
500
|
-
}
|
|
501
|
-
socket_ = 0;
|
|
502
|
-
|
|
503
|
-
// close any factory produced transports
|
|
504
|
-
factoryInputTransport_->close();
|
|
505
|
-
factoryOutputTransport_->close();
|
|
506
|
-
|
|
507
|
-
// Give this object back to the server that owns it
|
|
508
|
-
server_->returnConnection(this);
|
|
509
|
-
}
|
|
510
|
-
|
|
511
|
-
void TConnection::checkIdleBufferMemLimit(uint32_t limit) {
|
|
512
|
-
if (readBufferSize_ > limit) {
|
|
513
|
-
readBufferSize_ = limit;
|
|
514
|
-
readBuffer_ = (uint8_t*)std::realloc(readBuffer_, readBufferSize_);
|
|
515
|
-
if (readBuffer_ == NULL) {
|
|
516
|
-
GlobalOutput("TConnection::checkIdleBufferMemLimit() realloc");
|
|
517
|
-
close();
|
|
518
|
-
}
|
|
519
|
-
}
|
|
520
|
-
}
|
|
521
|
-
|
|
522
|
-
/**
|
|
523
|
-
* Creates a new connection either by reusing an object off the stack or
|
|
524
|
-
* by allocating a new one entirely
|
|
525
|
-
*/
|
|
526
|
-
TConnection* TNonblockingServer::createConnection(int socket, short flags) {
|
|
527
|
-
// Check the stack
|
|
528
|
-
if (connectionStack_.empty()) {
|
|
529
|
-
return new TConnection(socket, flags, this);
|
|
530
|
-
} else {
|
|
531
|
-
TConnection* result = connectionStack_.top();
|
|
532
|
-
connectionStack_.pop();
|
|
533
|
-
result->init(socket, flags, this);
|
|
534
|
-
return result;
|
|
535
|
-
}
|
|
536
|
-
}
|
|
537
|
-
|
|
538
|
-
/**
|
|
539
|
-
* Returns a connection to the stack
|
|
540
|
-
*/
|
|
541
|
-
void TNonblockingServer::returnConnection(TConnection* connection) {
|
|
542
|
-
if (connectionStackLimit_ &&
|
|
543
|
-
(connectionStack_.size() >= connectionStackLimit_)) {
|
|
544
|
-
delete connection;
|
|
545
|
-
} else {
|
|
546
|
-
connection->checkIdleBufferMemLimit(idleBufferMemLimit_);
|
|
547
|
-
connectionStack_.push(connection);
|
|
548
|
-
}
|
|
549
|
-
}
|
|
550
|
-
|
|
551
|
-
/**
|
|
552
|
-
* Server socket had something happen. We accept all waiting client
|
|
553
|
-
* connections on fd and assign TConnection objects to handle those requests.
|
|
554
|
-
*/
|
|
555
|
-
void TNonblockingServer::handleEvent(int fd, short which) {
|
|
556
|
-
// Make sure that libevent didn't fuck up the socket handles
|
|
557
|
-
assert(fd == serverSocket_);
|
|
558
|
-
|
|
559
|
-
// Server socket accepted a new connection
|
|
560
|
-
socklen_t addrLen;
|
|
561
|
-
struct sockaddr addr;
|
|
562
|
-
addrLen = sizeof(addr);
|
|
563
|
-
|
|
564
|
-
// Going to accept a new client socket
|
|
565
|
-
int clientSocket;
|
|
566
|
-
|
|
567
|
-
// Accept as many new clients as possible, even though libevent signaled only
|
|
568
|
-
// one, this helps us to avoid having to go back into the libevent engine so
|
|
569
|
-
// many times
|
|
570
|
-
while ((clientSocket = accept(fd, &addr, &addrLen)) != -1) {
|
|
571
|
-
|
|
572
|
-
// Explicitly set this socket to NONBLOCK mode
|
|
573
|
-
int flags;
|
|
574
|
-
if ((flags = fcntl(clientSocket, F_GETFL, 0)) < 0 ||
|
|
575
|
-
fcntl(clientSocket, F_SETFL, flags | O_NONBLOCK) < 0) {
|
|
576
|
-
GlobalOutput.perror("thriftServerEventHandler: set O_NONBLOCK (fcntl) ", errno);
|
|
577
|
-
close(clientSocket);
|
|
578
|
-
return;
|
|
579
|
-
}
|
|
580
|
-
|
|
581
|
-
// Create a new TConnection for this client socket.
|
|
582
|
-
TConnection* clientConnection =
|
|
583
|
-
createConnection(clientSocket, EV_READ | EV_PERSIST);
|
|
584
|
-
|
|
585
|
-
// Fail fast if we could not create a TConnection object
|
|
586
|
-
if (clientConnection == NULL) {
|
|
587
|
-
GlobalOutput.printf("thriftServerEventHandler: failed TConnection factory");
|
|
588
|
-
close(clientSocket);
|
|
589
|
-
return;
|
|
590
|
-
}
|
|
591
|
-
|
|
592
|
-
// Put this client connection into the proper state
|
|
593
|
-
clientConnection->transition();
|
|
594
|
-
}
|
|
595
|
-
|
|
596
|
-
// Done looping accept, now we have to make sure the error is due to
|
|
597
|
-
// blocking. Any other error is a problem
|
|
598
|
-
if (errno != EAGAIN && errno != EWOULDBLOCK) {
|
|
599
|
-
GlobalOutput.perror("thriftServerEventHandler: accept() ", errno);
|
|
600
|
-
}
|
|
601
|
-
}
|
|
602
|
-
|
|
603
|
-
/**
|
|
604
|
-
* Creates a socket to listen on and binds it to the local port.
|
|
605
|
-
*/
|
|
606
|
-
void TNonblockingServer::listenSocket() {
|
|
607
|
-
int s;
|
|
608
|
-
struct addrinfo hints, *res, *res0;
|
|
609
|
-
int error;
|
|
610
|
-
|
|
611
|
-
char port[sizeof("65536") + 1];
|
|
612
|
-
memset(&hints, 0, sizeof(hints));
|
|
613
|
-
hints.ai_family = PF_UNSPEC;
|
|
614
|
-
hints.ai_socktype = SOCK_STREAM;
|
|
615
|
-
hints.ai_flags = AI_PASSIVE | AI_ADDRCONFIG;
|
|
616
|
-
sprintf(port, "%d", port_);
|
|
617
|
-
|
|
618
|
-
// Wildcard address
|
|
619
|
-
error = getaddrinfo(NULL, port, &hints, &res0);
|
|
620
|
-
if (error) {
|
|
621
|
-
string errStr = "TNonblockingServer::serve() getaddrinfo " + string(gai_strerror(error));
|
|
622
|
-
GlobalOutput(errStr.c_str());
|
|
623
|
-
return;
|
|
624
|
-
}
|
|
625
|
-
|
|
626
|
-
// Pick the ipv6 address first since ipv4 addresses can be mapped
|
|
627
|
-
// into ipv6 space.
|
|
628
|
-
for (res = res0; res; res = res->ai_next) {
|
|
629
|
-
if (res->ai_family == AF_INET6 || res->ai_next == NULL)
|
|
630
|
-
break;
|
|
631
|
-
}
|
|
632
|
-
|
|
633
|
-
// Create the server socket
|
|
634
|
-
s = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
|
|
635
|
-
if (s == -1) {
|
|
636
|
-
freeaddrinfo(res0);
|
|
637
|
-
throw TException("TNonblockingServer::serve() socket() -1");
|
|
638
|
-
}
|
|
639
|
-
|
|
640
|
-
#ifdef IPV6_V6ONLY
|
|
641
|
-
int zero = 0;
|
|
642
|
-
if (-1 == setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, &zero, sizeof(zero))) {
|
|
643
|
-
GlobalOutput("TServerSocket::listen() IPV6_V6ONLY");
|
|
644
|
-
}
|
|
645
|
-
#endif // #ifdef IPV6_V6ONLY
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
int one = 1;
|
|
649
|
-
|
|
650
|
-
// Set reuseaddr to avoid 2MSL delay on server restart
|
|
651
|
-
setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
|
|
652
|
-
|
|
653
|
-
if (bind(s, res->ai_addr, res->ai_addrlen) == -1) {
|
|
654
|
-
close(s);
|
|
655
|
-
freeaddrinfo(res0);
|
|
656
|
-
throw TException("TNonblockingServer::serve() bind");
|
|
657
|
-
}
|
|
658
|
-
|
|
659
|
-
// Done with the addr info
|
|
660
|
-
freeaddrinfo(res0);
|
|
661
|
-
|
|
662
|
-
// Set up this file descriptor for listening
|
|
663
|
-
listenSocket(s);
|
|
664
|
-
}
|
|
665
|
-
|
|
666
|
-
/**
|
|
667
|
-
* Takes a socket created by listenSocket() and sets various options on it
|
|
668
|
-
* to prepare for use in the server.
|
|
669
|
-
*/
|
|
670
|
-
void TNonblockingServer::listenSocket(int s) {
|
|
671
|
-
// Set socket to nonblocking mode
|
|
672
|
-
int flags;
|
|
673
|
-
if ((flags = fcntl(s, F_GETFL, 0)) < 0 ||
|
|
674
|
-
fcntl(s, F_SETFL, flags | O_NONBLOCK) < 0) {
|
|
675
|
-
close(s);
|
|
676
|
-
throw TException("TNonblockingServer::serve() O_NONBLOCK");
|
|
677
|
-
}
|
|
678
|
-
|
|
679
|
-
int one = 1;
|
|
680
|
-
struct linger ling = {0, 0};
|
|
681
|
-
|
|
682
|
-
// Keepalive to ensure full result flushing
|
|
683
|
-
setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, &one, sizeof(one));
|
|
684
|
-
|
|
685
|
-
// Turn linger off to avoid hung sockets
|
|
686
|
-
setsockopt(s, SOL_SOCKET, SO_LINGER, &ling, sizeof(ling));
|
|
687
|
-
|
|
688
|
-
// Set TCP nodelay if available, MAC OS X Hack
|
|
689
|
-
// See http://lists.danga.com/pipermail/memcached/2005-March/001240.html
|
|
690
|
-
#ifndef TCP_NOPUSH
|
|
691
|
-
setsockopt(s, IPPROTO_TCP, TCP_NODELAY, &one, sizeof(one));
|
|
692
|
-
#endif
|
|
693
|
-
|
|
694
|
-
if (listen(s, LISTEN_BACKLOG) == -1) {
|
|
695
|
-
close(s);
|
|
696
|
-
throw TException("TNonblockingServer::serve() listen");
|
|
697
|
-
}
|
|
698
|
-
|
|
699
|
-
// Cool, this socket is good to go, set it as the serverSocket_
|
|
700
|
-
serverSocket_ = s;
|
|
701
|
-
}
|
|
702
|
-
|
|
703
|
-
/**
|
|
704
|
-
* Register the core libevent events onto the proper base.
|
|
705
|
-
*/
|
|
706
|
-
void TNonblockingServer::registerEvents(event_base* base) {
|
|
707
|
-
assert(serverSocket_ != -1);
|
|
708
|
-
assert(!eventBase_);
|
|
709
|
-
eventBase_ = base;
|
|
710
|
-
|
|
711
|
-
// Print some libevent stats
|
|
712
|
-
GlobalOutput.printf("libevent %s method %s",
|
|
713
|
-
event_get_version(),
|
|
714
|
-
event_get_method());
|
|
715
|
-
|
|
716
|
-
// Register the server event
|
|
717
|
-
event_set(&serverEvent_,
|
|
718
|
-
serverSocket_,
|
|
719
|
-
EV_READ | EV_PERSIST,
|
|
720
|
-
TNonblockingServer::eventHandler,
|
|
721
|
-
this);
|
|
722
|
-
event_base_set(eventBase_, &serverEvent_);
|
|
723
|
-
|
|
724
|
-
// Add the event and start up the server
|
|
725
|
-
if (-1 == event_add(&serverEvent_, 0)) {
|
|
726
|
-
throw TException("TNonblockingServer::serve(): coult not event_add");
|
|
727
|
-
}
|
|
728
|
-
}
|
|
729
|
-
|
|
730
|
-
/**
|
|
731
|
-
* Main workhorse function, starts up the server listening on a port and
|
|
732
|
-
* loops over the libevent handler.
|
|
733
|
-
*/
|
|
734
|
-
void TNonblockingServer::serve() {
|
|
735
|
-
// Init socket
|
|
736
|
-
listenSocket();
|
|
737
|
-
|
|
738
|
-
// Initialize libevent core
|
|
739
|
-
registerEvents(static_cast<event_base*>(event_init()));
|
|
740
|
-
|
|
741
|
-
// Run the preServe event
|
|
742
|
-
if (eventHandler_ != NULL) {
|
|
743
|
-
eventHandler_->preServe();
|
|
744
|
-
}
|
|
745
|
-
|
|
746
|
-
// Run libevent engine, never returns, invokes calls to eventHandler
|
|
747
|
-
event_base_loop(eventBase_, 0);
|
|
748
|
-
}
|
|
749
|
-
|
|
750
|
-
}}} // apache::thrift::server
|