Welcome to mirror list, hosted at ThFree Co, Russian Federation.

runtime.rb « gitlab « lib - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 269fb74cecafeabafa8f26760042bb258d875712 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# frozen_string_literal: true

module Gitlab
  # Provides routines to identify the current runtime as which the application
  # executes, such as whether it is an application server and which one.
  module Runtime
    IdentificationError = Class.new(RuntimeError)
    AmbiguousProcessError = Class.new(IdentificationError)
    UnknownProcessError = Class.new(IdentificationError)

    AVAILABLE_RUNTIMES = [
      :console,
      :geo_log_cursor,
      :puma,
      :rails_runner,
      :rake,
      :sidekiq,
      :test_suite
    ].freeze

    class << self
      def identify
        matches = AVAILABLE_RUNTIMES.select { |runtime| public_send("#{runtime}?") } # rubocop:disable GitlabSecurity/PublicSend

        if matches.one?
          matches.first
        elsif matches.none?
          raise UnknownProcessError, "Failed to identify runtime for process #{Process.pid} (#{$PROGRAM_NAME})"
        else
          raise AmbiguousProcessError, "Ambiguous runtime #{matches} for process #{Process.pid} (#{$PROGRAM_NAME})"
        end
      end

      def safe_identify
        identify
      rescue UnknownProcessError, AmbiguousProcessError
        nil
      end

      def puma?
        !!defined?(::Puma::Server)
      end

      def sidekiq?
        !!(defined?(::Sidekiq) && Sidekiq.try(:server?))
      end

      def rake?
        !!(defined?(::Rake) && Rake.application.top_level_tasks.any?)
      end

      def test_suite?
        Rails.env.test?
      end

      def console?
        !!defined?(::Rails::Console)
      end

      def geo_log_cursor?
        !!defined?(::GeoLogCursorOptionParser)
      end

      def rails_runner?
        !!defined?(::Rails::Command::RunnerCommand)
      end

      # Whether we are executing in an actual application context i.e. Puma or Sidekiq.
      def application?
        puma? || sidekiq?
      end

      # Whether we are executing in a multi-threaded environment. For now this is equivalent
      # to meaning Puma or Sidekiq, but this could change in the future.
      def multi_threaded?
        application?
      end

      def puma_in_clustered_mode?
        return unless puma?
        return unless ::Puma.respond_to?(:cli_config)

        ::Puma.cli_config.options[:workers].to_i > 0
      end

      def max_threads
        threads = 1 # main thread

        if puma? && ::Puma.respond_to?(:cli_config)
          threads += ::Puma.cli_config.options[:max_threads]
        elsif sidekiq?
          # 2 extra threads for the pollers in Sidekiq and Sidekiq Cron:
          # https://github.com/ondrejbartas/sidekiq-cron#under-the-hood
          #
          # These threads execute Sidekiq client middleware when jobs
          # are enqueued and those can access DB / Redis.
          threads += Sidekiq[:concurrency] + 2
        end

        if puma?
          threads += Gitlab::ActionCable::Config.worker_pool_size
        end

        threads
      end
    end
  end
end