类:Mongo::Server::PushMonitor Private

继承:
对象
  • 对象
显示全部
扩展方式:
可转发
包括:
背景线程
定义于:
build/Ruby-driver-v 2.19 /lib/mongo/server/push_monitor.rb ,
build/Ruby-driver-v 2.19 /lib/mongo/server/push_monitor/connection.rb

Overview

此类是私有 API 的一部分。 应尽可能避免使用此类,因为它将来可能会被删除或更改。

利用服务器推送的 hello 请求的监视器。

当监控器与4.4 + 服务器握手时,它会创建一个 PushMonitor 实例。 PushMonitor 随后执行服务器推送的 hello(即 已等待并耗尽 hello)以尽快从服务器接收拓扑更改。 监控器仍会监控服务器的往返时间计算,并根据应用程序的请求立即执行检查。

由于:

  • 2.0.0

在命名空间下定义

类: 连接

常量摘要

Loggable中包含的常量

Loggable::PREFIX

实例属性摘要折叠

实例方法摘要折叠

包含在BackgroundThread中的方法

# 运行! , # 运行?

Loggable中包含的方法

#log_debug#log_error#log_ Fatal#log_info#log_warn#logger

构造函数详情

#initialize (监控,topology_version, 监控,**options) ⇒ PushMonitor

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

返回 PushMonitor 的新实例。

由于:

  • 2.0.0



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'build/Ruby-driver-v 2.19 /lib/mongo/server/push_monitor.rb', 第35行

def 初始化(监控, topology_version, 监控, **选项)
  if topology_version.nil?
    提高 ArgumentError, 必须提供拓扑版本,但它为零
  end
  除非 选项[:app_metadata]
    提高 ArgumentError, ' App 元数据 is required '
  end
  除非 选项[:check_document]
    提高 ArgumentError, '检查文档是否为必填项'
  end
  @app_metadata = 选项[:app_metadata]
  @check_document = 选项[:check_document]
  监控 = 监控
  @topology_version = topology_version
  @monitoring = 监控
  @options = 选项
   = 互斥锁.new
end

实例属性详细信息

#监控服务器(只读)

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

返回 正在监控的服务器。

返回:

由于:

  • 2.0.0



55
56
57
# File 'build/Ruby-driver-v 2.19 /lib/mongo/server/push_monitor.rb', 第55行

def 监控
  监控
end

# Monitoring监控(只读)

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

返回监控 监控。

返回:

  • (监控)

    监控 监控。

由于:

  • 2.0.0



61
62
63
# File 'build/Ruby-driver-v 2.19 /lib/mongo/server/push_monitor.rb', 第61行

def 监控
  @monitoring
end

# options哈希(只读)

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

返回推送监视器选项。

返回:

  • (哈希)

    推送监控选项。

由于:

  • 2.0.0



64
65
66
# File 'build/Ruby-driver-v 2.19 /lib/mongo/server/push_monitor.rb', 第64行

def 选项
  @options
end

# topology_version =" TopologyVersion " (只读)

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

返回最近收到的拓扑版本。

返回:

由于:

  • 2.0.0



58
59
60
# File 'build/Ruby-driver-v 2.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
# File 'build/Ruby-driver-v 2.19 /lib/mongo/server/push_monitor.rb', 第137行

def 检查
  .同步 do
    if @connection && @connection.进程 ID (PID) != 处理.进程 ID (PID)
      log_warn("检测到PID更改 - mongo客户端应已重新连接(旧PID #{ @connection . PID } ,新PID #{ Process . PID } ")
      @connection.断开连接!
      @connection = nil
    end
  end

  .同步 do
    除非 @connection
      @server_pushing = false
      连接 = PushMonitor::连接.new(server.地址, 选项)
      连接.连接!
      @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_come)
  结果 = 操作::结果.new(resp_msg)
  结果.validate!
  结果.文档.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
# File 'build/Ruby-driver-v 2.19 /lib/mongo/server/push_monitor.rb', 第94行

def do_work
  .同步 do
    return if @stop_requested
  end

  结果 = 监控.publish_heartbeat(server, 等待: true) do
    检查
  end
  new_description = 监控.run_sdam_flow(结果, 等待: true)
  # 当 hello 由于故障点而失败时,响应不会
  # include 拓扑版本。 在这种情况下,我们需要保留现有的
  #拓扑结构版本,以便我们可以恢复监控。
  # 该规范似乎并未直接解决这种情况,但
  # https://github.com/mongodb/species/blob/master/source/server-discovery-and-monitoring/server-monitoring.rst#streaming-ismaster
  # 表示拓扑版本只能在成功更新
  # hello 响应。
  if new_description.topology_version
    @topology_version = new_description.topology_version
  end
救援 IOError, SocketError, SystemCallError, mongo::错误 => 排除
  stop_requested = .同步 { @stop_requested }
  if stop_requested
    # 忽略异常,请参阅 RUBY- 2771 。
    return
  end

  msg = " Error 运行 awaited hello on #{ 服务器.address} "
  Utils.warn_bg_Exception(msg, 排除,
    记录器: 选项[:logger],
    log_prefix: 选项[:log_prefix],
    bg_error_backtrace: 选项[:bg_error_backtrace],
  )

  # 如果连接请求失败,则停止推送监控。
  # 如果服务器死机,我们不希望有两个连接
  # 同时尝试连接但未成功。
  停止!

  # 请求立即检查监控以将其恢复为
  # 尽快,以防服务器实际处于活动状态。
  server.scan_semaphore.信号
end

# read_response对象

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

由于:

  • 2.0.0



184
185
186
187
188
189
190
191
192
193
194
195
196
197
# File 'build/Ruby-driver-v 2.19 /lib/mongo/server/push_monitor.rb', 第184行

def read_response
  if 超时 = 选项[:connect_timeout]
    if 超时 < 0
      提高 mongo::SocketTimeoutError, "请求使用负超时读取: #{ } "
    elsif 超时 > 0
      超时 += 选项[:heartbeat_Frequency] || 监控::DEFAULT_HEARTBEAT_INTERVAL
    end
  end
  # 我们设立超时设置两次:一次是传递给适用的 read_socket
  # 到每个单独的读取操作,然后再到整个读取。
  超时.超时(超时, 错误::SocketTimeoutError, "未能在#{ timeout }秒内读取等待的 hello 响应") do
    .同步 { @connection }.read_response(socket_timeout: 超时)
  end
end

# start!对象

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

由于:

  • 2.0.0



69
70
71
72
73
# File 'build/Ruby-driver-v 2.19 /lib/mongo/server/push_monitor.rb', 第69行

def 开始!
  .同步 do
    
  end
end

# stop!对象

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

由于:

  • 2.0.0



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'build/Ruby-driver-v 2.19 /lib/mongo/server/push_monitor.rb', 第75行

def 停止!
  .同步 do
    @stop_requested = true
    if @connection
      # 中断任何正在进行的耗尽 hello 读取
      # 断开连接。
      @connection.发送(:socket).关闭 救援 nil
    end
  end
  .点击 do
    .同步 do
      if @connection
        @connection.断开连接!
        @connection = nil
      end
    end
  end
end

# to_s对象

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

由于:

  • 2.0.0



199
200
201
# File 'build/Ruby-driver-v 2.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
# File 'build/Ruby-driver-v 2.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::消息.new(
    [:exhaust_allowed], {}, 文档.合并(merge)({' $db ' => Database::ADMIN})
  )
  .同步 { @connection }.write_bytes(命令.序列化.to_s)
end