Member of The Internet Defense League Últimos cambios
Últimos Cambios
Blog personal: El hilo del laberinto Geocaching

Módulo ChanFollower

Última Actualización: 25 de Junio de 2002 - Martes

El objetivo de este módulo es hacer un seguimiento de los canales del IRC. Está diseñado para proporcionar servicios a otros módulos, no directamente a la red. Un módulo externo, por ejemplo, puede pedir a éste que le avise cuando hay un cambio de topic en un canal determinado.

Este módulo permite:

  • Desplegar servicios que interactúan con canales, sin necesidad de hospedar todo un sistema de control de canales tipo el proyecto chan2.

  • Permitir recargar módulos sin perder el conocimiento del estado de los canales.

  • Monitorizar determinados cambios en el estado de los canales: entrada y salida de usuarios, cambios de topic, cambios de modos...

  • Poder realizar operaciones sobre los canales sin tener que preocuparnos de la implementación real: expulsar usuarios de un canal, cambiar modos, etc.


Historia

Los números de versión que se indican se refieren a "commit" en el CVS interno. El número de versión cargado en Olimpo en un momento dado es visible usando el comando "dllist".

  • 21/Jun/02 Versión 1.21

    • Gestiona los JOIN.

    • Gestiona los PART.

    • Gestiona los KICK.

    • Gestiona la salida de un usuario de la red.

  • 25/Jun/02 Versión 1.34

    • Gestiona los CREATE.

    • Gestiona los BURST.

    • Gestiona apropiadamente la existencia de canales globales pero que no gestionamos, como los "+". De hecho SOLO gestionamos los canales "#".

    • Meto todos los comandos bajo "TRY...EXCEPT...", para poder diagnosticar mejor cualquier problema. Si salta una excepción, se propaga, pero primero imprimimos información útil de depuración.

    • Cuando se hacía un KICK a un usuario, o el usuario hace un PART, y el canal en cuestión era el último canal del usuario, el usuario podía permanecer como "Zombie" en las estructuras internas.

      Este problema no era grave porque:

      • El usuario se elimina correctamente cuando se va del IRC, por lo que ningún usuario permanece como "Zombie" de forma indefinida.

      • Si el usuario entra en algún canal nuevo, se gestiona correctamente.

      En este sentido la pérdida de memoria es mínima. Se trata de una corrección más estética que otra cosa. Detecté el problema porque este módulo decía que tenía más usuarios conectados que los que tiene conectada la red de IRC...

  • 27/Jun/02 Versión 1.42

    • Si un usuario que no está en ningún canal, intenta entrar en un canal que no controlamos (los que NO empiezan por "#", como los "+" o canales sin modos), se crearía ese usuario como "Zombie", de forma similar a como se ha documentado en la versión anterior.

      Nuevamente, ese usuario se elimina sin problemas cuando abandona la red. Tampoco existe ningún problema si el usuario, a posteriori, intenta entrar en otros canales.

    • Para evitar tener varios objetos equivalentes (por ejemplo, nombres de canales o handles), defino un sistema de singletons, para que solo exista una instancia de cada objeto, ya que son inmutables y tener varias copias del mismo objeto solo consume memoria.

      Por ejemplo, con la versión previa de chanfollower, una red con 35400 usuarios conectados, en 19931 canales, consumen 21.5 Megabytes.

      Minutos después, con la versión nueva de chanfollower, una red con 38000 usuarios conectados, en 20146 canales, consumen 20.7 Megabytes.

      Estas cifras están medidas reiniciando chanfollower, y procesando un BURST. A medida que la conexión progresa, pasan las horas y la gente entra y sale de los canales, el consumo de memoria de la versión actual es aproximadamente constante, y dependiente de la suma del número de usuarios y de canales, mientras que con la versión previa, en el peor de los casos, el consumo de memoria es proporcional también a la suma, pero multiplicada por el número medio de canales en los que está un usuario.

      A la larga, este factor multiplica por dos o tres (dependiendo de la media de canales por usuario) la ocupación de memoria, respecto a la nueva versión. Ese factor incluso crecería más a medida que se añadiesen nuevas funcionalidades, como seguimiento de modos o topics en canales.

  • 27/Jun/02 Versión 1.42

    • Las excepciones en Python son caras, porque construye un "traceback", etc., en memoria. Aunque es elegante usar excepciones para simplificar determinadas gestiones, resulta más eficiente realizar la gestión de forma explícita, a menos que la excepción sea muy esporádica.

    • Implemento soporte de topics.

    • Implemento soporte de modos en los canales.

    • El modo "+l" es especial, ya que se puede activar varias veces. Solucionado.



Python Zope ©2002 jcea@jcea.es

Más información sobre los OpenBadges

Donación BitCoin: 19niBN42ac2pqDQFx6GJZxry2JQSFvwAfS