|
|
Últimos Cambios |
|
|
|
||
| Mi estado actual
en Jabber/XMPP:
| |||
Última Actualización: 05 de Abril de 2004 - Lunes
Aunque el objetivo final es implementar un esquema distribuido, para acelerar el nacimiento de la red se ha empezado por utilizar un esquema centralizado empleando las facilidades proporcionadas por los servidores IRCd de Undernet.
En estos momentos los nodos de control son:
Las operaciones que cubren esos nodos son:
Estas transacciones ligeras se utilizan, por ejemplo, para cosas como actualizar la fecha de la última conexión de un usuario. No importa que perdamos alguna actualización de vez en cuando, si a cambio ganamos rendimiento. También se utilizan para la fecha de último uso de "I-lines". Esto es especialmente interesante cuando nos llega un "burst" de un nuevo nodo, por ejemplo.
Un buffer mayor tiene la ventaja adicional de que su volcado a disco es más eficiente.
No nos importa que la transacción sea "ACI", porque estamos guardando el record también en el histórico de conexiones y, además, la base de datos se actualizará definitivamente y con certeza cuando se realice un "Group Commiting" al finalizar la siguiente transacción que sea "ACID", o bien que se llene el buffer de logs de transacciones.
Hago cambios en el sistema para tratar la base de datos en cuestión de forma persistente, al igual que ya se hace con la base de datos de clones ("I-lines"). Este cambio incluso simplifica código.
No es necesario proteger el listado de módulos porque no realiza cambios en las estructuras.
No es necesario proteger la instalación de un nuevo handler de IRQs porque ese proceso se realiza desde el thread principal, y su hipotética activación (del nuevo handler) también se realiza desde el thread principal, así que nunca nos lo encontraremos en estado inconsistente.
No es necesario proteger la invocación de las IRQs pendientes por el mismo punto que el anterior, y porque su flag está marcado como "volatile". Si el thread principal pasa sobre un módulo sin IRQ pendiente y, mientras se revisan el resto de módulos, llega un IRQ para elmódulo ya visto, el thread principal lo procesará en su siguiente repaso de IRQs pendientes.
En especial, durante la carga de un módulo y antes de la llamada a su rutina "inicio()", hay que marcarlo como "modulo_actual". En caso contrario, "Olimpo.nombre_modulo()", si se llama de forma implícita al cargar el módulo y antes de "inicio()", nos devolverá el nombre del último módulo ejecutado, no del módulo actual.
Una vez identificado el problema, veo que está bastante documentado en Internet:
Defino macros "ENTER_PYTHON", "ENTER_PYTHON2", "EXIT_PYTHON" y "EXIT_PYTHON2", que distribuyo por el código, para lograr un threading mucho más fino y eficiente.
Los cambios que hay que hacer en el código son bastante extensos.
Estas funciones completan el sistema IPC, posibilitando la publicación y el descubrimiento de objectos Python.
Los cambios son muy amplios, ya que se ven afectadas numerosas rutinas y estructuras de datos.
Esto supone cambios masivos en dicho módulo, y cambios también en el resto de Olimpo.
Es importante recordar que dichos cambios NO serán seguidos por Olimpo. Osea, que Olimpo no los ve.
El problema ha sido el despliegue de dos parches incompatibles en Olimpo y en formulario de alta de I-lines.
Aquí tenemos el primer problema: Olimpo tendrá usuarios que, en realidad, ya no existe en el sistema.
Una vez aclarado el problema, existen varias posibilidades:
Actualmente Olimpo comprueba, mediante un "assert()" que solo se envíen registros con flujo abierto. Pero eso lo hace internamente. La ampliación del API permite que un módulo realice esas comprobaciones por sí mismo.
Mantengo el orden, pero la baja efectiva de los nodos se realiza DESPUÉS de enviar las notificaciones de nicks. Y antes de eso se envían las notificaciones de salida de los nodos, aunque no se eliminan de las estructuras de datos internas hasta el final.
Con el cambio realizado, arrancar Olimpo se limita a eliminar manualmente el registro de la base de datos que contiene esta tabla de control.
Pongo un tamaño de 8192 bytes a los "dbuf". El servidor realiza las gestiones apropiadas si una escritura sobrepasa dicho valor.
Me reviso con lupa las rutinas de descarga de módulos:
Modifico Olimpo para soslayar este problema.
El instante de arranque que Olimpo comunicaba al resto de la red era incorrecto. Solucionado.
El primer caso es para los métodos y funciones sin parámetros. El segundo caso es para los métodos y funciones cuyo parámetro es un (único) objeto.
Así, debo "sincronizar" entre threads las llamadas a "ctime_r()".
Además, esta capacidad debería implementarse en un módulo externo, no en el "core".