클래스: Mongo::Server::PushMonitor Private

상속:
객체
  • 객체
모두 표시
확장자:
전달 가능
다음을 포함합니다.
배경 스레드
다음에 정의됨:
build/ruby-driver-v2.19/lib/mongo/server/push_monitor.rb,
build/ruby-driver-v2.19/lib/mongo/server/push_monitor/connection.rb

개요

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

서버 푸시 헬로 요청을 활용하는 모니터입니다.

모니터가 4.4+ 서버와 핸드셰이크하면 푸시 모니터 인스턴스가 생성됩니다. 이후 푸시모니터는 서버 푸시 헬로(예: awaited & exhaust hello)를 사용하여 서버로부터 토폴로지 변경 사항을 최대한 빨리 수신할 수 있습니다. 모니터는 여전히 서버를 모니터링하여 왕복 시간을 계산하고 애플리케이션의 요청에 따라 즉시 검사를 수행합니다.

이후:

  • 2.0.0

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

클래스: 연결

상수 요약

Loggable에서 포함된 상수

Loggable::prefix

인스턴스 속성 요약 접기

인스턴스 메서드 요약 접기

BackgroundThread에 포함된 메서드

# 실행!, # 실행?

Loggable에 포함된 메서드

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

생성자 세부 정보

#initialize(모니터, topology_version, 모니터링, **options) ⇒ 푸시모니터

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

푸시모니터의 새 인스턴스를 반환합니다.

이후:

  • 2.0.0



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# 파일 'build/ruby-driver-v2.19/lib/mongo/server/push_monitor.rb', 줄 35

def 초기화(모니터, topology_version, 모니터링, **옵션)
  만약 topology_version.nil?
    올리다 ArgumentError, '토폴로지 버전을 제공해야 하지만'
  end
  하지 않는 한 옵션[:app_metadata]
    올리다 ArgumentError, '앱 메타데이터 는 필수 항목입니다. '
  end
  하지 않는 한 옵션[:check_document]
    올리다 ArgumentError, '문서가 필수 항목인지 확인하세요.'
  end
  @app_metadata = 옵션[:app_metadata]
  @check_document = 옵션[:check_document]
  모니터 = 모니터
  @topology_version = topology_version
  @monitoring = 모니터링
  @options = 옵션
  @ 락 = 뮤텍스.신규
end

인스턴스 속성 세부 정보

#모니터서버 (읽기 전용)

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

모니터링 중인 서버를 반환합니다.

반환합니다:

이후:

  • 2.0.0



55
56
57
# 파일 'build/ruby-driver-v2.19/lib/mongo/server/push_monitor.rb', 줄 55

def 모니터
  모니터
end

#모니터링모니터링 (읽기 전용)

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

모니터링을 반환합니다.

반환합니다:

이후:

  • 2.0.0



61
62
63
# 파일 'build/ruby-driver-v2.19/lib/mongo/server/push_monitor.rb', 줄 61

def 모니터링
  @monitoring
end

#options해시 (읽기 전용)

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

푸시 모니터 옵션을 반환합니다.

반환합니다:

  • (해시)

    푸시 모니터 옵션.

이후:

  • 2.0.0



64
65
66
# 파일 'build/ruby-driver-v2.19/lib/mongo/server/push_monitor.rb', 줄 64

def 옵션
  @options
end

#topology_versionTopologyVersion (읽기 전용)

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

가장 최근에 받은 토폴로지 버전을 반환합니다.

반환합니다:

  • (TopologyVersion)

    가장 최근에 받은 토폴로지 버전입니다.

이후:

  • 2.0.0



58
59
60
# 파일 'build/ruby-driver-v2.19/lib/mongo/server/push_monitor.rb', 줄 58

def topology_version
  @topology_version
end

인스턴스 메서드 세부 정보

#check객체

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

이후:

  • 2.0.0



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
# 파일 'build/ruby-driver-v2.19/lib/mongo/server/push_monitor.rb', 줄 137

def 확인
  @ 락.동기화 do
    만약 @connection && @connection.PID != 프로세스.PID
      log_warn(" PID 변경 감지 - mongo 클라이언트가 다시 연결되었어야 함 (이전 PID #{@connection.PID}, 새 PID #{프로세스.PID}")
      @connection.연결 해제!
      @connection = nil
    end
  end

  @ 락.동기화 do
    하지 않는 한 @connection
      @server_pushing = 거짓
      연결 = 푸시 모니터::연결.신규(서버.주소, 옵션)
      연결.연결!
      @connection = 연결
    end
  end

  resp_msg = 시작
    하지 않는 한 @server_pushing
      write_check_command
    end
    read_response
  구출 mongo::오류
    @ 락.동기화 do
      @connection.연결 해제!
      @connection = nil
    end
    올리다
  end
  @server_pushing = resp_msg.flags.포함?(:more_to_com)
  결과 = 작업::결과.신규(resp_msg)
  결과.유효성을 검사합니다!
  결과.문서.first
end

#do_work객체

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

이후:

  • 2.0.0



94
95
96
97
98
99
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
# 파일 'build/ruby-driver-v2.19/lib/mongo/server/push_monitor.rb', 줄 94

def do_work
  @ 락.동기화 do
    반환 만약 @stop_requested
  end

  결과 = 모니터링.publish_heartbeat(서버, awaited: true) do
    확인
  end
  new_description = 모니터.run_sdam_flow(결과, awaited: true)
  # hello가 실패 점 으로 인해 실패하면 응답은 다음을 수행하지 않습니다.
  # 토폴로지 버전을 포함합니다. 이 경우 기존 데이터를 유지해야 합니다.
  # 토폴로지 버전을 업데이트하여 모니터링 을 재개할 수 있습니다.
  # 사양은 이 경우를 직접 해결하는 것처럼 보이지는 않지만
  # https://github.com/mongodb/specations/lob/master/source/server-discovery-and-monitoring/server-monitoring.rst#streaming-ismaster
  # topologyVersion은 성공적인
  # hello 응답.
  만약 new_description.topology_version
    @topology_version = new_description.topology_version
  end
구출 IOError, SocketError, SystemCallError, mongo::오류 => exc
  stop_requested = @ 락.동기화 { @stop_requested }
  만약 stop_requested
    # 예외를 무시합니다(RUBY-2771 참조).
    반환
  end

  msg = "#{서버.주소}에서 awaited hello를 실행 오류가 발생했습니다. "
  Utils.경고_bg_Exception(msg, exc,
    로거: 옵션[:logger],
    log_prefix: 옵션[:log_prefix],
    bg_error_backtrace: 옵션[:bg_error_backtrace],
  )

  # 연결 요청이 실패하면 푸시 모니터링을 중지합니다.
  # 서버가 죽은 경우 두 개의 연결을 원하지 않습니다.
  # 동시에 연결을 시도하지도 못했습니다.
  중지!

  # 모니터 에서 즉시 확인을 요청하여 다음 계정으로 복원합니다.
  서버 가 실제로 활성 상태인 경우 # 가능한 한 빨리 처리합니다.
  서버.scan_semapher.신호
end

#read_response객체

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

이후:

  • 2.0.0



184
185
186
187
188
189
190
191
192
193
194
195
196
197
# 파일 'build/ruby-driver-v2.19/lib/mongo/server/push_monitor.rb', 줄 184

def read_response
  만약 타임아웃 = 옵션[:connect_timeout]
    만약 타임아웃 < 0
      올리다 mongo::SocketTimeoutError, "음수 시간 제한으로 읽기 요청: #{}"
    elsif 타임아웃 > 0
      타임아웃 += 옵션[:하트비트_빈도] || 모니터::DEFAULT_HEARTBEAT_INTERVAL
    end
  end
  # 타임아웃을 두 번 설정하다 했습니다: 한 번은 적용되는 read_socket에 전달됩니다.
  # 각 개별 읽기 작업에 대해 수행하고 다시 전체 읽기에 대해 수행합니다.
  시간 초과.타임아웃(타임아웃, 오류::SocketTimeoutError, "#{timeout} 후에 대기 중인 hello 응답을 읽지못했습니다. ") do
    @ 락.동기화 { @connection }.read_response(socket_timeout: 타임아웃)
  end
end

#시작합니다!객체

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

이후:

  • 2.0.0



69
70
71
72
73
# 파일 'build/ruby-driver-v2.19/lib/mongo/server/push_monitor.rb', 줄 69

def 시작!
  @ 락.동기화 do
    super
  end
end

#그만해!객체

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

이후:

  • 2.0.0



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# 파일 'build/ruby-driver-v2.19/lib/mongo/server/push_monitor.rb', 줄 75

def 중지!
  @ 락.동기화 do
    @stop_requested = true
    만약 @connection
      # 진행 중인 모든 소진된 hello 읽기를 중단합니다.
      # 연결을 끊습니다.
      @connection.send(:socket).닫기 구출 nil
    end
  end
  super. do
    @ 락.동기화 do
      만약 @connection
        @connection.연결 해제!
        @connection = nil
      end
    end
  end
end

#to_s객체

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

이후:

  • 2.0.0



199
200
201
# 파일 'build/ruby-driver-v2.19/lib/mongo/server/push_monitor.rb', 줄 199

def to_s
  "#<#{self.class.name}:#{object_id} #{서버.주소}>"
end

#write_check_command객체

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

이후:

  • 2.0.0



173
174
175
176
177
178
179
180
181
182
# 파일 'build/ruby-driver-v2.19/lib/mongo/server/push_monitor.rb', 줄 173

def write_check_command
  문서 = @check_document.merge(
    topologyVersion: topology_version.to_doc,
    maxAwaitTimeMS: 모니터.heartbeat_interval * 1000,
  )
  명령 = protocol::메시지.신규(
    [:exhaust_allowed], {}, 문서.merge({'$db' => Database::ADMIN})
  )
  @ 락.동기화 { @connection }.write_bytes(명령.직렬화.to_s)
end