summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacob Vosmaer <jacob@gitlab.com>2017-12-18 17:53:15 +0100
committerJacob Vosmaer <jacob@gitlab.com>2017-12-18 17:53:15 +0100
commit78800193efaa0e603a73cbb80fdef42e7ffe2e4e (patch)
tree5b79b7fbcad74a67ad4770062104ccf9b770b1cf
parentceac0ae651a1da34f8e175aa80888bc877d6e199 (diff)
downloadgitlab-ce-gitaly-recycle-connections.tar.gz
Recycle Gitaly connections after 1 hourgitaly-recycle-connections
-rw-r--r--lib/gitlab/gitaly_client.rb19
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