gitaly_client.rb 1.68 KB
Newer Older
1 2 3 4
require 'gitaly'

module Gitlab
  module GitalyClient
5 6
    SERVER_VERSION_FILE = 'GITALY_SERVER_VERSION'.freeze

Jacob Vosmaer's avatar
Jacob Vosmaer committed
7 8
    MUTEX = Mutex.new
    private_constant :MUTEX
9

Jacob Vosmaer's avatar
Jacob Vosmaer committed
10 11 12 13 14 15 16 17 18
    def self.stub(name, storage)
      MUTEX.synchronize do
        @stubs ||= {}
        @stubs[storage] ||= {}
        @stubs[storage][name] ||= begin
          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)
19 20
        end
      end
21 22
    end

Jacob Vosmaer's avatar
Jacob Vosmaer committed
23 24 25 26
    def self.clear_stubs!
      MUTEX.synchronize do
        @stubs = nil
      end
27 28
    end

Jacob Vosmaer's avatar
Jacob Vosmaer committed
29 30 31
    def self.address(storage)
      params = Gitlab.config.repositories.storages[storage]
      raise "storage not found: #{storage.inspect}" if params.nil?
32

Jacob Vosmaer's avatar
Jacob Vosmaer committed
33 34 35 36
      address = params['gitaly_address']
      unless address.present?
        raise "storage #{storage.inspect} is missing a gitaly_address"
      end
37

Jacob Vosmaer's avatar
Jacob Vosmaer committed
38 39
      unless URI(address).scheme.in?(%w(tcp unix))
        raise "Unsupported Gitaly address: #{address.inspect} does not use URL scheme 'tcp' or 'unix'"
40 41
      end

Jacob Vosmaer's avatar
Jacob Vosmaer committed
42
      address
43 44 45
    end

    def self.enabled?
46
      Gitlab.config.gitaly.enabled
47
    end
48 49 50 51 52 53 54 55 56 57 58 59 60 61

    def self.feature_enabled?(feature)
      enabled? && ENV["GITALY_#{feature.upcase}"] == '1'
    end

    def self.migrate(feature)
      is_enabled  = feature_enabled?(feature)
      metric_name = feature.to_s
      metric_name += "_gitaly" if is_enabled

      Gitlab::Metrics.measure(metric_name) do
        yield is_enabled
      end
    end
62 63 64 65 66

    def self.expected_server_version
      path = Rails.root.join(SERVER_VERSION_FILE)
      path.read.chomp
    end
67 68
  end
end