类:Mongo::Cluster::CursorReaper Private
- 继承:
-
对象
- 对象
- Mongo::Cluster::CursorReaper
- 包括:
- 可重试
- 定义于:
- build/Ruby-driver-v 2.19 /lib/mongo/cluster/reapers/cursor_reaper.rb
Overview
此类是私有 API 的一部分。 应尽可能避免使用此类,因为它将来可能会被删除或更改。
一种管理器,它会定期发送终止游标操作,以关闭已进行垃圾收集但未耗尽的游标。
常量摘要折叠
- FREQUENCY =
此常量是私有 API 的一部分。 应尽可能避免使用此常量,因为它将来可能会被删除或更改。
游标回收器发送待处理终止游标操作的默认时间间隔。
1.冻结
实例属性摘要折叠
- # cluster ⇒ 对象 只读 private
实例方法摘要折叠
-
#initialize(cluster) ⇒ CursorReaper
构造函数
private
创建游标收割器。
-
# kill_cursors ⇒ 对象(也:#execute、#flush)
private
执行所有待处理的终止游标操作。
-
# read_scheduled_kill_specs ⇒ 对象
private
读取并解码计划的终止游标操作。
-
#register_cursor ( ID ) ⇒ 对象
private
将游标ID 注册为活动游标。
-
# schedule_kill_cursor (kill_spec) ⇒ 对象
private
安排最终执行的终止游标操作。
-
# unregister_cursor ( ID ) ⇒ 对象
private
取消注册游标 ID,表示其不再处于活动状态。
Retryable 中包含的方法
#read_worker 、 #select_server 、 #write_worker
构造函数详情
#初始化(集群) ⇒ CursorReaper
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
创建游标收割器。
42 43 44 45 46 47 48 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/cluster/reapers/cursor_reaper.rb', 第42行 def 初始化(集群) @cluster = 集群 @to_kill = {} @active_cursor_ids = 集.new @mutex = 互斥锁.new @kill_spec_queue = 队列.new end |
实例属性详细信息
# cluster ⇒对象(只读)
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
50 51 52 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/cluster/reapers/cursor_reaper.rb', 第50行 def 集群 @cluster end |
实例方法详细信息
# kill_cursors ⇒ Object也称为: execute 、 flush
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
执行所有待处理的终止游标操作。
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 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/cluster/reapers/cursor_reaper.rb', 第133行 def kill_cursors # TODO 优化此项以批处理终止游标操作 # 服务器/ 数据库/ 集合而不是终止每个游标 # 单独。 循环 do server_address = nil kill_spec = @mutex.同步 do read_scheduled_kill_specs # 查找有计划销毁游标的服务器。 server_address, specs = @to_kill.检测 { |_, specs| specs.任何? } if specs.nil? # 所有服务器都有空规范,无需执行任何操作。 return end # 请注意,这会改变队列中的规范。 # 如果终止游标操作失败,我们不会尝试 # 再次终止该游标。 spec = specs.采取(1).点击 do |位址再呼叫暂存器 (ARR)| specs.减去(位址再呼叫暂存器 (ARR)) end.first 除非 @active_cursor_ids.包括?(spec.cursor_id) # 游标已被终止,通常是因为它已 # 已迭代完成。 从中删除终止规范 # 我们的记录,无需执行任何其他工作。 spec = nil end spec end # 如果有一个规范要终止,但其游标已被终止, # 查找另一个规范。 来年 除非 kill_spec # 我们还可以将 kill_spec 直接传递到 KillCursors # 操作,尽管这会使该操作具有 # 与所有其他接受哈希值的 API 不同的 API。 spec = { cursor_id: [kill_spec.cursor_id], coll_name: kill_spec.coll_name, db_name: kill_spec.db_name, } op = 操作::killCursors.new(spec) server = 集群.服务器.检测 do |server| server.地址 == server_address end 除非 server # TODO 我们目前没有用于该解决的服务器 # 游标关联于。 我们应该将游标留在 # 队列稍后(当服务器恢复时)被终止。 来年 end = { server_api: server.[:server_api], connection_global_id: kill_spec.connection_global_id, } op.执行(server, 上下文: 操作::上下文.new(选项: )) if 会话 = kill_spec.会话 if 会话.隐式? 会话.end_session end end end end |
# read_scheduled_kill_specs ⇒对象
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
读取并解码计划的终止游标操作。
此方法无需锁定即可更改实例变量,因此不是线程安全的。 一般来说,它不应被称为自身,这是“kill_cursor”方法的辅助方法。
114 115 116 117 118 119 120 121 122 123 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/cluster/reapers/cursor_reaper.rb', 第114行 def read_scheduled_kill_specs while kill_spec = @kill_spec_queue.Pop(true) if @active_cursor_ids.包括?(kill_spec.cursor_id) @to_kill[kill_spec.server_address] ||= 集.new @to_kill[kill_spec.server_address] << kill_spec end end 救援 ThreadError # 清空队列,无需执行任何操作。 end |
#register_cursor ( ID ) ⇒对象
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
将游标ID 注册为活动游标。
71 72 73 74 75 76 77 78 79 80 81 82 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/cluster/reapers/cursor_reaper.rb', 第71行 def register_cursor(id) if id.nil? 提高 ArgumentError, '用 nil cursor_id 调用register_cursor ' end if id == 0 提高 ArgumentError, '用 cursor_id= 0调用了register_cursor ' end @mutex.同步 do @active_cursor_ids << id end end |
# schedule_kill_cursor (kill_spec) ⇒对象
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
安排最终执行的终止游标操作。
57 58 59 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/cluster/reapers/cursor_reaper.rb', 第57行 def schedule_kill_cursor(kill_spec) @kill_spec_queue << kill_spec end |
#unregister_cursor(id) ⇒ Object
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
取消注册游标 ID,表示其不再处于活动状态。
94 95 96 97 98 99 100 101 102 103 104 105 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/cluster/reapers/cursor_reaper.rb', 第94行 def unregister_cursor(id) if id.nil? 提高 ArgumentError, ' unregister_cursor Called with nil cursor_id ' end if id == 0 提高 ArgumentError, ' unregister_cursor 使用 cursor_id= 0调用' end @mutex.同步 do @active_cursor_ids.删除(id) end end |