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

Pausar las descargas, manteniendo su subida, cuando se llena el disco duro

Última Actualización: 11 de septiembre de 2011

El año pasado publiqué un parche para BitTornado que permite parar manualmente la descarga de un torrent manteniendo la subida activa. La idea era poder detener un torrent a media descarga, manteniendo su subida activa. Esto permite, por ejemplo, evitar llenar el disco duro, o subir nuestro SR (Share Ratio) sirviendo solo un trozo del fichero.

En esta ocasión publico un parche que detiene la descarga de TODOS los torrents, de forma automática, cuando se llena el disco duro. No hay que hacer nada manual. En cuanto el espacio en disco crece de nuevo, las descargas se reactivan otra vez.

Este parche es "compatible" con el anterior. Es decir, mantenemos la funcionalidad de parar la descarga de determinados torrents manualmente. Ambos parches son compatibles.

diff -r ea59da1098f3 BitTornado/download_bt1.py
--- a/BitTornado/download_bt1.py        Mon Jun 07 17:58:00 2010 +0200
+++ b/BitTornado/download_bt1.py        Sun Sep 11 18:26:59 2011 +0200
@@ -328,6 +328,7 @@
         self.completado = False
 
         self._download_pause = False
+        self._low_diskspace = False
 
         self.info = self.response['info']
 
@@ -377,9 +378,18 @@
 
     def download_pause(self, flag) :
         self._download_pause = flag
+        if self._low_diskspace == True : return
         if self.downloader is not None :
+            if flag != self.downloader.paused :
+                self.downloader.pause(flag)
+
+    def low_diskspace(self, flag) :
+        self._low_diskspace = flag
+        if (self._download_pause == False) and \
+           ((self.downloader is not None) and (self.downloader.paused != flag)) :
             self.downloader.pause(flag)
 
+
     def checkSaveLocation(self, loc):
         if self.info.has_key('length'):
             return path.exists(loc)
@@ -633,7 +643,7 @@
             self._kick_peer, self._ban_peer)
         self.downloader.set_download_rate(self.config['max_download_rate'])
 
-        if self._download_pause :
+        if self._download_pause or self._low_diskspace :
             self.downloader.pause(True)
 
         self.connecter = Connecter(self._make_upload, self.downloader, self.choker,
diff -r ea59da1098f3 BitTornado/launchmanycore.py
--- a/BitTornado/launchmanycore.py      Mon Jun 07 17:58:00 2010 +0200
+++ b/BitTornado/launchmanycore.py      Sun Sep 11 18:26:59 2011 +0200
@@ -195,6 +195,9 @@
             self.rawserver.add_task(self.scan, 0)
             self.rawserver.add_task(self.stats, 0)
 
+            self.low_diskspace = False
+            self.rawserver.add_task(self.check_diskspace, 1)           
+
             self.handler.listen_forever()
 
             self.Output.message('shutting down')
@@ -210,6 +213,21 @@
             Output.exception(data.getvalue())
 
 
+    def check_diskspace(self) :
+        self.rawserver.add_task(self.check_diskspace, 1)
+        vfs = os.statvfs(os.path.curdir)
+        diskspace = vfs.f_bsize * vfs.f_bavail
+        low_diskspace = diskspace < 25*1024*1024
+        if self.low_diskspace != low_diskspace :
+            self.low_diskspace = low_diskspace
+            if low_diskspace :
+                self.Output.message("Disco lleno. Pausando todas las descargas.")
+            else :
+                self.Output.message("Tenemos espacio en disco. Reactivando descargas.")
+
+            for d in self.downloads.values() :
+               d.d.low_diskspace(low_diskspace)
+ 
     def scan(self):
         self.rawserver.add_task(self.scan, self.scan_period)
                                 
@@ -226,6 +244,9 @@
         for hash, data in added.items():
             self.Output.message('added "'+data['path']+'"')
             self.add(hash, data)
+            if self.low_diskspace :
+                self.downloads[hash].d.low_diskspace(True)
+
 
     def stats(self):            
         self.rawserver.add_task(self.stats, self.stats_period)

El parche añade una nueva tarea al cliente, que comprueba el espacio en disco en el directorio actual una vez por segundo. Si el espacio libre cae por debajo de 25 Megabytes, pausamos todas las descargas. En cuanto el espacio disponible sube, las descargas se reactivan. Los torrents dejan de descargar, pero la subida sigue activa.

Si se activan torrents nuevos, se pausarán automáticamente si es necesario. Adicionalmente, podemos pausar torrents de forma manual, siendo el parche compatible con el anterior.


Historia

  • 11/sep/11: Primera versión de esta página.



Python Zope ©2011 jcea@jcea.es

Más información sobre los OpenBadges

Donación BitCoin: 19niBN42ac2pqDQFx6GJZxry2JQSFvwAfS