Class: Hive::RPC::ThreadSafeHttpClient
- Inherits:
-
HttpClient
- Object
- BaseClient
- HttpClient
- Hive::RPC::ThreadSafeHttpClient
- Defined in:
- lib/hive/rpc/thread_safe_http_client.rb
Overview
ThreadSafeHttpClient is the default RPC Client used by ‘hive-ruby.` It’s perfect for simple requests. But for higher performance, it’s better to override HttpClient and implement something other than Net::HTTP.
It performs http requests in a Mutex critical section because Net::HTTP is not thread safe. This is the very minimum level thread safety available.
Constant Summary collapse
- SEMAPHORE =
Mutex.new.freeze
Constants inherited from HttpClient
HttpClient::JSON_RPC_BATCH_SIZE_MAXIMUM, HttpClient::POST_HEADERS, HttpClient::TIMEOUT_ERRORS
Constants inherited from BaseClient
BaseClient::MAX_TIMEOUT_BACKOFF, BaseClient::MAX_TIMEOUT_RETRY_COUNT, BaseClient::TIMEOUT_ERRORS
Constants included from ChainConfig
ChainConfig::EXPIRE_IN_SECS, ChainConfig::EXPIRE_IN_SECS_PROPOSAL, ChainConfig::NETWORKS_HIVE_ADDRESS_PREFIX, ChainConfig::NETWORKS_HIVE_CHAIN_ID, ChainConfig::NETWORKS_HIVE_CORE_ASSET, ChainConfig::NETWORKS_HIVE_DEBT_ASSET, ChainConfig::NETWORKS_HIVE_DEFAULT_NODE, ChainConfig::NETWORKS_HIVE_LEGACY_CHAIN_ID, ChainConfig::NETWORKS_HIVE_VEST_ASSET, ChainConfig::NETWORKS_TEST_ADDRESS_PREFIX, ChainConfig::NETWORKS_TEST_CHAIN_ID, ChainConfig::NETWORKS_TEST_CORE_ASSET, ChainConfig::NETWORKS_TEST_DEBT_ASSET, ChainConfig::NETWORKS_TEST_DEFAULT_NODE, ChainConfig::NETWORKS_TEST_VEST_ASSET, ChainConfig::NETWORK_CHAIN_IDS
Instance Attribute Summary
Attributes inherited from BaseClient
Instance Method Summary collapse
-
#http_post(api_name) ⇒ Object
Same as #HttpClient#http_post, but scoped to each thread, uri, and api_name so it is thread safe.
- #http_request(request) ⇒ Object
-
#rpc_id ⇒ Object
Same as #BaseClient#rpc_id, auto-increment, but scoped to each thread so it is thread safe.
Methods inherited from HttpClient
#http, #rpc_batch_execute, #rpc_execute
Methods inherited from BaseClient
#evaluate_id, #initialize, #put, #rpc_batch_execute, #rpc_execute, #uri, #yield_response
Constructor Details
This class inherits a constructor from Hive::RPC::BaseClient
Instance Method Details
#http_post(api_name) ⇒ Object
Same as #HttpClient#http_post, but scoped to each thread, uri, and api_name so it is thread safe.
15 16 17 18 19 20 21 22 23 24 25 26 27 |
# File 'lib/hive/rpc/thread_safe_http_client.rb', line 15 def http_post(api_name) raise "Namespace required." if api_name.nil? thread = Thread.current http_posts = thread.thread_variable_get(:http_posts) || {} SEMAPHORE.synchronize do http_posts[[uri, api_name]] ||= Net::HTTP::Post.new(uri.request_uri, POST_HEADERS) thread.thread_variable_set(:http_posts, http_posts) end http_posts[[uri, api_name]] end |
#http_request(request) ⇒ Object
29 |
# File 'lib/hive/rpc/thread_safe_http_client.rb', line 29 def http_request(request); SEMAPHORE.synchronize{super}; end |
#rpc_id ⇒ Object
Same as #BaseClient#rpc_id, auto-increment, but scoped to each thread so it is thread safe.
33 34 35 36 37 38 39 |
# File 'lib/hive/rpc/thread_safe_http_client.rb', line 33 def rpc_id thread = Thread.current rpc_id = thread.thread_variable_get(:rpc_id) rpc_id ||= 0 rpc_id += 1 thread.thread_variable_set(:rpc_id, rpc_id) end |