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

Evitar revisar ficheros de los que somos "seed"

Última Actualización: 15 de enero de 2009 - Jueves

Cuando cerramos una sesión de BitTornado, el programa almacena en disco información sobre cada uno de los torrents en servicio. Estos datos permiten que BitTornado arranque rápidamente, ya que sabe qué torrents ya tiene completos y cuál es el estado de los torrents parciales. Lamentablemente, si el programa muere de forma abrupta (por ejemplo, porque se va la luz), dicha caché no existe, y el siguiente lanzamiento de BitTornado será muy lento porque tiene que revisar la consistencia de, potencialmente, cientos de ficheros de torrent y sus ficheros de datos asociados.

BitTornado almacena esta información de caché al terminar, y la recarga al ser reiniciado. Durante dicha recarga elimina esos datos de disco, ya que cualquier actualización de un torrent incompleto invalida dicha información, y es peligroso depender de datos anticuados. El problema es que esta invalidación afecta también a los torrents que ya tenemos completos (somos "seed") que, por definición, no van a cambiar. No sería necesario eliminar esa información del disco duro, y el mantenerla en él nos permite disponer de ella aunque la instancia actual de BitTornado se corte de forma abrupta, sin tener ocasión de almacenar la información de caché actualizada.

Otro cambio simple e interesante es almacenar inmediatamente en disco la información de caché en cuanto se completa un torrent, en vez de esperar a la grabación completa de toda la caché cuando el programa termina de forma correcta.

En resumen:

  • Los torrents de los que somos "seed" no necesitan validarse de nuevo, INCLUSO aunque la instancia de BitTornado actual muera de forma abrupta.

  • Cuando se completa un torrent, almacenamos ya su caché en disco, para evitar tener que revisar el fichero en caso de caída de BitTornado. Es decir, no esperamos a la grabación final completa de la caché.

  • Debido a los puntos anteriores, un arranque de BitTornado no necesita revisar de nuevos los torrents "seed", aunque la instancia anterior haya muerto de forma abrupta. En dicho caso sólo habrá que revisar los torrents parciales. Si la instancia anterior terminó de forma correcta, los datos "cacheados" nos permiten no tener que revisar nada.

El parche es el siguiente:

Index: BitTornado/launchmanycore.py
===================================================================
--- BitTornado/launchmanycore.py        (revision 9)
+++ BitTornado/launchmanycore.py        (revision 11)
@@ -137,6 +137,7 @@

     def finished(self):
         self.seed = True
+        self.d.finished()

     def error(self, msg):
         if self.doneflag.isSet():
Index: BitTornado/download_bt1.py
===================================================================
--- BitTornado/download_bt1.py  (revision 9)
+++ BitTornado/download_bt1.py  (revision 11)
@@ -325,6 +325,8 @@
         self.rawserver = rawserver
         self.port = port

+        self.completado = False
+
         self.info = self.response['info']

         if "length" in self.info :
@@ -645,7 +647,8 @@
                     self._reqmorefunc, self.rerequest_ondownloadmore)
             if self.priority:
                 self.fileselector.set_priorities_now(self.priority)
-            self.appdataobj.deleteTorrentData(self.infohash)
+            if not self.completado :
+                self.appdataobj.deleteTorrentData(self.infohash)
                                 # erase old data once you've started modifying it

         if self.config['super_seeder']:
@@ -742,6 +745,15 @@
     def getPortHandler(self):
         return self.encoder

+    def finished(self, torrentdata = {}) :
+        self.completado = True
+        if self.fileselector :
+            if not self.failed :
+               torrentdata['resume data'] = self.fileselector.pickle()
+           try:
+               self.appdataobj.writeTorrentData(self.infohash,torrentdata)
+           except :
+                pass

     def shutdown(self, torrentdata = {}):
         if self.checking or self.started:

Este parche realiza las dos operaciones propuestas: por un lado, cuando se carga un torrent desde la caché no se elimina de la misma si lo tenemos completo (somos "seed") y, por otro lado, actualizamos al momento la caché para los torrents que vamos completando, en vez de esperar a finalizar el programa adecuadamente.

Con este cambio, BitTornado no necesita revisar los torrents "seed", aunque haya terminado de forma abrupta.

Como detalle curioso, el parche refresca el fichero de caché en disco cuando somos "seed", a medida que se va arrancando el programa. Esto hace que su fecha se mantenga "fresca", lo que resulta útil cuando llega la hora de expirar viejos datos de la caché.


Historia

  • 15/ene/09: Primera versión de esta página.



Python Zope ©2009 jcea@jcea.es

Más información sobre los OpenBadges

Donación BitCoin: 19niBN42ac2pqDQFx6GJZxry2JQSFvwAfS