클래스: Mongo::Server::ConnectionPool

상속:
객체
  • 객체
모두 표시
확장자:
전달 가능
다음을 포함합니다.
로깅 가능, 모니터링::게시 가능
다음에 정의됨:
lib/ Mongo/ 서버/connection_pool.rb,
lib/ Mongo/ 서버/connection_pool/populator.rb,
lib/ Mongo/ 서버/connection_pool/generation_manager.rb

개요

서버 연결을 위한 연결 풀을 나타냅니다.

이후:

  • 2.0.0, 2.9.0에서 크게 다시 작성되었습니다.

네임스페이스 아래에 정의됨

클래스: 생성 관리자, 채우기

상수 요약 접기

DEFAULT_MAX_SIZE =

연결 풀 의 기본값 최대 크기입니다.

이후:

  • 2.9.0

20
DEFAULT_MIN_SIZE =

연결 풀 의 기본값 최소 크기입니다.

이후:

  • 2.9.0

0
DEFAULT_MAX_CONNECTING =

특정 시점에 연결할 수 있는 기본값 최대 연결 수입니다.

이후:

  • 2.0.0, 2.9.0에서 크게 다시 작성되었습니다.

2
DEFAULT_WAIT_TIMEOUT =

연결을 기다릴 기본값 시간 제한(초)입니다.

이 시간 제한은 인플로우 스레드가 백그라운드 스레드가 연결을 설정하기를 기다리는 동안 적용됩니다(따라서 할당된 시간 내에 연결, 핸드셰이크 및 인증해야 함).

현재 10 초로 설정되어 있습니다. 기본 연결 시간 제한 자체는 10 초이지만, 시간 제한을 크게 설정하면 역방향 프록시에서 요청 시간이 초과되면 애플리케이션에 문제가 발생할 수 있으므로 15 초를 초과하는 연결은 잠재적으로 위험할 수 있습니다.

이후:

  • 2.9.0

10

Loggable에서 포함된 상수

Loggable::prefix

인스턴스 속성 요약 접기

모니터링::게시 가능에 포함된 속성

#monitoring

클래스 메서드 요약 접기

인스턴스 메서드 요약 접기

Monitoring::Publishable에 포함된 메서드

#publish_cmap_event, #publish_event, #publish_s담_event

Loggable에 포함된 메서드

#log_debug, #log_error, #log_fatal, #log_info, #log_warn, #logger

생성자 세부 정보

#initialize(서버, options = {}) ⇒ ConnectionPool

새 연결 풀을 만듭니다.

참고: 또한 이 풀에서 생성된 연결에 대한 옵션은 여기에 전달된 옵션에 포함되어야 하며, 풀에서 생성된 모든 연결에 전달됩니다.

매개변수:

  • 서버 (MongoDB 서버)

    이 연결 풀 사용되는 서버 입니다.

  • 옵션 (해시) (기본값: {})

    연결 풀 옵션.

옵션 해시(options):

  • :max_size (정수)

    The maximum pool size. 이 옵션을 0으로 설정하면 연결 풀 무제한으로 생성됩니다.

  • :max_connecting (정수)

    동시에 연결할 수 있는 최대 연결 수입니다. 기본값 은 2입니다. 동일한 연결 풀 주식 하는 스레드가 많고 연결이 설정될 때까지 기다리는 동안 애플리케이션 시간 초과가 발생하는 경우 이 옵션을 늘려야 합니다.

  • :max_pool_size (정수)

    더 이상 사용되지 않습니다. 최대 풀 크기입니다. max_size도 지정하는 경우 max_size와 max_pool_size가 동일해야 합니다.

  • :min_size (정수)

    최소 풀 크기입니다.

  • :min_pool_size (정수)

    더 이상 사용되지 않습니다. 최소 풀 크기입니다. min_size도 지정하는 경우 min_size와 min_pool_size는 동일해야 합니다.

  • :wait_timeout (Float)

    무료 연결을 기다리는 시간(초)입니다.

  • :wait_queue_timeout (Float)

    더 이상 사용되지 않습니다. :wait_timeout의 별칭입니다. wait_timeout과 wait_queue_timeout이 모두 지정된 경우 해당 값이 동일해야 합니다.

  • :max_idle_time (Float)

    풀에서 유휴 연결을 닫아야 하는 시간(초)입니다.

  • :populator_io (true, false)

    내부 드라이버 전용입니다. 서버의 연결 풀 에서 채우기 스레드가 생성되고 시작되지 않도록 하려면 false로 설정합니다. 채우기 도구가 명시적으로 필요한 경우를 제외하고 monitoring_io도 끄는 테스트에 사용하기 위한 것입니다. monitoring_io가 꺼져 있지만populator_io가 켜져 있는 경우, 모니터링 없는 클러스터 는 연결되지 않은 것으로 간주되어 닫을 때 연결 풀 채우기 스레드를 정리하지 않으므로 테스트가 끝날 때 채우기를 수동으로 닫아야 합니다.

다음을 발생시킵니다.

  • (ArgumentError)

이후:

  • 2.0.0, 2.9.0에서 변경된 API



100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
# 파일 'lib/ Mongo/ 서버/connection_pool.rb', 줄 100

def 초기화(서버, 옵션 = {})
  올리다 ArgumentError, '첫 번째 인수는 서버 인스턴스 여야 합니다.' 하지 않는 한 서버.is_a?(서버)

  옵션 = 옵션.dup
  만약 옵션[:min_size] && 옵션[:min_pool_size] && 옵션[:min_size] != 옵션[:min_pool_size]
    올리다 ArgumentError,
          "최소 크기 #{options[:min_size]} 가 최소 풀 크기 #{options[:min_pool_size]}와 동일하지 않습니다.
  end
  만약 옵션[:max_size] && 옵션[:max_pool_size] && 옵션[:max_size] != 옵션[:max_pool_size]
    올리다 ArgumentError,
          "최대 크기 #{options[:max_size]} 가 최대 풀 크기 #{options[:max_pool_size]}와 동일하지 않습니다. "
  end
  만약 옵션[:wait_timeout] && 옵션[:wait_queue_timeout] && 옵션[:wait_timeout] != 옵션[:wait_queue_timeout]
    올리다 ArgumentError,
          "대기 시간 제한#{options[:wait_timeout]} 은 대기열 제한 시간#{options[:wait_queue_timeout]} 과 동일하지 않습니다 .
  end

  옵션[:min_size] ||= 옵션[:min_pool_size]
  옵션.삭제(:min_pool_size)
  옵션[:max_size] ||= 옵션[:max_pool_size]
  옵션.삭제(:max_pool_size)
  만약 옵션[:min_size] && 옵션[:max_size] &&
     옵션[:max_size] != 0 && 옵션[:min_size] > 옵션[:max_size]
    올리다 ArgumentError, "최소 크기 #{options[:min_size]} 가 최대 크기 #{options[:max_size]} } 를 초과할 수 없습니다. "
  end

  옵션[:wait_timeout] ||= 옵션[:wait_queue_timeout] 만약 옵션[:wait_queue_timeout]
  옵션.삭제(:wait_queue_timeout)

  @server = 서버
  @options = 옵션.동결

  @generation_manager = 생성 관리자.신규(서버: 서버)
  @ready = 거짓
  @closed = 거짓

  # 이 풀이 소유한 연결은 다음 중 하나에 있어야 합니다.
  # 사용 가능한 연결 배열 ( 스택 으로 사용됨)
  # 또는 체크아웃된 연결 설정하다.
  @available_connections = []
  @checked_out_connections = 세트.신규
  @pending_connections = 세트.신규
  @interrupt_connections = []

  # RUBY-3364: size_cv에 현재 차단된 스레드 개수 /
  # max_connecting_cv. 0이 아닌 경우 새로 도착하는 스레드는
  # 게이트 예측자가 현재 입력되어 있더라도 대기 큐에 입력합니다.
  # 이미 있는 대기자를 지나치지 않도록 만족합니다.
  @size_waiters = 0
  @max_connecting_waiters = 0

  # @available_connections에 대한 액세스를 동기화하는 데 사용되는 뮤텍스 및
  # @checked_out_connections. 풀 객체 는 스레드로부터 안전하므로
  # 일반적으로 인스턴스 변수를 조회 하거나 수정하는 모든 메서드
  # 이 잠금 상태에서 수행해야 합니다.
  @ 락 = 뮤텍스.신규

  # 크기 유지를 담당하는 백그라운드 스레드
  # 풀을 최소 min_size로 설정
  @populator = 인구.신규(self, 옵션)
  @popule_semapher = 세마포어.신규

  # 첫 번째 체크인 check_out: max_pool_size를 시행하다 조건 변수입니다.
  # 이 조건 변수는 다음과 같은 경우 신호를 보내야 합니다.
  # 사용할 수 없는 연결이 감소합니다(pending + Pending_connections +
  # check_out_connections).
  @size_cv = mongo::조건 변수.신규(@ 락)
  # size_cv를 초과한 스레드 수를 나타냅니다.
  # 게이트이지만 보류 중인 연결에 추가할 연결을 획득하지 않았습니다.
  # 설정하다.
  @connection_requests = 0

  # 두 번째 검사를 시행할 조건 변수 check_out: max_connecting.
  # 이 조건 변수는 대기 중인
  # 연결이 감소합니다.
  @max_connecting_cv = mongo::조건 변수.신규(@ 락)
  @max_connecting = 옵션.가져오기(:max_connecting, DEFAULT_MAX_CONNECTING)

  ObjectSpace.describe_finalizer(self,
                               self.클래스.마무리(@available_connections, @pending_connections, @populator))

  publish_cmap_event(
    모니터링::이벤트::Cmap::풀 생성.신규(@server.주소, 옵션, self)
  )
end

인스턴스 속성 세부 정보

#creation_manager정수 (읽기 전용)

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

현재 대기열에서 사용 중인 연결의 생성 생성을 반환합니다.

반환합니다:

  • (정수)

    생성 대기열에서 현재 사용 중인 연결의 생성입니다.

이후:

  • 2.0.0, 2.9.0에서 크게 다시 작성되었습니다.



240
241
242
# 파일 'lib/ Mongo/ 서버/connection_pool.rb', 줄 240

def generate_manager
  @generation_manager
end

#max_connecting객체 (읽기 전용)

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

이후:

  • 2.0.0, 2.9.0에서 크게 다시 작성되었습니다.



349
350
351
# 파일 'lib/ Mongo/ 서버/connection_pool.rb', 줄 349

def max_connecting
  @max_connecting
end

#options해시 (읽기 전용)

반환값 options 풀 옵션입니다.

반환합니다:

  • (해시)

    options 풀 옵션입니다.

이후:

  • 2.0.0, 2.9.0에서 크게 다시 작성되었습니다.



187
188
189
# 파일 'lib/ Mongo/ 서버/connection_pool.rb', 줄 187

def 옵션
  @options
end

#채우기 _세마포어 ⇒ 객체 (읽기 전용)

풀 크기가 변경되어 채우기를 깨울 때 조건 변수가 브로드캐스트됩니다.

이후:

  • 2.0.0, 2.9.0에서 크게 다시 작성되었습니다.



57
58
59
# 파일 'lib/ Mongo/ 서버/connection_pool.rb', 줄 57

def 채우기 세마포어
  @popule_semapher
end

#populator객체 (읽기 전용)

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

이후:

  • 2.0.0, 2.9.0에서 크게 다시 작성되었습니다.



346
347
348
# 파일 'lib/ Mongo/ 서버/connection_pool.rb', 줄 346

def 채우기
  @populator
end

#서버객체 (읽기 전용)

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

이후:

  • 2.0.0, 2.9.0에서 크게 다시 작성되었습니다.



190
191
192
# 파일 'lib/ Mongo/ 서버/connection_pool.rb', 줄 190

def 서버
  @server
end

클래스 메서드 세부 정보

.finalize(available_connections, Pending_connections, _populator) ⇒ Proc

가비지 컬렉션을 위한 연결 풀을 마무리합니다.

매개변수:

  • available_connections (List<Mongo::Connection>)

    사용 가능한 연결입니다.

  • 보류 중인_연결 (List<Mongo::Connection>)

    보류 중인 연결입니다.

  • 채우기 (인구)

    채우기.

반환합니다:

  • (Proc)

    종료자.

이후:

  • 2.0.0, 2.9.0에서 크게 다시 작성되었습니다.



854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
# 파일 'lib/ Mongo/ 서버/connection_pool.rb', 줄 854

def self.마무리(available_connections, 보류 중인_연결, _populator)
  proc do
    available_connections. do |연결|
      연결.연결 해제!(이유: :pool_closed)
    end
    available_connections.지우기

    보류 중인_연결. do |연결|
      연결.연결 해제!(이유: :pool_closed)
    end
    보류 중인_연결.지우기

    # 종료자는 체크아웃된 연결을 닫지 않습니다.
    # 자체적으로 가비지를 수집해야 합니다.
    # 그러면 닫힙니다.
  end
end

인스턴스 메서드 세부 정보

#available_count정수

풀에서 사용 가능한 연결 수입니다.

반환합니다:

  • (정수)

    사용 가능한 연결 수입니다.

이후:

  • 2.9.0



298
299
300
301
302
303
304
# 파일 'lib/ Mongo/ 서버/connection_pool.rb', 줄 298

def available_count
  raise_if_closed!

  @ 락.동기화 do
    @available_connections.분량
  end
end

#check_in(connection) ⇒ 객체

풀에 대한 연결을 다시 확인합니다.

연결이 이전에 이 풀에서 생성된 적이 있어야 합니다.

매개변수:

이후:

  • 2.9.0



425
426
427
428
429
430
431
432
433
# 파일 'lib/ Mongo/ 서버/connection_pool.rb', 줄 425

def check_in(연결)
  check_invariants

  @ 락.동기화 do
    do_check_in(연결)
  end
보장
  check_invariants
end

#check_out(connection_global_id: nil, context: nil) ⇒ Mongo::Server::Connection

풀에서 연결을 확인합니다.

풀에 활성 연결이 있는 경우 가장 최근에 사용된 연결이 반환됩니다. 그렇지 않고 연결 풀 크기가 최대 크기보다 작은 경우 새 연결을 만들고 반환합니다. 그렇지 않고 대기 시간 제한까지 기다렸다가 여전히 활성 연결이 없고 풀 크기가 최대인 경우 Timeout::Error를 발생시킵니다.

반환된 연결은 풀의 최대 크기에 포함됩니다. 호출자가 연결 사용을 마치면 check_in 메서드를 통해 연결을 다시 체크인해야 합니다.

매개변수:

  • :connection_global_id (정수 | nil)

    체크아웃할 연결의 글로벌 ID입니다.

  • :context (Mongo::Operation:Context | nil)

    연결이 요청되는 작업의 컨텍스트입니다(있는 경우).

반환합니다:

다음을 발생시킵니다.

  • (Error::PoolClosedError)

    풀이 닫힌 경우.

  • (Timeout::Error)

    연결 풀 최대 크기이고 대기 시간 초과보다 오래 유지되는 경우.

이후:

  • 2.9.0



373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
# 파일 'lib/ Mongo/ 서버/connection_pool.rb', 줄 373

def check_out(connection_global_id: nil, 컨텍스트: nil)
  check_invariants

  publish_cmap_event(
    모니터링::이벤트::Cmap::connectionCheckOutStarted 이벤트.신규(@server.주소)
  )

  raise_if_pool_closed!
  raise_if_pool_paused_locked!

  연결 = recover_and_connect_connection(
    connection_global_id, 컨텍스트
  )

  publish_cmap_event(
    모니터링::이벤트::Cmap::connectionCheckedOut.신규(@server.주소, 연결.id, self)
  )

  만약 Lint.활성화? && !연결.연결됨?
    올리다 오류::LintError,
          "#{주소} 에 대한연결 풀이 연결 이 끊긴 연결 #{연결.생성} } 을 체크아웃했습니다:#{연결.ID}"
  end

  연결
보장
  check_invariants
end

#check_out_pinned_connection(connection_global_id) ⇒ 연결 | nil

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

지정된 글로벌 ID를 가진 고정된 연결이 있는 경우 이미 체크아웃된 고정된 연결을 반환합니다. 그렇지 않으면 nil을 반환합니다.

매개변수:

  • connection_global_id (정수)

    고정된 연결의 전역 ID입니다.

반환합니다:

  • (Connection | nil)

    고정된 연결 또는 nil입니다.

이후:

  • 2.0.0, 2.9.0에서 크게 다시 작성되었습니다.



410
411
412
413
414
415
416
# 파일 'lib/ Mongo/ 서버/connection_pool.rb', 줄 410

def check_out_pinned_connection(connection_global_id)
  @ 락.동기화 do
    @checked_out_connections.감지 do |conn|
      conn.global_id == connection_global_id && conn.고정?
    end
  end
end

#clear(options = nil) ⇒ true

풀의 모든 유휴 연결을 닫고 현재 체크아웃된 연결이 풀에 다시 체크인될 때 닫히도록 예약합니다. 풀이 일시 중지되고 배경 에서 새 연결을 생성하지 않으며 준비됨으로 표시될 때까지 체크아웃 요청이 실패합니다.

매개변수:

  • 옵션 (해시) (기본값: nil)

    사용자 지정 가능한 옵션 세트

옵션 해시(options):

  • :lazy (true | false)

    true인 경우 유휴 연결을 닫지 말고 후속 체크아웃 작업 중에 닫도록 합니다. 기본값은 false입니다.

  • :interrupt_in_use_connections (true | false)

    true인 경우 체크아웃된 모든 연결을 즉시 닫습니다. 거짓인 경우 체크아웃된 연결을 닫지 마세요. 기본값은 true입니다.

  • :service_id (객체)

    지정된 서비스 ID와의 연결만 해제합니다.

반환합니다:

  • (true)

    true.

이후:

  • 2.1.0



545
546
547
548
549
550
551
552
553
# 파일 'lib/ Mongo/ 서버/connection_pool.rb', 줄 545

def 지우기(옵션 = nil)
  raise_if_closed!

  만약 Lint.활성화? && !@server.알 수 없음?
    올리다 오류::LintError, "{@ 서버.summary}서버 서버 풀을 지우려고 시도 하는 중"
  end

  do_clear(옵션)
end

#close(options = nil) ⇒ true

풀을 닫은 것으로 표시하고, 풀의 모든 유휴 연결을 닫으며, 현재 체크아웃된 연결이 풀에 다시 체크인될 때 닫히도록 예약합니다. 강제 옵션이 true이면 체크아웃된 연결도 닫힙니다. 풀이 닫힌 후 사용하려고 하면 Error::PoolClosedError가 발생합니다.

매개변수:

  • 옵션 (해시) (기본값: nil)

    사용자 지정 가능한 옵션 세트

옵션 해시(options):

  • :force (true | false)

    또한 체크아웃한 모든 연결을 닫습니다.

  • :Stay_ready (true | false)

    내부 드라이버 전용입니다. 풀을 닫힌 상태로 표시할지 여부입니다.

반환합니다:

  • (true)

    항상 사실입니다.

이후:

  • 2.9.0



667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
# 파일 'lib/ Mongo/ 서버/connection_pool.rb', 줄 667

def 닫기(옵션 = nil)
  반환 만약 닫힘?

  옵션 ||= {}

  stop_populator

  @ 락.동기화 do
    까지 @available_connections.비어 있나요?
      연결 = @available_connections.
      연결.연결 해제!(이유: :pool_closed)
    end

    만약 옵션[:force]
      까지 @checked_out_connections.비어 있나요?
        연결 = @checked_out_connections.가져(1).first
        연결.연결 해제!(이유: :pool_closed)
        @checked_out_connections.삭제(연결)
      end
    end

    하지 않는 한 옵션 && 옵션[:Stay_ready]
      # 락 을 해제하기 전에 풀을 닫힌 상태로 표시합니다.
      # 연결을 만들거나, 체크인하거나, 체크아웃할 수 없습니다.
      @closed = true
      @ready = 거짓
    end

    @max_connecting_cv.브로드캐스트
    @size_cv.브로드캐스트
    @generation_manager.close_all_pipes
  end

  publish_cmap_event(
    모니터링::이벤트::Cmap::풀 마감.신규(@server.주소, self)
  )

  true
end

#close_idle_sockets객체

옵션이 설정된 경우 최대 유휴 시간보다 오랫동안 열려 있던 소켓을 닫습니다.

이후:

  • 2.5.0



777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
# 파일 'lib/ Mongo/ 서버/connection_pool.rb', 줄 777

def close_idle_sockets
  반환 만약 닫힘?
  반환 하지 않는 한 max_idle_time

  @ 락.동기화 do
    i = 0
    동안 i < @available_connections.분량
      연결 = @available_connections[i]
      만약 (last_checkin = 연결.last_checkin) && ((시간.지금 - last_checkin) > max_idle_time)
        연결.연결 해제!(이유: :idle)
        @available_connections.delete_at(i)
        @popule_semapher.신호
        다음
      end
      i += 1
    end
  end
end

#닫았나요?true | false

풀이 닫혔는지 여부입니다.

반환합니다:

  • (true | false)

    풀이 닫혔는지 여부입니다.

이후:

  • 2.9.0



311
312
313
# 파일 'lib/ Mongo/ 서버/connection_pool.rb', 줄 311

def 닫힘?
  !!@closed
end

#연결 해제!(options = nil) ⇒ 객체

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

풀 연결을 해제합니다.

풀이 닫힌 경우 이 메서드는 아무 작업도 수행하지 않지만 clear 에서 PoolClosedError를 발생시키는 것을 제외하고 clear 가 수행하는 모든 작업을 수행합니다.

이후:

  • 2.1.0



562
563
564
565
566
567
568
# 파일 'lib/ Mongo/ 서버/connection_pool.rb', 줄 562

def 연결 해제!(옵션 = nil)
  do_clear(옵션)
구출 오류::PoolClosedError
  # "연결 해제됨" 상태 는 닫힘과 일시 중지 사이입니다.
  # 풀 연결을 끊으려고 할 때 풀을 다음과 같이 허용합니다.
  # 이미 종료되었습니다.
end

#do_check_in(connection) ⇒ 객체

이미 잠금을 획득한 후 체크인을 실행합니다.

매개변수:

이후:

  • 2.0.0, 2.9.0에서 크게 다시 작성되었습니다.



438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
# 파일 'lib/ Mongo/ 서버/connection_pool.rb', 줄 438

def do_check_in(연결)
  # 연결이 중단되면 풀에 다시 확인됩니다.
  # 닫습니다. 이전에 연결을 사용하고 있던 작업은 다음과 같습니다.
  # interrupted는 풀에 다시 체크인하려고 시도합니다.
  # 이미 닫혀 풀에서 제거되었으므로 무시해야 합니다.
  반환 만약 연결.닫힘? && 연결.중단?

  하지 않는 한 연결.connection_pool == self
    올리다 ArgumentError,
          "이 풀에서 체크아웃되지 않은 연결을 체크인하려고 합니다: #{연결} 풀에서 체크아웃됨 #{연결.연결} (#{자기})"
  end

  하지 않는 한 @checked_out_connections.포함?(연결)
    올리다 ArgumentError,
          "현재 이 풀에서 체크아웃되지 않은 연결을 체크인하려고 합니다: #{connection} (for #{self})"
  end

  # 참고: 이벤트 핸들러가 발생하면 리소스 에 신호가 전달되지 않습니다.
  # 이는 연결이 해제되기를 기다리는 스레드가 다음과 같은 경우를 의미합니다.
  # 풀이 최대 크기일 때 시간이 초과될 수 있습니다.
  # 이 메서드가 완료된 후 대기를 시작하는 스레드(
  # 예외)는 괜찮습니다.

  @checked_out_connections.삭제(연결)
  @size_cv.신호

  publish_cmap_event(
    모니터링::이벤트::Cmap::connectionCheckedIn.신규(@server.주소, 연결.id, self)
  )

  만약 연결.중단?
    연결.연결 해제!(이유: :stale)
    반환
  end

  만약 연결.오류?
    연결.연결 해제!(이유: :error)
    반환
  end

  만약 닫힘?
    연결.연결 해제!(이유: :pool_closed)
    반환
  end

  만약 연결.닫힘?
    # 연결이 예시 습니다.
    # 네트워크 오류입니다. 여기서는 다른 작업을 수행할 필요가 없습니다.
    @popule_semapher.신호
  elsif 연결.생성 != 생성(service_id: 연결.service_id) && !연결.고정?
    # 연결이 고정됨으로 표시되면 트랜잭션 에서 사용됩니다.
    로드 밸런싱 설정에서 # 또는 일련의 커서 작업.
    # 이 경우 연결이 끊어지면 안 됩니다.
    # 고정 해제되었습니다.
    연결.연결 해제!(이유: :stale)
    @popule_semapher.신호
  other
    연결.record_checkin!
    @available_connections << 연결

    @max_connecting_cv.신호
  end
end

#do_clear(options = nil) ⇒ 객체

이후:

  • 2.0.0, 2.9.0에서 크게 다시 작성되었습니다.



570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
# 파일 'lib/ Mongo/ 서버/connection_pool.rb', 줄 570

def do_clear(옵션 = nil)
  check_invariants

  service_id = 옵션 && 옵션[:service_id]

  @ 락.동기화 do
    # 풀 지우기 이벤트를 내보내기 전에 세대를 충돌시켜야 합니다.
    @generation_manager.범프(service_id: service_id)

    close_available_connections(service_id) 하지 않는 한 옵션 && 옵션[:lazy]

    만약 옵션 && 옵션[:interrupt_in_use_connections]
      Schedule_for_interruption(@checked_out_connections, service_id)
      Schedule_for_interruption(@pending_connections, service_id)
    end

    만약 @ready
      publish_cmap_event(
        모니터링::이벤트::Cmap::풀 지우기.신규(
          @server.주소,
          service_id: service_id,
          interrupt_in_use_connections: 옵션&.[](:interrupt_in_use_connections)
        )
      )
      # 서버가 알 수 없음으로 표시된 경우에만 연결 풀을 일시 중지합니다.
      # 그렇지 않으면 준비된 풀로 재시도를 허용합니다.
      do_pause 만약 !@server.load_balancer? && @server.알 수 없음?
    end

    # 여기에서 브로드캐스트하여 모든 스레드가 최대
    # 대기 루프를 벗어나기 위해 연결하는 중 오류가 발생했습니다.
    @max_connecting_cv.브로드캐스트
    # 모든 스레드가 풀 크기에서 대기하도록 하려면 여기에서 브로드캐스트합니다.
    # 대기 루프와 오류에서 벗어나기 위해.
    @size_cv.브로드캐스트
  end

  # "백그라운드 스레드 예약" 후 삭제. 이것은 책임이 있습니다.
  # 오래된 스레드를 정리하고 사용 중인 연결을 중단합니다.
  @popule_semapher.신호
  true
보장
  check_invariants
end

#do_pause객체

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

잠금을 획득하지 않고 연결 풀을 일시 중지된 상태로 표시합니다.

이후:

  • 2.0.0, 2.9.0에서 크게 다시 작성되었습니다.



518
519
520
521
522
523
524
525
526
# 파일 'lib/ Mongo/ 서버/connection_pool.rb', 줄 518

def do_pause
  만약 Lint.활성화? && !@server.알 수 없음?
    올리다 오류::LintError, " 알려진서버 #{@server.요약}대한 풀을 일시 중지하려고 시도 중"
  end

  반환 하지 않는 한 @ready

  @ready = 거짓
end

#검사string

풀에 대해 예쁜 인쇄된 string 검사를 받으세요.

예시:

풀을 검사합니다.

pool.inspect

반환합니다:

  • (string)

    풀 검사.

이후:

  • 2.0.0



715
716
717
718
719
720
721
722
723
724
725
726
# 파일 'lib/ Mongo/ 서버/connection_pool.rb', 줄 715

def 검사
  만약 닫힘?
    "#<Mongo::Server::ConnectionPool:0x#{object_id} min_size=#{min_size} max_size=#{max_size} " +
      "wait_timeout=#{wait_timeout} closed>"
  elsif !준비됐나요?
    "#<Mongo::Server::ConnectionPool:0x#{object_id} min_size=#{min_size} max_size=#{max_size} " +
      "wait_timeout=#{wait_timeout} paused>"
  other
    "#<Mongo::Server::ConnectionPool:0x#{object_id} min_size=#{min_size} max_size=#{max_size} " +
      "wait_timeout=#{wait_timeout} current_size=#{size} available=#{available_count}>"
  end
end

#max_idle_timeFloat | nil

소켓이 풀에 체크인된 이후 유휴 상태로 유지될 수 있는 최대 시간(초)입니다(설정된 경우).

반환합니다:

  • (Float | nil)

    최대 소켓 유휴 시간(초)입니다.

이후:

  • 2.9.0



235
236
237
# 파일 'lib/ Mongo/ 서버/connection_pool.rb', 줄 235

def max_idle_time
  @max_idle_time ||= 옵션[:max_idle_time]
end

#max_sizeInteger

연결 풀 의 최대 크기를 가져옵니다.

반환합니다:

  • (정수)

    연결 풀 의 최대 크기입니다.

이후:

  • 2.9.0



200
201
202
# 파일 'lib/ Mongo/ 서버/connection_pool.rb', 줄 200

def max_size
  @max_size ||= 옵션[:max_size] || [ DEFAULT_MAX_SIZE, min_size ].최대
end

#min_sizeInteger

연결 풀의 최소 크기를 가져옵니다.

반환합니다:

  • (정수)

    연결 풀 의 최소 크기입니다.

이후:

  • 2.9.0



209
210
211
# 파일 'lib/ Mongo/ 서버/connection_pool.rb', 줄 209

def min_size
  @min_size ||= 옵션[:min_size] || DEFAULT_MIN_SIZE
end

#pause객체

연결 풀을 일시 중지됨으로 표시합니다.

이후:

  • 2.0.0, 2.9.0에서 크게 다시 작성되었습니다.



503
504
505
506
507
508
509
510
511
512
513
# 파일 'lib/ Mongo/ 서버/connection_pool.rb', 줄 503

def 일시 중지
  raise_if_closed!

  check_invariants

  @ 락.동기화 do
    do_pause
  end
보장
  check_invariants
end

#일시 중지되었나요?true | false

연결 풀 닫히지 않았거나 준비되지 않은 경우 일시 중지됩니다.

반환합니다:

  • (true | false)

    연결 풀이 일시 중지되었는지 여부.

다음을 발생시킵니다.

이후:

  • 2.0.0, 2.9.0에서 크게 다시 작성되었습니다.



253
254
255
256
257
258
259
# 파일 'lib/ Mongo/ 서버/connection_pool.rb', 줄 253

def 일시 중지되었나요?
  raise_if_closed!

  @ 락.동기화 do
    !@ready
  end
end

#채우기true | false

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

이 메서드는 세 가지 작업을 수행합니다.

  1. 풀의 크기가 min_size보다 작은 경우 풀에 연결을 생성하고 추가합니다. 이 프로세스 중에 소켓 관련 오류가 발생하면 한 번 재시도하고, 두 번째 오류 또는 소켓과 관련이 없는 오류가 발생하면 발생시킵니다.
  2. 연결 풀에서 오래된 연결을 제거합니다.
  3. 중단으로 표시된 연결을 중단합니다.

풀 채우기 백그라운드 스레드에서 사용합니다.

발생했거나 소켓과 관련되지 않은 오류

반환합니다:

  • (true | false)

    더 많은 연결을 생성하기 위해 이 메서드를 다시 호출해야 하는지 여부입니다.

다음을 발생시킵니다.

이후:

  • 2.0.0, 2.9.0에서 크게 다시 작성되었습니다.



833
834
835
836
837
838
839
840
841
842
843
844
845
# 파일 'lib/ Mongo/ 서버/connection_pool.rb', 줄 833

def 채우기
  반환 거짓 만약 닫힘?

  시작
    반환 create_and_add_connection
  구출 오류::SocketError, 오류::SocketTimeoutError => e
    # 연결을 연결하는 동안 오류가 발생했습니다.
    # 이 첫 번째 오류를 무시하고 다시 시도하세요.
    log_warn("포플러가 #{주소}: #{ e.class}: #{ e} 에 대한연결을 연결하지 못했습니다. 다시 시도합니다.")
  end

  create_and_add_connection
end

#준비 됨 ⇒ 객체

연결을 생성하고 반환하도록 풀에 지시합니다.

이후:

  • 2.0.0, 2.9.0에서 크게 다시 작성되었습니다.



616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
# 파일 'lib/ Mongo/ 서버/connection_pool.rb', 줄 616

def 준비됨
  raise_if_closed!

  # TODO: RUBY-3174 에 다시 추가합니다.
  # if Lint.enabled?
  # when @ 서버.connected?
  # 제기 오류::LintError, "#{@ 서버 .summary} 서버 에 대한 풀을 준비하는 중입니다. 연결이 끊어졌습니다."
  # end
  # end

  @ 락.동기화 do
    반환 만약 @ready

    @ready = true
  end

  # CMAP 사양은 다음에 대한 CMAP 이벤트의 직렬화를 요구합니다.
  # 풀. 이를 구현하려면 이벤트 게시를 다음으로 수행해야 합니다.
  # 구독자가 호출되는 대신 동기화되는 대기열
  # 이와 같은 trigger 메서드에서 인라인으로 가져옵니다. 자기공명영상(MRI)에서 다음과 같이 가정합니다.
  # 스레드가 할 일이 없어지면 다른 스레드에게 양보합니다.
  # 이벤트가 실제로 항상 다음 위치에 게시될 가능성이 높습니다.
  #개의 필수 순서입니다. JRuby는 OS 스레드와 진정한 동시성을 제공하며,
  # 이러한 보장을 제공하지 않습니다.
  publish_cmap_event(
    모니터링::이벤트::Cmap::풀 준비.신규(@server.주소, 옵션, self)
  )

  반환 하지 않는 한 옵션.가져오기(:populator_io, true)

  만약 @populator.실행?
    @popule_semapher.신호
  other
    @populator.실행!
  end
end

#준비되었나요?true | false

풀이 준비되었는지 여부입니다.

반환합니다:

  • (true | false)

    풀이 준비되었는지 여부입니다.

이후:

  • 2.0.0, 2.9.0에서 크게 다시 작성되었습니다.



318
319
320
321
322
# 파일 'lib/ Mongo/ 서버/connection_pool.rb', 줄 318

def 준비됐나요?
  @ 락.동기화 do
    @ready
  end
end

#크기정수

연결 풀의 크기입니다.

사용 가능한 연결과 체크 아웃된 연결이 포함됩니다.

반환합니다:

  • (정수)

    연결 풀의 크기입니다.

이후:

  • 2.9.0



268
269
270
271
272
273
274
# 파일 'lib/ Mongo/ 서버/connection_pool.rb', 줄 268

def size
  raise_if_closed!

  @ 락.동기화 do
    unsynchronized_size
  end
end

#상태Hash

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

주로 테스트 및 디버그 목적으로 연결 풀의 내부 상태에 대한 통계를 반환합니다.

반환합니다:

  • (해시)

    연결 풀 의 상태

이후:

  • 2.0.0, 2.9.0에서 크게 다시 작성되었습니다.



878
879
880
881
882
883
884
885
886
# 파일 'lib/ Mongo/ 서버/connection_pool.rb', 줄 878

def 상태
  @ 락.동기화 do
    { available_connections: @available_connections.분량,
      checked_out_connections: @checked_out_connections.분량,
      pending_connections: @pending_connections.분량,
      interrupt_connections: @interrupt_connections.분량,
      connection_requests: @connection_requests }
  end
end

#stop_populator객체

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

백그라운드 채우기 스레드를 중지하고 생성된 연결 중 아직 연결되지 않은 연결을 모두 정리합니다.

테스트 목적으로 풀을 닫거나 bg 스레드를 종료할 때 사용됩니다. 후자의 경우, 풀을 사용하기 전에 이 메서드를 호출해야 check_out 메서드에 의해 인플로(in-flow)에서 보류 중인 연결의 연결이 생성되지 않았는지 확인할 수 있습니다.

이후:

  • 2.0.0, 2.9.0에서 크게 다시 작성되었습니다.



805
806
807
808
809
810
811
812
813
814
815
# 파일 'lib/ Mongo/ 서버/connection_pool.rb', 줄 805

def stop_populator
  @populator.중지!

  @ 락.동기화 do
    # 채우기가 실행되는 동안 stop_populator가 호출되면 다음이 발생할 수 있습니다.
    # 연결 대기 중인 연결, 아직 연결되지 않은 연결
    # available_connections로 이동되었거나 연결이 available_connections로 이동되었습니다.
    # 하지만 보류 중인_연결에서 삭제되지 않았습니다. 이러한 항목을 정리해야 합니다.
    clear_pending_connections
  end
end

#요약객체

참고:

이 방법은 실험적이며 변경될 수 있습니다.

이후:

  • 2.11.0



328
329
330
331
332
333
334
335
336
337
338
339
340
# 파일 'lib/ Mongo/ 서버/connection_pool.rb', 줄 328

def 요약
  @ 락.동기화 do
    상태 = 만약 닫힘?
              'closed'
            elsif !@ready
              'paused'
            other
              '준비'
            end
    "#<ConnectionPool size=#{unsynchronized_size} (#{min_size}-#{max_size}) " +
      "used=#{@checked_out_connections.length}available =#{@available_connections.length} 보류 중=#{@pending_connections.length} #{state}>"
  end
end

#available_connections정수

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

풀에서 사용할 수 없는 연결 수를 반환합니다. max_pool_size에 도달했는지 여부를 계산하는 데 사용됩니다.

반환합니다:

  • (정수)

    풀에서 사용할 수 없는 연결의 수입니다. max_pool_size에 도달했는지 여부를 계산하는 데 사용됩니다.

이후:

  • 2.0.0, 2.9.0에서 크게 다시 작성되었습니다.



289
290
291
# 파일 'lib/ Mongo/ 서버/connection_pool.rb', 줄 289

def available_connections
  @checked_out_connections.분량 + @pending_connections.분량 + @connection_requests
end

#wait_timeout(context = nil) ⇒ Float

연결을 사용할 수 있을 때까지 기다리는 시간(초)입니다.

매개변수:

  • 컨텍스트 (Mongo::Operation:Context | nil) (기본값: nil)

    연결이 요청되는 작업의 컨텍스트입니다(있는 경우).

반환합니다:

  • (Float)

    대기열 대기 시간 초과입니다.

이후:

  • 2.9.0



221
222
223
224
225
226
227
# 파일 'lib/ Mongo/ 서버/connection_pool.rb', 줄 221

def wait_timeout(컨텍스트 = nil)
  만약 컨텍스트&.나머지_시간 초과_초.nil?
    옵션[:wait_timeout] || DEFAULT_WAIT_TIMEOUT
  other
    컨텍스트&.나머지_시간 초과_초
  end
end

#with_connection(connection_global_id: nil, context: nil) ⇒ 객체

체크인/체크아웃 로직을 처리하는 동안 차단을 연결에 양보합니다.

예시:

연결을 사용하여 실행합니다.

pool.with_connection do |connection|
  connection.read
end

반환합니다:

  • (객체)

    차단의 결과입니다.

이후:

  • 2.0.0



738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
# 파일 'lib/ Mongo/ 서버/connection_pool.rb', 줄 738

def with_connection(connection_global_id: nil, 컨텍스트: nil)
  raise_if_closed!

  # 특정 연결이 요청되었고 이미 체크아웃된 경우
  # 및 고정됨(예: 트랜잭션 또는 로드 밸런싱 모드 의 커서 ),
  # check_out/check_in 주기를 거치지 않고 직접 재사용합니다.
  만약 connection_global_id
    연결 = @ 락.동기화 do
      @checked_out_connections.감지 do |conn|
        conn.global_id == connection_global_id && conn.고정?
      end
    end
  end

  연결 ||= check_out(
    connection_global_id: connection_global_id,
    컨텍스트: 컨텍스트
  )

  yield(연결)
구출 오류::SocketError, 오류::SocketTimeoutError, 오류::ConnectionPerished => e
  may_raise_pool_cleared!(연결, e)
보장
  만약 연결 && !연결.고정?
    # 연결이 고정된 경우(세션 또는 커서
    #이(가) 소유하고 있으며 나중에 고정을 해제할 때 체크인합니다). 또한 건너뛰기
    # 차단 중에 연결이 이미 체크인된 경우 check-in
    # (예: 첫 번째 작업에서 오류가 발생한 후 Session#unpin을 통해).
    check_out = @ 락.동기화 do
      @checked_out_connections.포함?(연결)
    end
    check_in(연결) 만약 check_out
  end
end