Clase: Mongo::clúster::CursorReaper Privado
- Hereda:
-
Objeto
- Objeto
- Mongo::Cluster::CursorReaper
- Incluye:
- Reintentar
- Definido en:
- lib/mongo/clúster/reapers/cursor_reaper.rb
Overview
Esta clase forma parte de una API privada. Evita usar esta clase si es posible, ya que puede ser eliminada o modificada en el futuro.
Un administrador que envía operaciones de kill cursor a intervalos regulares para cerrar los cursores que han sido recolectados como basura sin agotarse.
Colapso delresumen constante
- FRECUENCIA =
Esta constante forma parte de una API privada. Debe evitar usarla siempre que sea posible, ya que podría eliminarse o modificarse en el futuro.
El intervalo de tiempo por defecto para que el limpiador de cursor envíe operaciones pendientes para terminar cursores.
1.freeze
Resumen de atributos de la instancia colapsar
- #cluster ⇒ Object Solo lectura privado
Resumen del método de instancia colapsar
-
#initialize(cluster) ⇒ CursorReaper
constructor
privado
Crea un recolector de cursor.
-
#kill_cursors ⇒ Object (también: #execute, #flush)
privado
Ejecutar todas las operaciones pendientes de cierre de cursores.
-
#read_scheduled_kill_specs ⇒ Objeto
privado
Leer y decodificar las operaciones de cierre de cursores programadas.
-
#register_cursor(id) ⇒ Object
privado
Registrar un ID de cursor como activo.
-
#schedule_kill_cursor(kill_spec) ⇒ Objeto
privado
Programar una operación de kill cursors para que se ejecute eventualmente.
-
#unregister_cursor(id) ⇒ Object
privado
Cancelar el registro de un id de cursor, indicando que ya no está activo.
Métodos incluidos en Retryable
#read_worker, #select_server, #write_worker
Detalles del constructor
#initialize(cluster) ⇒ CursorReaper
Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.
Crea un recolector de cursor.
42 43 44 45 46 47 48 |
# Archivo 'lib/mongo/cluster/reapers/cursor_reaper.rb', línea 42 def inicializar(clúster) @cluster = clúster @to_kill = {} @active_cursor_ids = Configura.Nuevo @mutex = Mutex (exclusión mutua).Nuevo @kill_spec_queue = Queue.Nuevo end |
Detalles de los atributos de instancia
#clúster ⇒ Objeto (solo lectura)
Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.
50 51 52 |
# Archivo 'lib/mongo/cluster/reapers/cursor_reaper.rb', línea 50 def clúster @cluster end |
Detalles del método de instancia
#kill_cursors ⇒ objeto También conocido como: execute, flush
Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.
Ejecutar todas las operaciones pendientes de cierre de cursores.
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 206 207 208 209 210 |
# Archivo 'lib/mongo/cluster/reapers/cursor_reaper.rb', línea 133 def matar_cursores # TODO optimizar esto para agrupar las operaciones de finalización de cursor para el mismo # servidor/base de datos/colección en lugar de terminar cada cursor # individualmente. bucle hacer dirección del servidor = nulo especificación de muerte = @mutex.sincronizar hacer read_scheduled_kill_specs # Encuentra un servidor que tenga cualquier cursor programado para destrucción. dirección del servidor, especificaciones = @to_kill.detectar { |_, especificaciones| especificaciones.any? } si especificaciones.nil? # Todos los servidores tienen especificaciones vacías, no hay nada que hacer. return end # Ten en cuenta que esto muta el spec en la cola. # Si la operación de matar el cursor falla, no intentamos # mata ese cursor de nuevo. especulación = especificaciones.tomar(1).tocar hacer |arr| especificaciones.sustraer(arr) end.primero a menos que @active_cursor_ids.incluir?(especulación.cursor_id) # El cursor ya se ha eliminado, generalmente porque ha # se ha iterado hasta completarse. Remover la especificación kill de # nuestros registros sin realizar ningún trabajo adicional. especulación = nulo end especulación end # Si había una especificación a eliminar pero ya se había eliminado su cursor, # busque otra especificación. siguiente a menos que especificación de muerte # También podríamos pasar kill_spec directamente a KillCursors # operación, aunque esto haría que dicha operación tenga un # API diferente a todas las demás que aceptan hashes. especulación = { cursor_ids: [especificación de muerte.cursor_id], nombre_coll: especificación de muerte.nombre_coll, nombre_base_datos: especificación de muerte.db_name, } op = Operación::killCursors.Nuevo(especulación) Server = clúster.servidores.detectar hacer |Server| Server.dirección == dirección del servidor end a menos que Server # TODOV Actualmente no contamos con un servidor para la dirección que # cursor está asociado a. Deberíamos dejar el cursor en la # cola para ser eliminada más tarde (cuando el servidor vuelva a estar en línea). siguiente end = { server_api: Server.[API del servidor], id_global_de_conexión: especificación de muerte.connection_global_id, } si Conexión = especificación de muerte.Conexión op.ejecutar_con_conexión(Conexión, context: Operación::Context.Nuevo(opciones: )) Conexión.grupo de conexiones.registrar(Conexión) else op.ejecutar(Server, context: Operación::Context.Nuevo(opciones: )) end si sesión = especificación de muerte.sesión si sesión.implicit? sesión.fin_sesión end end end end |
#read_scheduled_kill_specs ⇒ objeto
Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.
Leer y decodificar las operaciones de cierre de cursores programadas.
Este método muta las variables de instancia sin bloqueo, por lo que no es seguro para subprocesos. En general, no debe llamarse a sí mismo, esto es un asistente para el método ‘kill_cursor`.
114 115 116 117 118 119 120 121 122 123 |
# Archivo 'lib/mongo/cluster/reapers/cursor_reaper.rb', línea 114 def read_scheduled_kill_specs mientras especificación de muerte = @kill_spec_queue.pop(true) si @active_cursor_ids.incluir?(especificación de muerte.cursor_id) @to_kill[especificación de muerte.dirección del servidor] ||= Configura.Nuevo @to_kill[especificación de muerte.dirección del servidor] << especificación de muerte end end rescate ErrorDeHilo # Cola vacía, nada que hacer. end |
#register_cursor(id) ⇒ objeto
Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.
Registrar un ID de cursor como activo.
71 72 73 74 75 76 77 78 79 80 81 82 |
# Archivo 'lib/mongo/cluster/reapers/cursor_reaper.rb', línea 71 def register_cursor(ID) si ID.nil? propagar ArgumentError, 'register_cursor llamado con cursor_id nulo' end si ID == 0 propagar ArgumentError, 'register_cursor llamado con cursor_id=0 ' end @mutex.sincronizar hacer @active_cursor_ids << ID end end |
#schedule_kill_cursor(kill_spec) ⇒ Objeto
Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.
Programar una operación de kill cursors para que se ejecute eventualmente.
57 58 59 |
# Archivo 'lib/mongo/cluster/reapers/cursor_reaper.rb', línea 57 def schedule_kill_cursor(especificación de muerte) @kill_spec_queue << especificación de muerte end |
#unregister_cursor(id) ⇒ Object
Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.
Cancelar el registro de un id de cursor, indicando que ya no está activo.
94 95 96 97 98 99 100 101 102 103 104 105 |
# Archivo 'lib/mongo/cluster/reapers/cursor_reaper.rb', línea 94 def unregister_cursor(ID) si ID.nil? propagar ArgumentError, 'unregister_cursor se llamó con un cursor_id nulo' end si ID == 0 propagar ArgumentError, 'unregister_cursor llamado con cursor_id=0 ' end @mutex.sincronizar hacer @active_cursor_ids.borrar(ID) end end |