Clase: Mongo::clúster::CursorReaper Privado
- Hereda:
-
Objeto
- Objeto
- Mongo::clúster::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.
Resumen de constantes colapsar
- FRECUENCIA =
Esta constante es parte de una API privada. Deberías evitar usar esta constante si es posible, ya que podría ser retirada o cambiada en el futuro.
El intervalo de tiempo por defecto para que el limpiador de cursor envíe operaciones pendientes para terminar cursores.
1
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) ⇒ Object
privado
Programar una operación de kill cursors para que se ejecute eventualmente.
-
#unregister_cursor(id) ⇒ Object
privado
Darse de baja de un id de cursor, indicando que ya no está activo.
Métodos incluidos de Retryable
#read_worker, #select_server, #with_overload_retry, #write_worker
Detalles del Constructor
#initialize(cluster) ⇒ CursorReaper
Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.
Crea un recolector de cursor.
39 40 41 42 43 44 45 |
# Archivo 'lib/mongo/cluster/reapers/cursor_reaper.rb', línea 39 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 atributo de instancias
#clúster ⇒ Objeto (solo lectura)
Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.
47 48 49 |
# Archivo 'lib/mongo/cluster/reapers/cursor_reaper.rb', línea 47 def clúster @cluster end |
Detalles del método de instancia
#kill_cursors ⇒ objeto También conocido como: execute, flush
Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.
Ejecutar todas las operaciones pendientes de cierre de cursores.
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 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 |
# Archivo 'lib/mongo/cluster/reapers/cursor_reaper.rb', línea 126 def kill_cursors # TODO: optimizar esto para operaciones batch kill cursor para el mismo # servidor/base de datos/colección en lugar de terminar cada cursor # individualmente. bucle hacer server_address = nulo kill_spec = @mutex.sincronizar hacer read_scheduled_kill_specs # Encuentra un servidor que tenga cualquier cursor programado para destrucción. server_address, especificaciones = @to_kill.detectar { |_, especificaciones| especificaciones.any? } si especificaciones.nil? # Todos los servidores tienen especificaciones vacías, nada que hacer. return end # Ten en cuenta que esto muta el spec en la cola. # Si la operación kill cursor falla, no intentamos # mata ese cursor de nuevo. especificación = especificaciones.tomar(1).tocar hacer |arr| especificaciones.sustraer(arr) end.primero a menos que @active_cursor_ids.incluir?(especificació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. especificación = nulo end especificación end # Si había una especificación a eliminar pero ya se había eliminado su cursor, # busca otra especificación. Next a menos que kill_spec # 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. especificación = { cursor_ids: [ kill_spec.cursor_id ], coll_name: kill_spec.coll_name, db_name: kill_spec.db_name, } op = Operación::killCursors.Nuevo(especificación) Server = clúster.servidor.detectar hacer |Server| Server.dirección == server_address end a menos que Server # El servidor para este cursor se ha desconectado --- quizás temporalmente, # tal vez permanentemente, pero no lo podemos saber. Para evitar conexiones desde # fuga en caso de una falla permanente, simplemente lo haremos en silencio # descarta esta especificación de eliminación y sigue adelante. Next end = { server_api: Server.[API del servidor], connection_global_id: kill_spec.connection_global_id, } si Conexión = kill_spec.Conexión op.execute_with_connection(Conexión, context: Operación::Context.Nuevo(opciones: )) Conexión.connection_pool.registrar(Conexión) else op.ejecutar(Server, context: Operación::Context.Nuevo(opciones: )) end Next a menos que sesión = kill_spec.sesión sesión.end_session si sesión.implicit? end end |
#read_scheduled_kill_specs ⇒ objeto
Este método es parte de una API privada. Se debe evitar el uso de este método 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 manipula variables de instancia sin bloqueo, por lo que no es seguro para hilos. En general, no debería llamarse a sí mismo, esto es un asistente para el método kill_cursor.
103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
# Archivo 'lib/mongo/cluster/reapers/cursor_reaper.rb', línea 103 def read_scheduled_kill_specs mientras kill_spec = @kill_spec_queue.pop(true) si @active_cursor_ids.incluir?(kill_spec.cursor_id) @to_kill[kill_spec.server_address] ||= Configura.Nuevo @to_kill[kill_spec.server_address] << kill_spec elsif (sesión = kill_spec.sesión) && sesión.implicit? # El cursor ya estaba cerrado; terminar la sesión inmediatamente para liberar # referencias en lugar de esperar que kill_spec quede fuera de alcance. sesión.end_session end end rescate ErrorDeHilo # Cola vacía, nada que hacer. end |
#register_cursor(id) ⇒ objeto
Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.
Registrar un ID de cursor como activo.
68 69 70 71 72 73 74 75 |
# Archivo 'lib/mongo/cluster/reapers/cursor_reaper.rb', línea 68 def register_cursor(ID) propagar ArgumentError, 'register_cursor llamado con cursor_id nulo' si ID.nil? propagar ArgumentError, 'register_cursor llamado con cursor_id=0' si ID == 0 @mutex.sincronizar hacer @active_cursor_ids << ID end end |
#schedule_kill_cursor(kill_spec) ⇒ Object
Este método es parte de una API privada. Se debe evitar el uso de este método 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.
54 55 56 |
# Archivo 'lib/mongo/cluster/reapers/cursor_reaper.rb', línea 54 def schedule_kill_cursor(kill_spec) @kill_spec_queue << kill_spec end |
#unregister_cursor(id) ⇒ Object
Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.
Darse de baja de un id de cursor, indicando que ya no está activo.
87 88 89 90 91 92 93 94 |
# Archivo 'lib/mongo/cluster/reapers/cursor_reaper.rb', línea 87 def unregister_cursor(ID) propagar ArgumentError, 'unregister_cursor se llamó con un cursor_id nulo' si ID.nil? propagar ArgumentError, 'unregister_cursor llamado con cursor_id=0' si ID == 0 @mutex.sincronizar hacer @active_cursor_ids.borrar(ID) end end |