diff options
author | Jacob Vosmaer <jacob@gitlab.com> | 2017-12-18 17:53:15 +0100 |
---|---|---|
committer | Jacob Vosmaer <jacob@gitlab.com> | 2017-12-18 17:53:15 +0100 |
commit | 78800193efaa0e603a73cbb80fdef42e7ffe2e4e (patch) | |
tree | 5b79b7fbcad74a67ad4770062104ccf9b770b1cf | |
parent | ceac0ae651a1da34f8e175aa80888bc877d6e199 (diff) | |
download | gitlab-ce-gitaly-recycle-connections.tar.gz |
Recycle Gitaly connections after 1 hourgitaly-recycle-connections
-rw-r--r-- | lib/gitlab/gitaly_client.rb | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/lib/gitlab/gitaly_client.rb b/lib/gitlab/gitaly_client.rb index b753ac46291..9d52f14e0e0 100644 --- a/lib/gitlab/gitaly_client.rb +++ b/lib/gitlab/gitaly_client.rb @@ -26,9 +26,12 @@ module Gitlab end end + CachedConnection = Struct.new(:stub, :expire_at) + SERVER_VERSION_FILE = 'GITALY_SERVER_VERSION'.freeze MAXIMUM_GITALY_CALLS = 35 CLIENT_NAME = (Sidekiq.server? ? 'gitlab-sidekiq' : 'gitlab-web').freeze + MAXIMUM_CONNECTION_AGE = 1.hour MUTEX = Mutex.new METRICS_MUTEX = Mutex.new @@ -66,20 +69,26 @@ module Gitlab def self.stub(name, storage) MUTEX.synchronize do - @stubs ||= {} - @stubs[storage] ||= {} - @stubs[storage][name] ||= begin + @connections ||= {} + @connections[storage] ||= {} + connection = @connections[storage][name] + + unless connection && connection.expire_at > Time.now klass = Gitaly.const_get(name.to_s.camelcase.to_sym).const_get(:Stub) addr = address(storage) addr = addr.sub(%r{^tcp://}, '') if URI(addr).scheme == 'tcp' - klass.new(addr, :this_channel_is_insecure) + stub = klass.new(addr, :this_channel_is_insecure) + expire_at = Time.now + (0.9 + Random.rand(0.2)) * MAXIMUM_CONNECTION_AGE + connection = @connections[storage][name] = CachedConnection.new(stub, expire_at) end + + connection.stub end end def self.clear_stubs! MUTEX.synchronize do - @stubs = nil + @connections = nil end end |