[apt-proxy-devel] r661 - trunk/apt_proxy

Chris Halls halls at alioth.debian.org
Wed Jul 4 10:33:41 UTC 2007


Author: halls
Date: Wed Jul  4 10:33:41 2007
New Revision: 661

Log:
* Add STATE_CONNECTING. It was previously defined but not used.
* Return an error to client if an unknown exception occurs while setting up the request

Modified:
   trunk/apt_proxy/cache.py

Modified: trunk/apt_proxy/cache.py
==============================================================================
--- trunk/apt_proxy/cache.py	(original)
+++ trunk/apt_proxy/cache.py	Wed Jul  4 10:33:41 2007
@@ -25,6 +25,7 @@
 from twisted.internet import protocol, defer, reactor
 from twisted.web import http
 from twisted.protocols import basic
+from twisted.python import failure
 import os, re, stat, time, sys
 from misc import log
 
@@ -58,7 +59,6 @@
     STATE_SENDFILE = 4 # File is being sent from cache
     STATE_SENT = 5 # Post download processing / waiting for clients to complete
     STATE_FAILED = 6 # Download failed
-    
 
     bytesDownloaded = 0
 
@@ -130,16 +130,25 @@
         if hasattr(request, 'is_real_client'):
             log.msg("this is a real request:" + self.file_path, "CacheEntry")
             self.requested_by_client = True
-        if(len(self.requests)==1):
-            # First request
-            self.get()
-        else:
-            # Subsequent request - client must be brought up to date
-            if self.state in (self.STATE_DOWNLOAD, self.STATE_SENT):
-                self.send_cached_file(request=request)
-            elif self.state == self.STATE_SENDFILE:
-                self.transfer_file(request=request)
-
+        try:
+            if(len(self.requests)==1):
+                # First request
+                self.get()
+            else:
+                # Subsequent request - client must be brought up to date
+                if self.state in (self.STATE_DOWNLOAD, self.STATE_SENT):
+                    self.send_cached_file(request=request)
+                elif self.state == self.STATE_SENDFILE:
+                    self.transfer_file(request=request)
+	except Exception, e:
+            import traceback
+            log.err('Unknown error adding request %s - %s' % (request, e), 'CacheEntry')
+            self.requests.remove(request)
+            f = failure.Failure(*sys.exc_info())
+            for l in f.getTraceback().split('\n'):
+                log.err('  '+l, 'CacheEntry')
+            request.finishCode(http.INTERNAL_SERVER_ERROR, 'Unknown exception, see log file')
+			
     def remove_request(self,request):
         """
         Remove request, either because streaming is complete or
@@ -147,14 +156,22 @@
 
         If parameter request is None, downloading has been aborted early
         """
+
         if request is not None and request in self.requests:
             self.requests.remove(request)
         if len(self.requests) != 0:
             return
 
-        log.debug("Last request removed for %s" % (self.file_path),'CacheEntry')
-        self.requests_done()
+        log.debug("Last request removed for %s [%s]" % (self.file_path, self.stateToString()),'CacheEntry')
+        if self.state == self.STATE_CONNECTING:
+            self.backend.stop_download(self, request)
+        elif (self.state == self.STATE_DOWNLOAD and
+             not self.factory.config.complete_clientless_downloads ):
+            self.backend.stop_download(self, request)
+        if self.state == self.STATE_SENT:
+            self.requests_done()
 
+            
         # TODO - fixme
         #if (self.factory.config.complete_clientless_downloads == False
              #and self.state == self.STATE_DOWNLOAD
@@ -340,7 +357,7 @@
         Start file transfer from backend server
         """
         log.msg("start download:" + self.path, "CacheEntry")
-
+        self.state = self.STATE_CONNECTING
         self.backend.start_download(self)
 
     def get_request_mtime(self):



More information about the apt-proxy-devel mailing list