auser-poolparty 1.3.0 → 1.3.1

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.
Files changed (353) hide show
  1. data/VERSION.yml +1 -1
  2. data/examples/monitored_cloud.rb +1 -1
  3. data/examples/thrift/thrift_example.rb +1 -1
  4. data/lib/proto/command_interface_handler.rb +1 -1
  5. data/vendor/gems/thrift/CHANGES +35 -0
  6. data/vendor/gems/thrift/CONTRIBUTORS +77 -0
  7. data/vendor/gems/thrift/DISCLAIMER +6 -0
  8. data/vendor/gems/thrift/LICENSE +202 -0
  9. data/vendor/gems/thrift/Makefile.am +28 -0
  10. data/vendor/gems/thrift/NEWS +79 -0
  11. data/vendor/gems/thrift/NOTICE +26 -0
  12. data/vendor/gems/thrift/README +137 -0
  13. data/vendor/gems/thrift/aclocal/ax_boost_base.m4 +198 -0
  14. data/vendor/gems/thrift/aclocal/ax_javac_and_java.m4 +107 -0
  15. data/vendor/gems/thrift/aclocal/ax_lib_event.m4 +194 -0
  16. data/vendor/gems/thrift/aclocal/ax_lib_zlib.m4 +173 -0
  17. data/vendor/gems/thrift/aclocal/ax_signed_right_shift.m4 +127 -0
  18. data/vendor/gems/thrift/aclocal/ax_thrift_internal.m4 +39 -0
  19. data/vendor/gems/thrift/bootstrap.sh +35 -0
  20. data/vendor/gems/thrift/cleanup.sh +58 -0
  21. data/vendor/gems/thrift/compiler/cpp/Makefile.am +136 -0
  22. data/vendor/gems/thrift/compiler/cpp/README +39 -0
  23. data/vendor/gems/thrift/compiler/cpp/src/generate/t_cocoa_generator.cc +2331 -0
  24. data/vendor/gems/thrift/compiler/cpp/src/generate/t_cpp_generator.cc +3003 -0
  25. data/vendor/gems/thrift/compiler/cpp/src/generate/t_csharp_generator.cc +1700 -0
  26. data/vendor/gems/thrift/compiler/cpp/src/generate/t_erl_generator.cc +932 -0
  27. data/vendor/gems/thrift/compiler/cpp/src/generate/t_generator.cc +173 -0
  28. data/vendor/gems/thrift/compiler/cpp/src/generate/t_generator.h +321 -0
  29. data/vendor/gems/thrift/compiler/cpp/src/generate/t_hs_generator.cc +1445 -0
  30. data/vendor/gems/thrift/compiler/cpp/src/generate/t_html_generator.cc +637 -0
  31. data/vendor/gems/thrift/compiler/cpp/src/generate/t_java_generator.cc +3069 -0
  32. data/vendor/gems/thrift/compiler/cpp/src/generate/t_ocaml_generator.cc +1673 -0
  33. data/vendor/gems/thrift/compiler/cpp/src/generate/t_oop_generator.h +77 -0
  34. data/vendor/gems/thrift/compiler/cpp/src/generate/t_perl_generator.cc +1812 -0
  35. data/vendor/gems/thrift/compiler/cpp/src/generate/t_php_generator.cc +2281 -0
  36. data/vendor/gems/thrift/compiler/cpp/src/generate/t_py_generator.cc +2310 -0
  37. data/vendor/gems/thrift/compiler/cpp/src/generate/t_rb_generator.cc +1114 -0
  38. data/vendor/gems/thrift/compiler/cpp/src/generate/t_st_generator.cc +1071 -0
  39. data/vendor/gems/thrift/compiler/cpp/src/generate/t_xsd_generator.cc +354 -0
  40. data/vendor/gems/thrift/compiler/cpp/src/globals.h +117 -0
  41. data/vendor/gems/thrift/compiler/cpp/src/main.cc +1207 -0
  42. data/vendor/gems/thrift/compiler/cpp/src/main.h +103 -0
  43. data/vendor/gems/thrift/compiler/cpp/src/md5.c +381 -0
  44. data/vendor/gems/thrift/compiler/cpp/src/md5.h +91 -0
  45. data/vendor/gems/thrift/compiler/cpp/src/parse/t_base_type.h +137 -0
  46. data/vendor/gems/thrift/compiler/cpp/src/parse/t_const.h +59 -0
  47. data/vendor/gems/thrift/compiler/cpp/src/parse/t_const_value.h +121 -0
  48. data/vendor/gems/thrift/compiler/cpp/src/parse/t_container.h +56 -0
  49. data/vendor/gems/thrift/compiler/cpp/src/parse/t_doc.h +51 -0
  50. data/vendor/gems/thrift/compiler/cpp/src/parse/t_enum.h +59 -0
  51. data/vendor/gems/thrift/compiler/cpp/src/parse/t_enum_value.h +64 -0
  52. data/vendor/gems/thrift/compiler/cpp/src/parse/t_field.h +150 -0
  53. data/vendor/gems/thrift/compiler/cpp/src/parse/t_function.h +93 -0
  54. data/vendor/gems/thrift/compiler/cpp/src/parse/t_list.h +56 -0
  55. data/vendor/gems/thrift/compiler/cpp/src/parse/t_map.h +64 -0
  56. data/vendor/gems/thrift/compiler/cpp/src/parse/t_program.h +223 -0
  57. data/vendor/gems/thrift/compiler/cpp/src/parse/t_scope.h +86 -0
  58. data/vendor/gems/thrift/compiler/cpp/src/parse/t_service.h +68 -0
  59. data/vendor/gems/thrift/compiler/cpp/src/parse/t_set.h +55 -0
  60. data/vendor/gems/thrift/compiler/cpp/src/parse/t_struct.h +127 -0
  61. data/vendor/gems/thrift/compiler/cpp/src/parse/t_type.h +176 -0
  62. data/vendor/gems/thrift/compiler/cpp/src/parse/t_typedef.h +70 -0
  63. data/vendor/gems/thrift/compiler/cpp/src/platform.h +36 -0
  64. data/vendor/gems/thrift/compiler/cpp/src/thriftl.ll +303 -0
  65. data/vendor/gems/thrift/compiler/cpp/src/thrifty.yy +1140 -0
  66. data/vendor/gems/thrift/configure.ac +255 -0
  67. data/vendor/gems/thrift/contrib/fb303/LICENSE +16 -0
  68. data/vendor/gems/thrift/contrib/fb303/Makefile.am +31 -0
  69. data/vendor/gems/thrift/contrib/fb303/README +37 -0
  70. data/vendor/gems/thrift/contrib/fb303/acinclude.m4 +258 -0
  71. data/vendor/gems/thrift/contrib/fb303/aclocal/ax_boost_base.m4 +198 -0
  72. data/vendor/gems/thrift/contrib/fb303/bootstrap.sh +26 -0
  73. data/vendor/gems/thrift/contrib/fb303/configure.ac +115 -0
  74. data/vendor/gems/thrift/contrib/fb303/cpp/FacebookBase.cpp +124 -0
  75. data/vendor/gems/thrift/contrib/fb303/cpp/FacebookBase.h +103 -0
  76. data/vendor/gems/thrift/contrib/fb303/cpp/Makefile.am +84 -0
  77. data/vendor/gems/thrift/contrib/fb303/cpp/ServiceTracker.cpp +481 -0
  78. data/vendor/gems/thrift/contrib/fb303/cpp/ServiceTracker.h +215 -0
  79. data/vendor/gems/thrift/contrib/fb303/global_footer.mk +21 -0
  80. data/vendor/gems/thrift/contrib/fb303/global_header.mk +38 -0
  81. data/vendor/gems/thrift/contrib/fb303/if/fb303.thrift +112 -0
  82. data/vendor/gems/thrift/contrib/fb303/java/FacebookBase.java +103 -0
  83. data/vendor/gems/thrift/contrib/fb303/java/build.xml +84 -0
  84. data/vendor/gems/thrift/contrib/fb303/php/FacebookBase.php +89 -0
  85. data/vendor/gems/thrift/contrib/fb303/py/Makefile.am +44 -0
  86. data/vendor/gems/thrift/contrib/fb303/py/fb303/FacebookBase.py +82 -0
  87. data/vendor/gems/thrift/contrib/fb303/py/fb303_scripts/__init__.py +20 -0
  88. data/vendor/gems/thrift/contrib/fb303/py/fb303_scripts/fb303_simple_mgmt.py +195 -0
  89. data/vendor/gems/thrift/contrib/fb303/py/setup.py +27 -0
  90. data/vendor/gems/thrift/contrib/thrift.el +126 -0
  91. data/vendor/gems/thrift/contrib/thrift.spec +206 -0
  92. data/vendor/gems/thrift/contrib/thrift.vim +91 -0
  93. data/vendor/gems/thrift/contrib/thrift_dump.cpp +91 -0
  94. data/vendor/gems/thrift/doc/lgpl-2.1.txt +504 -0
  95. data/vendor/gems/thrift/doc/otp-base-license.txt +20 -0
  96. data/vendor/gems/thrift/doc/thrift.bnf +96 -0
  97. data/vendor/gems/thrift/doc/thrift.tex +1057 -0
  98. data/vendor/gems/thrift/lib/Makefile.am +55 -0
  99. data/vendor/gems/thrift/lib/cocoa/README +21 -0
  100. data/vendor/gems/thrift/lib/cocoa/src/TApplicationException.h +44 -0
  101. data/vendor/gems/thrift/lib/cocoa/src/TApplicationException.m +130 -0
  102. data/vendor/gems/thrift/lib/cocoa/src/TException.h +34 -0
  103. data/vendor/gems/thrift/lib/cocoa/src/TException.m +64 -0
  104. data/vendor/gems/thrift/lib/cocoa/src/TProcessor.h +29 -0
  105. data/vendor/gems/thrift/lib/cocoa/src/TProcessorFactory.h +27 -0
  106. data/vendor/gems/thrift/lib/cocoa/src/TSharedProcessorFactory.h +27 -0
  107. data/vendor/gems/thrift/lib/cocoa/src/TSharedProcessorFactory.m +51 -0
  108. data/vendor/gems/thrift/lib/cocoa/src/protocol/TBinaryProtocol.h +51 -0
  109. data/vendor/gems/thrift/lib/cocoa/src/protocol/TBinaryProtocol.m +477 -0
  110. data/vendor/gems/thrift/lib/cocoa/src/protocol/TProtocol.h +148 -0
  111. data/vendor/gems/thrift/lib/cocoa/src/protocol/TProtocolException.h +25 -0
  112. data/vendor/gems/thrift/lib/cocoa/src/protocol/TProtocolException.m +23 -0
  113. data/vendor/gems/thrift/lib/cocoa/src/protocol/TProtocolFactory.h +29 -0
  114. data/vendor/gems/thrift/lib/cocoa/src/protocol/TProtocolUtil.h +29 -0
  115. data/vendor/gems/thrift/lib/cocoa/src/protocol/TProtocolUtil.m +104 -0
  116. data/vendor/gems/thrift/lib/cocoa/src/server/TSocketServer.h +50 -0
  117. data/vendor/gems/thrift/lib/cocoa/src/server/TSocketServer.m +153 -0
  118. data/vendor/gems/thrift/lib/cocoa/src/transport/THTTPClient.h +42 -0
  119. data/vendor/gems/thrift/lib/cocoa/src/transport/THTTPClient.m +159 -0
  120. data/vendor/gems/thrift/lib/cocoa/src/transport/TNSFileHandleTransport.h +35 -0
  121. data/vendor/gems/thrift/lib/cocoa/src/transport/TNSFileHandleTransport.m +91 -0
  122. data/vendor/gems/thrift/lib/cocoa/src/transport/TNSStreamTransport.h +38 -0
  123. data/vendor/gems/thrift/lib/cocoa/src/transport/TNSStreamTransport.m +89 -0
  124. data/vendor/gems/thrift/lib/cocoa/src/transport/TSocketClient.h +32 -0
  125. data/vendor/gems/thrift/lib/cocoa/src/transport/TSocketClient.m +58 -0
  126. data/vendor/gems/thrift/lib/cocoa/src/transport/TTransport.h +36 -0
  127. data/vendor/gems/thrift/lib/cocoa/src/transport/TTransportException.h +30 -0
  128. data/vendor/gems/thrift/lib/cocoa/src/transport/TTransportException.m +43 -0
  129. data/vendor/gems/thrift/lib/cpp/Makefile.am +158 -0
  130. data/vendor/gems/thrift/lib/cpp/README +67 -0
  131. data/vendor/gems/thrift/lib/cpp/src/TLogging.h +163 -0
  132. data/vendor/gems/thrift/lib/cpp/src/TProcessor.h +53 -0
  133. data/vendor/gems/thrift/lib/cpp/src/TReflectionLocal.h +96 -0
  134. data/vendor/gems/thrift/lib/cpp/src/Thrift.cpp +148 -0
  135. data/vendor/gems/thrift/lib/cpp/src/Thrift.h +191 -0
  136. data/vendor/gems/thrift/lib/cpp/src/concurrency/Exception.h +60 -0
  137. data/vendor/gems/thrift/lib/cpp/src/concurrency/FunctionRunner.h +77 -0
  138. data/vendor/gems/thrift/lib/cpp/src/concurrency/Monitor.cpp +137 -0
  139. data/vendor/gems/thrift/lib/cpp/src/concurrency/Monitor.h +84 -0
  140. data/vendor/gems/thrift/lib/cpp/src/concurrency/Mutex.cpp +160 -0
  141. data/vendor/gems/thrift/lib/cpp/src/concurrency/Mutex.h +114 -0
  142. data/vendor/gems/thrift/lib/cpp/src/concurrency/PosixThreadFactory.cpp +314 -0
  143. data/vendor/gems/thrift/lib/cpp/src/concurrency/PosixThreadFactory.h +130 -0
  144. data/vendor/gems/thrift/lib/cpp/src/concurrency/Thread.h +125 -0
  145. data/vendor/gems/thrift/lib/cpp/src/concurrency/ThreadManager.cpp +493 -0
  146. data/vendor/gems/thrift/lib/cpp/src/concurrency/ThreadManager.h +169 -0
  147. data/vendor/gems/thrift/lib/cpp/src/concurrency/TimerManager.cpp +284 -0
  148. data/vendor/gems/thrift/lib/cpp/src/concurrency/TimerManager.h +122 -0
  149. data/vendor/gems/thrift/lib/cpp/src/concurrency/Util.cpp +55 -0
  150. data/vendor/gems/thrift/lib/cpp/src/concurrency/Util.h +100 -0
  151. data/vendor/gems/thrift/lib/cpp/src/concurrency/test/Tests.cpp +155 -0
  152. data/vendor/gems/thrift/lib/cpp/src/concurrency/test/ThreadFactoryTests.h +354 -0
  153. data/vendor/gems/thrift/lib/cpp/src/concurrency/test/ThreadManagerTests.h +379 -0
  154. data/vendor/gems/thrift/lib/cpp/src/concurrency/test/TimerManagerTests.h +155 -0
  155. data/vendor/gems/thrift/lib/cpp/src/processor/PeekProcessor.cpp +122 -0
  156. data/vendor/gems/thrift/lib/cpp/src/processor/PeekProcessor.h +77 -0
  157. data/vendor/gems/thrift/lib/cpp/src/processor/StatsProcessor.h +264 -0
  158. data/vendor/gems/thrift/lib/cpp/src/protocol/TBase64Utils.cpp +79 -0
  159. data/vendor/gems/thrift/lib/cpp/src/protocol/TBase64Utils.h +42 -0
  160. data/vendor/gems/thrift/lib/cpp/src/protocol/TBinaryProtocol.cpp +394 -0
  161. data/vendor/gems/thrift/lib/cpp/src/protocol/TBinaryProtocol.h +254 -0
  162. data/vendor/gems/thrift/lib/cpp/src/protocol/TCompactProtocol.cpp +736 -0
  163. data/vendor/gems/thrift/lib/cpp/src/protocol/TCompactProtocol.h +279 -0
  164. data/vendor/gems/thrift/lib/cpp/src/protocol/TDebugProtocol.cpp +346 -0
  165. data/vendor/gems/thrift/lib/cpp/src/protocol/TDebugProtocol.h +225 -0
  166. data/vendor/gems/thrift/lib/cpp/src/protocol/TDenseProtocol.cpp +762 -0
  167. data/vendor/gems/thrift/lib/cpp/src/protocol/TDenseProtocol.h +253 -0
  168. data/vendor/gems/thrift/lib/cpp/src/protocol/TJSONProtocol.cpp +998 -0
  169. data/vendor/gems/thrift/lib/cpp/src/protocol/TJSONProtocol.h +340 -0
  170. data/vendor/gems/thrift/lib/cpp/src/protocol/TOneWayProtocol.h +304 -0
  171. data/vendor/gems/thrift/lib/cpp/src/protocol/TProtocol.h +438 -0
  172. data/vendor/gems/thrift/lib/cpp/src/protocol/TProtocolException.h +104 -0
  173. data/vendor/gems/thrift/lib/cpp/src/protocol/TProtocolTap.h +187 -0
  174. data/vendor/gems/thrift/lib/cpp/src/server/TNonblockingServer.cpp +750 -0
  175. data/vendor/gems/thrift/lib/cpp/src/server/TNonblockingServer.h +435 -0
  176. data/vendor/gems/thrift/lib/cpp/src/server/TServer.cpp +38 -0
  177. data/vendor/gems/thrift/lib/cpp/src/server/TServer.h +213 -0
  178. data/vendor/gems/thrift/lib/cpp/src/server/TSimpleServer.cpp +118 -0
  179. data/vendor/gems/thrift/lib/cpp/src/server/TSimpleServer.h +70 -0
  180. data/vendor/gems/thrift/lib/cpp/src/server/TThreadPoolServer.cpp +217 -0
  181. data/vendor/gems/thrift/lib/cpp/src/server/TThreadPoolServer.h +79 -0
  182. data/vendor/gems/thrift/lib/cpp/src/server/TThreadedServer.cpp +243 -0
  183. data/vendor/gems/thrift/lib/cpp/src/server/TThreadedServer.h +74 -0
  184. data/vendor/gems/thrift/lib/cpp/src/transport/TBufferTransports.cpp +370 -0
  185. data/vendor/gems/thrift/lib/cpp/src/transport/TBufferTransports.h +667 -0
  186. data/vendor/gems/thrift/lib/cpp/src/transport/TFDTransport.cpp +77 -0
  187. data/vendor/gems/thrift/lib/cpp/src/transport/TFDTransport.h +73 -0
  188. data/vendor/gems/thrift/lib/cpp/src/transport/TFileTransport.cpp +953 -0
  189. data/vendor/gems/thrift/lib/cpp/src/transport/TFileTransport.h +442 -0
  190. data/vendor/gems/thrift/lib/cpp/src/transport/THttpClient.cpp +348 -0
  191. data/vendor/gems/thrift/lib/cpp/src/transport/THttpClient.h +111 -0
  192. data/vendor/gems/thrift/lib/cpp/src/transport/TServerSocket.cpp +368 -0
  193. data/vendor/gems/thrift/lib/cpp/src/transport/TServerSocket.h +76 -0
  194. data/vendor/gems/thrift/lib/cpp/src/transport/TServerTransport.h +92 -0
  195. data/vendor/gems/thrift/lib/cpp/src/transport/TShortReadTransport.h +96 -0
  196. data/vendor/gems/thrift/lib/cpp/src/transport/TSimpleFileTransport.cpp +54 -0
  197. data/vendor/gems/thrift/lib/cpp/src/transport/TSimpleFileTransport.h +41 -0
  198. data/vendor/gems/thrift/lib/cpp/src/transport/TSocket.cpp +591 -0
  199. data/vendor/gems/thrift/lib/cpp/src/transport/TSocket.h +242 -0
  200. data/vendor/gems/thrift/lib/cpp/src/transport/TSocketPool.cpp +235 -0
  201. data/vendor/gems/thrift/lib/cpp/src/transport/TSocketPool.h +191 -0
  202. data/vendor/gems/thrift/lib/cpp/src/transport/TTransport.h +224 -0
  203. data/vendor/gems/thrift/lib/cpp/src/transport/TTransportException.cpp +31 -0
  204. data/vendor/gems/thrift/lib/cpp/src/transport/TTransportException.h +117 -0
  205. data/vendor/gems/thrift/lib/cpp/src/transport/TTransportUtils.cpp +178 -0
  206. data/vendor/gems/thrift/lib/cpp/src/transport/TTransportUtils.h +287 -0
  207. data/vendor/gems/thrift/lib/cpp/src/transport/TZlibTransport.cpp +299 -0
  208. data/vendor/gems/thrift/lib/cpp/src/transport/TZlibTransport.h +219 -0
  209. data/vendor/gems/thrift/lib/cpp/thrift-nb.pc.in +30 -0
  210. data/vendor/gems/thrift/lib/cpp/thrift-z.pc.in +30 -0
  211. data/vendor/gems/thrift/lib/cpp/thrift.pc.in +29 -0
  212. data/vendor/gems/thrift/lib/csharp/Makefile.am +70 -0
  213. data/vendor/gems/thrift/lib/csharp/README +26 -0
  214. data/vendor/gems/thrift/lib/csharp/ThriftMSBuildTask/Properties/AssemblyInfo.cs +55 -0
  215. data/vendor/gems/thrift/lib/csharp/ThriftMSBuildTask/ThriftBuild.cs +242 -0
  216. data/vendor/gems/thrift/lib/csharp/ThriftMSBuildTask/ThriftMSBuildTask.csproj +62 -0
  217. data/vendor/gems/thrift/lib/csharp/src/Collections/THashSet.cs +142 -0
  218. data/vendor/gems/thrift/lib/csharp/src/Protocol/TBase.cs +34 -0
  219. data/vendor/gems/thrift/lib/csharp/src/Protocol/TBinaryProtocol.cs +392 -0
  220. data/vendor/gems/thrift/lib/csharp/src/Protocol/TField.cs +58 -0
  221. data/vendor/gems/thrift/lib/csharp/src/Protocol/TList.cs +50 -0
  222. data/vendor/gems/thrift/lib/csharp/src/Protocol/TMap.cs +58 -0
  223. data/vendor/gems/thrift/lib/csharp/src/Protocol/TMessage.cs +58 -0
  224. data/vendor/gems/thrift/lib/csharp/src/Protocol/TMessageType.cs +31 -0
  225. data/vendor/gems/thrift/lib/csharp/src/Protocol/TProtocol.cs +87 -0
  226. data/vendor/gems/thrift/lib/csharp/src/Protocol/TProtocolException.cs +61 -0
  227. data/vendor/gems/thrift/lib/csharp/src/Protocol/TProtocolFactory.cs +29 -0
  228. data/vendor/gems/thrift/lib/csharp/src/Protocol/TProtocolUtil.cs +94 -0
  229. data/vendor/gems/thrift/lib/csharp/src/Protocol/TSet.cs +50 -0
  230. data/vendor/gems/thrift/lib/csharp/src/Protocol/TStruct.cs +42 -0
  231. data/vendor/gems/thrift/lib/csharp/src/Protocol/TType.cs +40 -0
  232. data/vendor/gems/thrift/lib/csharp/src/Server/TServer.cs +135 -0
  233. data/vendor/gems/thrift/lib/csharp/src/Server/TSimpleServer.cs +148 -0
  234. data/vendor/gems/thrift/lib/csharp/src/Server/TThreadPoolServer.cs +186 -0
  235. data/vendor/gems/thrift/lib/csharp/src/Server/TThreadedServer.cs +234 -0
  236. data/vendor/gems/thrift/lib/csharp/src/TApplicationException.cs +131 -0
  237. data/vendor/gems/thrift/lib/csharp/src/TProcessor.cs +29 -0
  238. data/vendor/gems/thrift/lib/csharp/src/Thrift.csproj +73 -0
  239. data/vendor/gems/thrift/lib/csharp/src/Thrift.sln +35 -0
  240. data/vendor/gems/thrift/lib/csharp/src/Transport/TBufferedTransport.cs +100 -0
  241. data/vendor/gems/thrift/lib/csharp/src/Transport/TServerSocket.cs +157 -0
  242. data/vendor/gems/thrift/lib/csharp/src/Transport/TServerTransport.cs +39 -0
  243. data/vendor/gems/thrift/lib/csharp/src/Transport/TSocket.cs +144 -0
  244. data/vendor/gems/thrift/lib/csharp/src/Transport/TStreamTransport.cs +103 -0
  245. data/vendor/gems/thrift/lib/csharp/src/Transport/TTransport.cs +66 -0
  246. data/vendor/gems/thrift/lib/csharp/src/Transport/TTransportException.cs +64 -0
  247. data/vendor/gems/thrift/lib/csharp/src/Transport/TTransportFactory.cs +38 -0
  248. data/vendor/gems/thrift/lib/erl/Makefile +37 -0
  249. data/vendor/gems/thrift/lib/erl/README +56 -0
  250. data/vendor/gems/thrift/lib/erl/build/beamver +59 -0
  251. data/vendor/gems/thrift/lib/erl/build/buildtargets.mk +15 -0
  252. data/vendor/gems/thrift/lib/erl/build/colors.mk +24 -0
  253. data/vendor/gems/thrift/lib/erl/build/docs.mk +12 -0
  254. data/vendor/gems/thrift/lib/erl/build/mime.types +98 -0
  255. data/vendor/gems/thrift/lib/erl/build/otp.mk +146 -0
  256. data/vendor/gems/thrift/lib/erl/build/otp_subdir.mk +85 -0
  257. data/vendor/gems/thrift/lib/erl/build/raw_test.mk +29 -0
  258. data/vendor/gems/thrift/lib/erl/include/thrift_constants.hrl +54 -0
  259. data/vendor/gems/thrift/lib/erl/include/thrift_protocol.hrl +31 -0
  260. data/vendor/gems/thrift/lib/erl/src/Makefile +116 -0
  261. data/vendor/gems/thrift/lib/erl/src/test_handler.erl +26 -0
  262. data/vendor/gems/thrift/lib/erl/src/test_service.erl +29 -0
  263. data/vendor/gems/thrift/lib/erl/src/thrift.app.src +44 -0
  264. data/vendor/gems/thrift/lib/erl/src/thrift.appup.src +1 -0
  265. data/vendor/gems/thrift/lib/erl/src/thrift_base64_transport.erl +64 -0
  266. data/vendor/gems/thrift/lib/erl/src/thrift_binary_protocol.erl +325 -0
  267. data/vendor/gems/thrift/lib/erl/src/thrift_buffered_transport.erl +180 -0
  268. data/vendor/gems/thrift/lib/erl/src/thrift_client.erl +384 -0
  269. data/vendor/gems/thrift/lib/erl/src/thrift_disk_log_transport.erl +118 -0
  270. data/vendor/gems/thrift/lib/erl/src/thrift_file_transport.erl +87 -0
  271. data/vendor/gems/thrift/lib/erl/src/thrift_framed_transport.erl +208 -0
  272. data/vendor/gems/thrift/lib/erl/src/thrift_http_transport.erl +199 -0
  273. data/vendor/gems/thrift/lib/erl/src/thrift_memory_buffer.erl +164 -0
  274. data/vendor/gems/thrift/lib/erl/src/thrift_processor.erl +188 -0
  275. data/vendor/gems/thrift/lib/erl/src/thrift_protocol.erl +356 -0
  276. data/vendor/gems/thrift/lib/erl/src/thrift_server.erl +183 -0
  277. data/vendor/gems/thrift/lib/erl/src/thrift_service.erl +25 -0
  278. data/vendor/gems/thrift/lib/erl/src/thrift_socket_server.erl +249 -0
  279. data/vendor/gems/thrift/lib/erl/src/thrift_socket_transport.erl +119 -0
  280. data/vendor/gems/thrift/lib/erl/src/thrift_transport.erl +57 -0
  281. data/vendor/gems/thrift/lib/erl/vsn.mk +1 -0
  282. data/vendor/gems/thrift/lib/hs/README +82 -0
  283. data/vendor/gems/thrift/lib/hs/Setup.lhs +23 -0
  284. data/vendor/gems/thrift/lib/hs/TODO +2 -0
  285. data/vendor/gems/thrift/lib/hs/Thrift.cabal +20 -0
  286. data/vendor/gems/thrift/lib/hs/src/Thrift.hs +111 -0
  287. data/vendor/gems/thrift/lib/hs/src/Thrift/Protocol.hs +191 -0
  288. data/vendor/gems/thrift/lib/hs/src/Thrift/Protocol/Binary.hs +147 -0
  289. data/vendor/gems/thrift/lib/hs/src/Thrift/Server.hs +65 -0
  290. data/vendor/gems/thrift/lib/hs/src/Thrift/Transport.hs +60 -0
  291. data/vendor/gems/thrift/lib/hs/src/Thrift/Transport/Handle.hs +58 -0
  292. data/vendor/gems/thrift/lib/java/Makefile.am +38 -0
  293. data/vendor/gems/thrift/lib/java/README +43 -0
  294. data/vendor/gems/thrift/lib/java/build.xml +195 -0
  295. data/vendor/gems/thrift/lib/java/ivy.xml +8 -0
  296. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/IntRangeSet.java +171 -0
  297. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TApplicationException.java +123 -0
  298. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TBase.java +66 -0
  299. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TBaseHelper.java +102 -0
  300. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TByteArrayOutputStream.java +46 -0
  301. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TDeserializer.java +94 -0
  302. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TException.java +45 -0
  303. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TFieldRequirementType.java +30 -0
  304. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TProcessor.java +32 -0
  305. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TProcessorFactory.java +39 -0
  306. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/TSerializer.java +110 -0
  307. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/meta_data/FieldMetaData.java +69 -0
  308. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/meta_data/FieldValueMetaData.java +42 -0
  309. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/meta_data/ListMetaData.java +29 -0
  310. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/meta_data/MapMetaData.java +31 -0
  311. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/meta_data/SetMetaData.java +29 -0
  312. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/meta_data/StructMetaData.java +31 -0
  313. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TBase64Utils.java +128 -0
  314. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TBinaryProtocol.java +331 -0
  315. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TCompactProtocol.java +741 -0
  316. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TField.java +48 -0
  317. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TJSONProtocol.java +927 -0
  318. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TList.java +38 -0
  319. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TMap.java +40 -0
  320. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TMessage.java +48 -0
  321. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TMessageType.java +31 -0
  322. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TProtocol.java +146 -0
  323. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TProtocolException.java +81 -0
  324. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TProtocolFactory.java +30 -0
  325. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TProtocolUtil.java +158 -0
  326. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TSet.java +42 -0
  327. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TSimpleJSONProtocol.java +384 -0
  328. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TStruct.java +36 -0
  329. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/protocol/TType.java +40 -0
  330. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/server/THsHaServer.java +304 -0
  331. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/server/TNonblockingServer.java +772 -0
  332. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/server/TServer.java +126 -0
  333. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/server/TSimpleServer.java +145 -0
  334. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/server/TThreadPoolServer.java +271 -0
  335. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TFramedTransport.java +126 -0
  336. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/THttpClient.java +157 -0
  337. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TIOStreamTransport.java +159 -0
  338. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TMemoryBuffer.java +98 -0
  339. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TNonblockingServerSocket.java +160 -0
  340. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TNonblockingServerTransport.java +31 -0
  341. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TNonblockingSocket.java +213 -0
  342. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TNonblockingTransport.java +31 -0
  343. data/vendor/gems/thrift/lib/java/src/org/apache/thrift/transport/TServerSocket.java +145 -0
  344. metadata +348 -37
  345. data/vendor/gems/trollop/FAQ.txt +0 -35
  346. data/vendor/gems/trollop/History.txt +0 -84
  347. data/vendor/gems/trollop/Manifest.txt +0 -7
  348. data/vendor/gems/trollop/README.txt +0 -38
  349. data/vendor/gems/trollop/Rakefile +0 -36
  350. data/vendor/gems/trollop/lib/trollop.rb +0 -695
  351. data/vendor/gems/trollop/release-script.txt +0 -13
  352. data/vendor/gems/trollop/test/test_trollop.rb +0 -957
  353. data/vendor/gems/trollop/www/index.html +0 -167
@@ -0,0 +1,40 @@
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
+ package org.apache.thrift.protocol;
21
+
22
+ /**
23
+ * Type constants in the Thrift protocol.
24
+ *
25
+ */
26
+ public final class TType {
27
+ public static final byte STOP = 0;
28
+ public static final byte VOID = 1;
29
+ public static final byte BOOL = 2;
30
+ public static final byte BYTE = 3;
31
+ public static final byte DOUBLE = 4;
32
+ public static final byte I16 = 6;
33
+ public static final byte I32 = 8;
34
+ public static final byte I64 = 10;
35
+ public static final byte STRING = 11;
36
+ public static final byte STRUCT = 12;
37
+ public static final byte MAP = 13;
38
+ public static final byte SET = 14;
39
+ public static final byte LIST = 15;
40
+ }
@@ -0,0 +1,304 @@
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
+
21
+ package org.apache.thrift.server;
22
+
23
+ import java.util.concurrent.ExecutorService;
24
+ import java.util.concurrent.LinkedBlockingQueue;
25
+ import java.util.concurrent.ThreadPoolExecutor;
26
+ import java.util.concurrent.TimeUnit;
27
+
28
+ import org.apache.thrift.TProcessor;
29
+ import org.apache.thrift.TProcessorFactory;
30
+ import org.apache.thrift.protocol.TBinaryProtocol;
31
+ import org.apache.thrift.protocol.TProtocolFactory;
32
+ import org.apache.thrift.transport.TFramedTransport;
33
+ import org.apache.thrift.transport.TNonblockingServerTransport;
34
+
35
+ /**
36
+ * An extension of the TNonblockingServer to a Half-Sync/Half-Async server.
37
+ * Like TNonblockingServer, it relies on the use of TFramedTransport.
38
+ */
39
+ public class THsHaServer extends TNonblockingServer {
40
+
41
+ // This wraps all the functionality of queueing and thread pool management
42
+ // for the passing of Invocations from the Selector to workers.
43
+ private ExecutorService invoker;
44
+
45
+ protected final int MIN_WORKER_THREADS;
46
+ protected final int MAX_WORKER_THREADS;
47
+ protected final int STOP_TIMEOUT_VAL;
48
+ protected final TimeUnit STOP_TIMEOUT_UNIT;
49
+
50
+ /**
51
+ * Create server with given processor, and server transport. Default server
52
+ * options, TBinaryProtocol for the protocol, and TFramedTransport.Factory on
53
+ * both input and output transports. A TProcessorFactory will be created that
54
+ * always returns the specified processor.
55
+ */
56
+ public THsHaServer( TProcessor processor,
57
+ TNonblockingServerTransport serverTransport) {
58
+ this(processor, serverTransport, new Options());
59
+ }
60
+
61
+ /**
62
+ * Create server with given processor, server transport, and server options
63
+ * using TBinaryProtocol for the protocol, and TFramedTransport.Factory on
64
+ * both input and output transports. A TProcessorFactory will be created that
65
+ * always returns the specified processor.
66
+ */
67
+ public THsHaServer( TProcessor processor,
68
+ TNonblockingServerTransport serverTransport,
69
+ Options options) {
70
+ this(new TProcessorFactory(processor), serverTransport, options);
71
+ }
72
+
73
+ /**
74
+ * Create server with specified processor factory and server transport. Uses
75
+ * default options. TBinaryProtocol is assumed. TFramedTransport.Factory is
76
+ * used on both input and output transports.
77
+ */
78
+ public THsHaServer( TProcessorFactory processorFactory,
79
+ TNonblockingServerTransport serverTransport) {
80
+ this(processorFactory, serverTransport, new Options());
81
+ }
82
+
83
+ /**
84
+ * Create server with specified processor factory, server transport, and server
85
+ * options. TBinaryProtocol is assumed. TFramedTransport.Factory is used on
86
+ * both input and output transports.
87
+ */
88
+ public THsHaServer( TProcessorFactory processorFactory,
89
+ TNonblockingServerTransport serverTransport,
90
+ Options options) {
91
+ this(processorFactory, serverTransport, new TFramedTransport.Factory(),
92
+ new TBinaryProtocol.Factory(), options);
93
+ }
94
+
95
+ /**
96
+ * Server with specified processor, server transport, and in/out protocol
97
+ * factory. Defaults will be used for in/out transport factory and server
98
+ * options.
99
+ */
100
+ public THsHaServer( TProcessor processor,
101
+ TNonblockingServerTransport serverTransport,
102
+ TProtocolFactory protocolFactory) {
103
+ this(processor, serverTransport, protocolFactory, new Options());
104
+ }
105
+
106
+ /**
107
+ * Server with specified processor, server transport, and in/out protocol
108
+ * factory. Defaults will be used for in/out transport factory and server
109
+ * options.
110
+ */
111
+ public THsHaServer( TProcessor processor,
112
+ TNonblockingServerTransport serverTransport,
113
+ TProtocolFactory protocolFactory,
114
+ Options options) {
115
+ this(processor, serverTransport, new TFramedTransport.Factory(),
116
+ protocolFactory);
117
+ }
118
+
119
+ /**
120
+ * Create server with specified processor, server transport, in/out
121
+ * transport factory, in/out protocol factory, and default server options. A
122
+ * processor factory will be created that always returns the specified
123
+ * processor.
124
+ */
125
+ public THsHaServer( TProcessor processor,
126
+ TNonblockingServerTransport serverTransport,
127
+ TFramedTransport.Factory transportFactory,
128
+ TProtocolFactory protocolFactory) {
129
+ this(new TProcessorFactory(processor), serverTransport,
130
+ transportFactory, protocolFactory);
131
+ }
132
+
133
+ /**
134
+ * Create server with specified processor factory, server transport, in/out
135
+ * transport factory, in/out protocol factory, and default server options.
136
+ */
137
+ public THsHaServer( TProcessorFactory processorFactory,
138
+ TNonblockingServerTransport serverTransport,
139
+ TFramedTransport.Factory transportFactory,
140
+ TProtocolFactory protocolFactory) {
141
+ this(processorFactory, serverTransport,
142
+ transportFactory, transportFactory,
143
+ protocolFactory, protocolFactory, new Options());
144
+ }
145
+
146
+ /**
147
+ * Create server with specified processor factory, server transport, in/out
148
+ * transport factory, in/out protocol factory, and server options.
149
+ */
150
+ public THsHaServer( TProcessorFactory processorFactory,
151
+ TNonblockingServerTransport serverTransport,
152
+ TFramedTransport.Factory transportFactory,
153
+ TProtocolFactory protocolFactory,
154
+ Options options) {
155
+ this(processorFactory, serverTransport,
156
+ transportFactory, transportFactory,
157
+ protocolFactory, protocolFactory,
158
+ options);
159
+ }
160
+
161
+ /**
162
+ * Create server with everything specified, except use default server options.
163
+ */
164
+ public THsHaServer( TProcessor processor,
165
+ TNonblockingServerTransport serverTransport,
166
+ TFramedTransport.Factory inputTransportFactory,
167
+ TFramedTransport.Factory outputTransportFactory,
168
+ TProtocolFactory inputProtocolFactory,
169
+ TProtocolFactory outputProtocolFactory) {
170
+ this(new TProcessorFactory(processor), serverTransport,
171
+ inputTransportFactory, outputTransportFactory,
172
+ inputProtocolFactory, outputProtocolFactory);
173
+ }
174
+
175
+ /**
176
+ * Create server with everything specified, except use default server options.
177
+ */
178
+ public THsHaServer( TProcessorFactory processorFactory,
179
+ TNonblockingServerTransport serverTransport,
180
+ TFramedTransport.Factory inputTransportFactory,
181
+ TFramedTransport.Factory outputTransportFactory,
182
+ TProtocolFactory inputProtocolFactory,
183
+ TProtocolFactory outputProtocolFactory)
184
+ {
185
+ this(processorFactory, serverTransport,
186
+ inputTransportFactory, outputTransportFactory,
187
+ inputProtocolFactory, outputProtocolFactory, new Options());
188
+ }
189
+
190
+ /**
191
+ * Create server with every option fully specified.
192
+ */
193
+ public THsHaServer( TProcessorFactory processorFactory,
194
+ TNonblockingServerTransport serverTransport,
195
+ TFramedTransport.Factory inputTransportFactory,
196
+ TFramedTransport.Factory outputTransportFactory,
197
+ TProtocolFactory inputProtocolFactory,
198
+ TProtocolFactory outputProtocolFactory,
199
+ Options options)
200
+ {
201
+ super(processorFactory, serverTransport,
202
+ inputTransportFactory, outputTransportFactory,
203
+ inputProtocolFactory, outputProtocolFactory,
204
+ options);
205
+
206
+ MIN_WORKER_THREADS = options.minWorkerThreads;
207
+ MAX_WORKER_THREADS = options.maxWorkerThreads;
208
+ STOP_TIMEOUT_VAL = options.stopTimeoutVal;
209
+ STOP_TIMEOUT_UNIT = options.stopTimeoutUnit;
210
+ }
211
+
212
+ /** @inheritDoc */
213
+ @Override
214
+ public void serve() {
215
+ if (!startInvokerPool()) {
216
+ return;
217
+ }
218
+
219
+ // start listening, or exit
220
+ if (!startListening()) {
221
+ return;
222
+ }
223
+
224
+ // start the selector, or exit
225
+ if (!startSelectorThread()) {
226
+ return;
227
+ }
228
+
229
+ // this will block while we serve
230
+ joinSelector();
231
+
232
+ gracefullyShutdownInvokerPool();
233
+
234
+ // do a little cleanup
235
+ stopListening();
236
+
237
+ // ungracefully shut down the invoker pool?
238
+ }
239
+
240
+ protected boolean startInvokerPool() {
241
+ // start the invoker pool
242
+ LinkedBlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>();
243
+ invoker = new ThreadPoolExecutor(MIN_WORKER_THREADS, MAX_WORKER_THREADS,
244
+ STOP_TIMEOUT_VAL, STOP_TIMEOUT_UNIT, queue);
245
+
246
+ return true;
247
+ }
248
+
249
+ protected void gracefullyShutdownInvokerPool() {
250
+ // try to gracefully shut down the executor service
251
+ invoker.shutdown();
252
+
253
+ // Loop until awaitTermination finally does return without a interrupted
254
+ // exception. If we don't do this, then we'll shut down prematurely. We want
255
+ // to let the executorService clear it's task queue, closing client sockets
256
+ // appropriately.
257
+ long timeoutMS = 10000;
258
+ long now = System.currentTimeMillis();
259
+ while (timeoutMS >= 0) {
260
+ try {
261
+ invoker.awaitTermination(timeoutMS, TimeUnit.MILLISECONDS);
262
+ break;
263
+ } catch (InterruptedException ix) {
264
+ long newnow = System.currentTimeMillis();
265
+ timeoutMS -= (newnow - now);
266
+ now = newnow;
267
+ }
268
+ }
269
+ }
270
+
271
+ /**
272
+ * We override the standard invoke method here to queue the invocation for
273
+ * invoker service instead of immediately invoking. The thread pool takes care of the rest.
274
+ */
275
+ @Override
276
+ protected void requestInvoke(FrameBuffer frameBuffer) {
277
+ invoker.execute(new Invocation(frameBuffer));
278
+ }
279
+
280
+ /**
281
+ * An Invocation represents a method call that is prepared to execute, given
282
+ * an idle worker thread. It contains the input and output protocols the
283
+ * thread's processor should use to perform the usual Thrift invocation.
284
+ */
285
+ private class Invocation implements Runnable {
286
+
287
+ private final FrameBuffer frameBuffer;
288
+
289
+ public Invocation(final FrameBuffer frameBuffer) {
290
+ this.frameBuffer = frameBuffer;
291
+ }
292
+
293
+ public void run() {
294
+ frameBuffer.invoke();
295
+ }
296
+ }
297
+
298
+ public static class Options extends TNonblockingServer.Options {
299
+ public int minWorkerThreads = 5;
300
+ public int maxWorkerThreads = Integer.MAX_VALUE;
301
+ public int stopTimeoutVal = 60;
302
+ public TimeUnit stopTimeoutUnit = TimeUnit.SECONDS;
303
+ }
304
+ }
@@ -0,0 +1,772 @@
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
+
21
+ package org.apache.thrift.server;
22
+
23
+ import java.io.ByteArrayInputStream;
24
+ import java.io.IOException;
25
+ import java.nio.ByteBuffer;
26
+ import java.nio.channels.SelectionKey;
27
+ import java.nio.channels.Selector;
28
+ import java.nio.channels.spi.SelectorProvider;
29
+ import java.util.HashSet;
30
+ import java.util.Iterator;
31
+ import java.util.Set;
32
+
33
+ import org.slf4j.Logger;
34
+ import org.slf4j.LoggerFactory;
35
+
36
+ import org.apache.thrift.TByteArrayOutputStream;
37
+ import org.apache.thrift.TException;
38
+ import org.apache.thrift.TProcessor;
39
+ import org.apache.thrift.TProcessorFactory;
40
+ import org.apache.thrift.protocol.TBinaryProtocol;
41
+ import org.apache.thrift.protocol.TProtocol;
42
+ import org.apache.thrift.protocol.TProtocolFactory;
43
+ import org.apache.thrift.transport.TFramedTransport;
44
+ import org.apache.thrift.transport.TIOStreamTransport;
45
+ import org.apache.thrift.transport.TNonblockingServerTransport;
46
+ import org.apache.thrift.transport.TNonblockingTransport;
47
+ import org.apache.thrift.transport.TTransport;
48
+ import org.apache.thrift.transport.TTransportException;
49
+
50
+ /**
51
+ * A nonblocking TServer implementation. This allows for fairness amongst all
52
+ * connected clients in terms of invocations.
53
+ *
54
+ * This server is inherently single-threaded. If you want a limited thread pool
55
+ * coupled with invocation-fairness, see THsHaServer.
56
+ *
57
+ * To use this server, you MUST use a TFramedTransport at the outermost
58
+ * transport, otherwise this server will be unable to determine when a whole
59
+ * method call has been read off the wire. Clients must also use TFramedTransport.
60
+ */
61
+ public class TNonblockingServer extends TServer {
62
+ private static final Logger LOGGER =
63
+ LoggerFactory.getLogger(TNonblockingServer.class.getName());
64
+
65
+ // Flag for stopping the server
66
+ private volatile boolean stopped_;
67
+
68
+ private SelectThread selectThread_;
69
+
70
+ /**
71
+ * The maximum amount of memory we will allocate to client IO buffers at a
72
+ * time. Without this limit, the server will gladly allocate client buffers
73
+ * right into an out of memory exception, rather than waiting.
74
+ */
75
+ private final long MAX_READ_BUFFER_BYTES;
76
+
77
+ protected final Options options_;
78
+
79
+ /**
80
+ * How many bytes are currently allocated to read buffers.
81
+ */
82
+ private long readBufferBytesAllocated = 0;
83
+
84
+ /**
85
+ * Create server with given processor and server transport, using
86
+ * TBinaryProtocol for the protocol, TFramedTransport.Factory on both input
87
+ * and output transports. A TProcessorFactory will be created that always
88
+ * returns the specified processor.
89
+ */
90
+ public TNonblockingServer(TProcessor processor,
91
+ TNonblockingServerTransport serverTransport) {
92
+ this(new TProcessorFactory(processor), serverTransport);
93
+ }
94
+
95
+ /**
96
+ * Create server with specified processor factory and server transport.
97
+ * TBinaryProtocol is assumed. TFramedTransport.Factory is used on both input
98
+ * and output transports.
99
+ */
100
+ public TNonblockingServer(TProcessorFactory processorFactory,
101
+ TNonblockingServerTransport serverTransport) {
102
+ this(processorFactory, serverTransport,
103
+ new TFramedTransport.Factory(), new TFramedTransport.Factory(),
104
+ new TBinaryProtocol.Factory(), new TBinaryProtocol.Factory());
105
+ }
106
+
107
+ public TNonblockingServer(TProcessor processor,
108
+ TNonblockingServerTransport serverTransport,
109
+ TProtocolFactory protocolFactory) {
110
+ this(processor, serverTransport,
111
+ new TFramedTransport.Factory(), new TFramedTransport.Factory(),
112
+ protocolFactory, protocolFactory);
113
+ }
114
+
115
+ public TNonblockingServer(TProcessor processor,
116
+ TNonblockingServerTransport serverTransport,
117
+ TFramedTransport.Factory transportFactory,
118
+ TProtocolFactory protocolFactory) {
119
+ this(processor, serverTransport,
120
+ transportFactory, transportFactory,
121
+ protocolFactory, protocolFactory);
122
+ }
123
+
124
+ public TNonblockingServer(TProcessorFactory processorFactory,
125
+ TNonblockingServerTransport serverTransport,
126
+ TFramedTransport.Factory transportFactory,
127
+ TProtocolFactory protocolFactory) {
128
+ this(processorFactory, serverTransport,
129
+ transportFactory, transportFactory,
130
+ protocolFactory, protocolFactory);
131
+ }
132
+
133
+ public TNonblockingServer(TProcessor processor,
134
+ TNonblockingServerTransport serverTransport,
135
+ TFramedTransport.Factory inputTransportFactory,
136
+ TFramedTransport.Factory outputTransportFactory,
137
+ TProtocolFactory inputProtocolFactory,
138
+ TProtocolFactory outputProtocolFactory) {
139
+ this(new TProcessorFactory(processor), serverTransport,
140
+ inputTransportFactory, outputTransportFactory,
141
+ inputProtocolFactory, outputProtocolFactory);
142
+ }
143
+
144
+ public TNonblockingServer(TProcessorFactory processorFactory,
145
+ TNonblockingServerTransport serverTransport,
146
+ TFramedTransport.Factory inputTransportFactory,
147
+ TFramedTransport.Factory outputTransportFactory,
148
+ TProtocolFactory inputProtocolFactory,
149
+ TProtocolFactory outputProtocolFactory) {
150
+ this(processorFactory, serverTransport,
151
+ inputTransportFactory, outputTransportFactory,
152
+ inputProtocolFactory, outputProtocolFactory,
153
+ new Options());
154
+ }
155
+
156
+ public TNonblockingServer(TProcessorFactory processorFactory,
157
+ TNonblockingServerTransport serverTransport,
158
+ TFramedTransport.Factory inputTransportFactory,
159
+ TFramedTransport.Factory outputTransportFactory,
160
+ TProtocolFactory inputProtocolFactory,
161
+ TProtocolFactory outputProtocolFactory,
162
+ Options options) {
163
+ super(processorFactory, serverTransport,
164
+ inputTransportFactory, outputTransportFactory,
165
+ inputProtocolFactory, outputProtocolFactory);
166
+ options_ = options;
167
+ options_.validate();
168
+ MAX_READ_BUFFER_BYTES = options.maxReadBufferBytes;
169
+ }
170
+
171
+ /**
172
+ * Begin accepting connections and processing invocations.
173
+ */
174
+ public void serve() {
175
+ // start listening, or exit
176
+ if (!startListening()) {
177
+ return;
178
+ }
179
+
180
+ // start the selector, or exit
181
+ if (!startSelectorThread()) {
182
+ return;
183
+ }
184
+
185
+ // this will block while we serve
186
+ joinSelector();
187
+
188
+ // do a little cleanup
189
+ stopListening();
190
+ }
191
+
192
+ /**
193
+ * Have the server transport start accepting connections.
194
+ *
195
+ * @return true if we started listening successfully, false if something went
196
+ * wrong.
197
+ */
198
+ protected boolean startListening() {
199
+ try {
200
+ serverTransport_.listen();
201
+ return true;
202
+ } catch (TTransportException ttx) {
203
+ LOGGER.error("Failed to start listening on server socket!", ttx);
204
+ return false;
205
+ }
206
+ }
207
+
208
+ /**
209
+ * Stop listening for conections.
210
+ */
211
+ protected void stopListening() {
212
+ serverTransport_.close();
213
+ }
214
+
215
+ /**
216
+ * Start the selector thread running to deal with clients.
217
+ *
218
+ * @return true if everything went ok, false if we couldn't start for some
219
+ * reason.
220
+ */
221
+ protected boolean startSelectorThread() {
222
+ // start the selector
223
+ try {
224
+ selectThread_ = new SelectThread((TNonblockingServerTransport)serverTransport_);
225
+ selectThread_.start();
226
+ return true;
227
+ } catch (IOException e) {
228
+ LOGGER.error("Failed to start selector thread!", e);
229
+ return false;
230
+ }
231
+ }
232
+
233
+ /**
234
+ * Block until the selector exits.
235
+ */
236
+ protected void joinSelector() {
237
+ // wait until the selector thread exits
238
+ try {
239
+ selectThread_.join();
240
+ } catch (InterruptedException e) {
241
+ // for now, just silently ignore. technically this means we'll have less of
242
+ // a graceful shutdown as a result.
243
+ }
244
+ }
245
+
246
+ /**
247
+ * Stop serving and shut everything down.
248
+ */
249
+ public void stop() {
250
+ stopped_ = true;
251
+ if (selectThread_ != null) {
252
+ selectThread_.wakeupSelector();
253
+ }
254
+ }
255
+
256
+ /**
257
+ * Perform an invocation. This method could behave several different ways
258
+ * - invoke immediately inline, queue for separate execution, etc.
259
+ */
260
+ protected void requestInvoke(FrameBuffer frameBuffer) {
261
+ frameBuffer.invoke();
262
+ }
263
+
264
+ /**
265
+ * A FrameBuffer wants to change its selection preferences, but might not be
266
+ * in the select thread.
267
+ */
268
+ protected void requestSelectInterestChange(FrameBuffer frameBuffer) {
269
+ selectThread_.requestSelectInterestChange(frameBuffer);
270
+ }
271
+
272
+ /**
273
+ * The thread that will be doing all the selecting, managing new connections
274
+ * and those that still need to be read.
275
+ */
276
+ protected class SelectThread extends Thread {
277
+
278
+ private final TNonblockingServerTransport serverTransport;
279
+ private final Selector selector;
280
+
281
+ // List of FrameBuffers that want to change their selection interests.
282
+ private final Set<FrameBuffer> selectInterestChanges =
283
+ new HashSet<FrameBuffer>();
284
+
285
+ /**
286
+ * Set up the SelectorThread.
287
+ */
288
+ public SelectThread(final TNonblockingServerTransport serverTransport)
289
+ throws IOException {
290
+ this.serverTransport = serverTransport;
291
+ this.selector = SelectorProvider.provider().openSelector();
292
+ serverTransport.registerSelector(selector);
293
+ }
294
+
295
+ /**
296
+ * The work loop. Handles both selecting (all IO operations) and managing
297
+ * the selection preferences of all existing connections.
298
+ */
299
+ public void run() {
300
+ while (!stopped_) {
301
+ select();
302
+ processInterestChanges();
303
+ }
304
+ }
305
+
306
+ /**
307
+ * If the selector is blocked, wake it up.
308
+ */
309
+ public void wakeupSelector() {
310
+ selector.wakeup();
311
+ }
312
+
313
+ /**
314
+ * Add FrameBuffer to the list of select interest changes and wake up the
315
+ * selector if it's blocked. When the select() call exits, it'll give the
316
+ * FrameBuffer a chance to change its interests.
317
+ */
318
+ public void requestSelectInterestChange(FrameBuffer frameBuffer) {
319
+ synchronized (selectInterestChanges) {
320
+ selectInterestChanges.add(frameBuffer);
321
+ }
322
+ // wakeup the selector, if it's currently blocked.
323
+ selector.wakeup();
324
+ }
325
+
326
+ /**
327
+ * Select and process IO events appropriately:
328
+ * If there are connections to be accepted, accept them.
329
+ * If there are existing connections with data waiting to be read, read it,
330
+ * bufferring until a whole frame has been read.
331
+ * If there are any pending responses, buffer them until their target client
332
+ * is available, and then send the data.
333
+ */
334
+ private void select() {
335
+ try {
336
+ // wait for io events.
337
+ selector.select();
338
+
339
+ // process the io events we received
340
+ Iterator<SelectionKey> selectedKeys = selector.selectedKeys().iterator();
341
+ while (!stopped_ && selectedKeys.hasNext()) {
342
+ SelectionKey key = selectedKeys.next();
343
+ selectedKeys.remove();
344
+
345
+ // skip if not valid
346
+ if (!key.isValid()) {
347
+ cleanupSelectionkey(key);
348
+ continue;
349
+ }
350
+
351
+ // if the key is marked Accept, then it has to be the server
352
+ // transport.
353
+ if (key.isAcceptable()) {
354
+ handleAccept();
355
+ } else if (key.isReadable()) {
356
+ // deal with reads
357
+ handleRead(key);
358
+ } else if (key.isWritable()) {
359
+ // deal with writes
360
+ handleWrite(key);
361
+ } else {
362
+ LOGGER.warn("Unexpected state in select! " + key.interestOps());
363
+ }
364
+ }
365
+ } catch (IOException e) {
366
+ LOGGER.warn("Got an IOException while selecting!", e);
367
+ }
368
+ }
369
+
370
+ /**
371
+ * Check to see if there are any FrameBuffers that have switched their
372
+ * interest type from read to write or vice versa.
373
+ */
374
+ private void processInterestChanges() {
375
+ synchronized (selectInterestChanges) {
376
+ for (FrameBuffer fb : selectInterestChanges) {
377
+ fb.changeSelectInterests();
378
+ }
379
+ selectInterestChanges.clear();
380
+ }
381
+ }
382
+
383
+ /**
384
+ * Accept a new connection.
385
+ */
386
+ private void handleAccept() throws IOException {
387
+ SelectionKey clientKey = null;
388
+ TNonblockingTransport client = null;
389
+ try {
390
+ // accept the connection
391
+ client = (TNonblockingTransport)serverTransport.accept();
392
+ clientKey = client.registerSelector(selector, SelectionKey.OP_READ);
393
+
394
+ // add this key to the map
395
+ FrameBuffer frameBuffer = new FrameBuffer(client, clientKey);
396
+ clientKey.attach(frameBuffer);
397
+ } catch (TTransportException tte) {
398
+ // something went wrong accepting.
399
+ LOGGER.warn("Exception trying to accept!", tte);
400
+ tte.printStackTrace();
401
+ if (clientKey != null) cleanupSelectionkey(clientKey);
402
+ if (client != null) client.close();
403
+ }
404
+ }
405
+
406
+ /**
407
+ * Do the work required to read from a readable client. If the frame is
408
+ * fully read, then invoke the method call.
409
+ */
410
+ private void handleRead(SelectionKey key) {
411
+ FrameBuffer buffer = (FrameBuffer)key.attachment();
412
+ if (buffer.read()) {
413
+ // if the buffer's frame read is complete, invoke the method.
414
+ if (buffer.isFrameFullyRead()) {
415
+ requestInvoke(buffer);
416
+ }
417
+ } else {
418
+ cleanupSelectionkey(key);
419
+ }
420
+ }
421
+
422
+ /**
423
+ * Let a writable client get written, if there's data to be written.
424
+ */
425
+ private void handleWrite(SelectionKey key) {
426
+ FrameBuffer buffer = (FrameBuffer)key.attachment();
427
+ if (!buffer.write()) {
428
+ cleanupSelectionkey(key);
429
+ }
430
+ }
431
+
432
+ /**
433
+ * Do connection-close cleanup on a given SelectionKey.
434
+ */
435
+ private void cleanupSelectionkey(SelectionKey key) {
436
+ // remove the records from the two maps
437
+ FrameBuffer buffer = (FrameBuffer)key.attachment();
438
+ if (buffer != null) {
439
+ // close the buffer
440
+ buffer.close();
441
+ }
442
+ // cancel the selection key
443
+ key.cancel();
444
+ }
445
+ } // SelectorThread
446
+
447
+ /**
448
+ * Class that implements a sort of state machine around the interaction with
449
+ * a client and an invoker. It manages reading the frame size and frame data,
450
+ * getting it handed off as wrapped transports, and then the writing of
451
+ * reponse data back to the client. In the process it manages flipping the
452
+ * read and write bits on the selection key for its client.
453
+ */
454
+ protected class FrameBuffer {
455
+ //
456
+ // Possible states for the FrameBuffer state machine.
457
+ //
458
+ // in the midst of reading the frame size off the wire
459
+ private static final int READING_FRAME_SIZE = 1;
460
+ // reading the actual frame data now, but not all the way done yet
461
+ private static final int READING_FRAME = 2;
462
+ // completely read the frame, so an invocation can now happen
463
+ private static final int READ_FRAME_COMPLETE = 3;
464
+ // waiting to get switched to listening for write events
465
+ private static final int AWAITING_REGISTER_WRITE = 4;
466
+ // started writing response data, not fully complete yet
467
+ private static final int WRITING = 6;
468
+ // another thread wants this framebuffer to go back to reading
469
+ private static final int AWAITING_REGISTER_READ = 7;
470
+ // we want our transport and selection key invalidated in the selector thread
471
+ private static final int AWAITING_CLOSE = 8;
472
+
473
+ //
474
+ // Instance variables
475
+ //
476
+
477
+ // the actual transport hooked up to the client.
478
+ private final TNonblockingTransport trans_;
479
+
480
+ // the SelectionKey that corresponds to our transport
481
+ private final SelectionKey selectionKey_;
482
+
483
+ // where in the process of reading/writing are we?
484
+ private int state_ = READING_FRAME_SIZE;
485
+
486
+ // the ByteBuffer we'll be using to write and read, depending on the state
487
+ private ByteBuffer buffer_;
488
+
489
+ private TByteArrayOutputStream response_;
490
+
491
+ public FrameBuffer( final TNonblockingTransport trans,
492
+ final SelectionKey selectionKey) {
493
+ trans_ = trans;
494
+ selectionKey_ = selectionKey;
495
+ buffer_ = ByteBuffer.allocate(4);
496
+ }
497
+
498
+ /**
499
+ * Give this FrameBuffer a chance to read. The selector loop should have
500
+ * received a read event for this FrameBuffer.
501
+ *
502
+ * @return true if the connection should live on, false if it should be
503
+ * closed
504
+ */
505
+ public boolean read() {
506
+ if (state_ == READING_FRAME_SIZE) {
507
+ // try to read the frame size completely
508
+ if (!internalRead()) {
509
+ return false;
510
+ }
511
+
512
+ // if the frame size has been read completely, then prepare to read the
513
+ // actual frame.
514
+ if (buffer_.remaining() == 0) {
515
+ // pull out the frame size as an integer.
516
+ int frameSize = buffer_.getInt(0);
517
+ if (frameSize <= 0) {
518
+ LOGGER.error("Read an invalid frame size of " + frameSize
519
+ + ". Are you using TFramedTransport on the client side?");
520
+ return false;
521
+ }
522
+
523
+ // if this frame will always be too large for this server, log the
524
+ // error and close the connection.
525
+ if (frameSize + 4 > MAX_READ_BUFFER_BYTES) {
526
+ LOGGER.error("Read a frame size of " + frameSize
527
+ + ", which is bigger than the maximum allowable buffer size for ALL connections.");
528
+ return false;
529
+ }
530
+
531
+ // if this frame will push us over the memory limit, then return.
532
+ // with luck, more memory will free up the next time around.
533
+ if (readBufferBytesAllocated + frameSize + 4 > MAX_READ_BUFFER_BYTES) {
534
+ return true;
535
+ }
536
+
537
+ // incremement the amount of memory allocated to read buffers
538
+ readBufferBytesAllocated += frameSize + 4;
539
+
540
+ // reallocate the readbuffer as a frame-sized buffer
541
+ buffer_ = ByteBuffer.allocate(frameSize + 4);
542
+ // put the frame size at the head of the buffer
543
+ buffer_.putInt(frameSize);
544
+
545
+ state_ = READING_FRAME;
546
+ } else {
547
+ // this skips the check of READING_FRAME state below, since we can't
548
+ // possibly go on to that state if there's data left to be read at
549
+ // this one.
550
+ return true;
551
+ }
552
+ }
553
+
554
+ // it is possible to fall through from the READING_FRAME_SIZE section
555
+ // to READING_FRAME if there's already some frame data available once
556
+ // READING_FRAME_SIZE is complete.
557
+
558
+ if (state_ == READING_FRAME) {
559
+ if (!internalRead()) {
560
+ return false;
561
+ }
562
+
563
+ // since we're already in the select loop here for sure, we can just
564
+ // modify our selection key directly.
565
+ if (buffer_.remaining() == 0) {
566
+ // get rid of the read select interests
567
+ selectionKey_.interestOps(0);
568
+ state_ = READ_FRAME_COMPLETE;
569
+ }
570
+
571
+ return true;
572
+ }
573
+
574
+ // if we fall through to this point, then the state must be invalid.
575
+ LOGGER.error("Read was called but state is invalid (" + state_ + ")");
576
+ return false;
577
+ }
578
+
579
+ /**
580
+ * Give this FrameBuffer a chance to write its output to the final client.
581
+ */
582
+ public boolean write() {
583
+ if (state_ == WRITING) {
584
+ try {
585
+ if (trans_.write(buffer_) < 0) {
586
+ return false;
587
+ }
588
+ } catch (IOException e) {
589
+ LOGGER.warn("Got an IOException during write!", e);
590
+ return false;
591
+ }
592
+
593
+ // we're done writing. now we need to switch back to reading.
594
+ if (buffer_.remaining() == 0) {
595
+ prepareRead();
596
+ }
597
+ return true;
598
+ }
599
+
600
+ LOGGER.error("Write was called, but state is invalid (" + state_ + ")");
601
+ return false;
602
+ }
603
+
604
+ /**
605
+ * Give this FrameBuffer a chance to set its interest to write, once data
606
+ * has come in.
607
+ */
608
+ public void changeSelectInterests() {
609
+ if (state_ == AWAITING_REGISTER_WRITE) {
610
+ // set the OP_WRITE interest
611
+ selectionKey_.interestOps(SelectionKey.OP_WRITE);
612
+ state_ = WRITING;
613
+ } else if (state_ == AWAITING_REGISTER_READ) {
614
+ prepareRead();
615
+ } else if (state_ == AWAITING_CLOSE){
616
+ close();
617
+ selectionKey_.cancel();
618
+ } else {
619
+ LOGGER.error(
620
+ "changeSelectInterest was called, but state is invalid ("
621
+ + state_ + ")");
622
+ }
623
+ }
624
+
625
+ /**
626
+ * Shut the connection down.
627
+ */
628
+ public void close() {
629
+ // if we're being closed due to an error, we might have allocated a
630
+ // buffer that we need to subtract for our memory accounting.
631
+ if (state_ == READING_FRAME || state_ == READ_FRAME_COMPLETE) {
632
+ readBufferBytesAllocated -= buffer_.array().length;
633
+ }
634
+ trans_.close();
635
+ }
636
+
637
+ /**
638
+ * Check if this FrameBuffer has a full frame read.
639
+ */
640
+ public boolean isFrameFullyRead() {
641
+ return state_ == READ_FRAME_COMPLETE;
642
+ }
643
+
644
+ /**
645
+ * After the processor has processed the invocation, whatever thread is
646
+ * managing invocations should call this method on this FrameBuffer so we
647
+ * know it's time to start trying to write again. Also, if it turns out
648
+ * that there actually isn't any data in the response buffer, we'll skip
649
+ * trying to write and instead go back to reading.
650
+ */
651
+ public void responseReady() {
652
+ // the read buffer is definitely no longer in use, so we will decrement
653
+ // our read buffer count. we do this here as well as in close because
654
+ // we'd like to free this read memory up as quickly as possible for other
655
+ // clients.
656
+ readBufferBytesAllocated -= buffer_.array().length;
657
+
658
+ if (response_.len() == 0) {
659
+ // go straight to reading again. this was probably an oneway method
660
+ state_ = AWAITING_REGISTER_READ;
661
+ buffer_ = null;
662
+ } else {
663
+ buffer_ = ByteBuffer.wrap(response_.get(), 0, response_.len());
664
+
665
+ // set state that we're waiting to be switched to write. we do this
666
+ // asynchronously through requestSelectInterestChange() because there is a
667
+ // possibility that we're not in the main thread, and thus currently
668
+ // blocked in select(). (this functionality is in place for the sake of
669
+ // the HsHa server.)
670
+ state_ = AWAITING_REGISTER_WRITE;
671
+ }
672
+ requestSelectInterestChange();
673
+ }
674
+
675
+ /**
676
+ * Actually invoke the method signified by this FrameBuffer.
677
+ */
678
+ public void invoke() {
679
+ TTransport inTrans = getInputTransport();
680
+ TProtocol inProt = inputProtocolFactory_.getProtocol(inTrans);
681
+ TProtocol outProt = outputProtocolFactory_.getProtocol(getOutputTransport());
682
+
683
+ try {
684
+ processorFactory_.getProcessor(inTrans).process(inProt, outProt);
685
+ responseReady();
686
+ return;
687
+ } catch (TException te) {
688
+ LOGGER.warn("Exception while invoking!", te);
689
+ } catch (Exception e) {
690
+ LOGGER.error("Unexpected exception while invoking!", e);
691
+ }
692
+ // This will only be reached when there is an exception.
693
+ state_ = AWAITING_CLOSE;
694
+ requestSelectInterestChange();
695
+ }
696
+
697
+ /**
698
+ * Wrap the read buffer in a memory-based transport so a processor can read
699
+ * the data it needs to handle an invocation.
700
+ */
701
+ private TTransport getInputTransport() {
702
+ return inputTransportFactory_.getTransport(new TIOStreamTransport(
703
+ new ByteArrayInputStream(buffer_.array())));
704
+ }
705
+
706
+ /**
707
+ * Get the transport that should be used by the invoker for responding.
708
+ */
709
+ private TTransport getOutputTransport() {
710
+ response_ = new TByteArrayOutputStream();
711
+ return outputTransportFactory_.getTransport(new TIOStreamTransport(response_));
712
+ }
713
+
714
+ /**
715
+ * Perform a read into buffer.
716
+ *
717
+ * @return true if the read succeeded, false if there was an error or the
718
+ * connection closed.
719
+ */
720
+ private boolean internalRead() {
721
+ try {
722
+ if (trans_.read(buffer_) < 0) {
723
+ return false;
724
+ }
725
+ return true;
726
+ } catch (IOException e) {
727
+ LOGGER.warn("Got an IOException in internalRead!", e);
728
+ return false;
729
+ }
730
+ }
731
+
732
+ /**
733
+ * We're done writing, so reset our interest ops and change state accordingly.
734
+ */
735
+ private void prepareRead() {
736
+ // we can set our interest directly without using the queue because
737
+ // we're in the select thread.
738
+ selectionKey_.interestOps(SelectionKey.OP_READ);
739
+ // get ready for another go-around
740
+ buffer_ = ByteBuffer.allocate(4);
741
+ state_ = READING_FRAME_SIZE;
742
+ }
743
+
744
+ /**
745
+ * When this FrameBuffer needs to change it's select interests and execution
746
+ * might not be in the select thread, then this method will make sure the
747
+ * interest change gets done when the select thread wakes back up. When the
748
+ * current thread is the select thread, then it just does the interest change
749
+ * immediately.
750
+ */
751
+ private void requestSelectInterestChange() {
752
+ if (Thread.currentThread() == selectThread_) {
753
+ changeSelectInterests();
754
+ } else {
755
+ TNonblockingServer.this.requestSelectInterestChange(this);
756
+ }
757
+ }
758
+ } // FrameBuffer
759
+
760
+
761
+ public static class Options {
762
+ public long maxReadBufferBytes = Long.MAX_VALUE;
763
+
764
+ public Options() {}
765
+
766
+ public void validate() {
767
+ if (maxReadBufferBytes <= 1024) {
768
+ throw new IllegalArgumentException("You must allocate at least 1KB to the read buffer.");
769
+ }
770
+ }
771
+ }
772
+ }