Stephan Diehl schrieb: > I'm a longtime user of WebWare. I just stumbled over some pretty > strange problem. The Application running on Webware is a kind of > Document Management system that can contain quite huge files (ISO > images). When somebody is downloading such a file and cancels the > download, the application eats up more and more memory. It looks like > the application tries to deliver the content, but, instead of > delivering it to the client (who's not longer there), caches > everything in memory. This is the newest version of WebWare. > > I've done the following change: > In WebKit/ThreadedAppServer.py > > 741 def flush(self): > 742 """Flush stream. > ... > 753 while sent < reslen: > 754 try: > 755 sent += self._socket.send( > 756 self._buffer[sent:sent+8192]) > 757 except socket.error, e: > 758 if e[0] == errno.EPIPE: # broken pipe > 759 pass > 760 elif hasattr(errno, 'ECONNRESET') \ > 761 and e[0] == errno.ECONNRESET: > 762 pass > 763 else: > 764 print "StreamOut Error: ", e > 765 break > 766 self.pop(sent) > > I've changed line 759 from 'pass' to 'raise', which now gives ugly > tracebacks in the logs, but other than that, does what should happen > anyway: cancel the download.
Hi Stephan, thanks for the bug report. I think you're right, this is a problem. By the way, on Windows you get an ECONNABORTED error in the same situation, not an EPIPE error. So I think ECONNABORTED should be treated the same way as the other two errors in the flush method. For a fix of the problem, I suggest the following: In ASSStreamOut.py: Above the definition of the ASStreamOut class, insert: class ConnectionAbortedError(Exception): pass Below, replace the 2 lines beginning: assert not self._closed, ... with: if self._closed: raise ConnectionAbortedError In ThreadedAppServer.py: Above the definition of the ThreadedAppServer class, insert: from ASStreamOut import ConnectionAbortedError In the TASASStreamOut.flush() method, insert this line before the break statement: self._closed = True To avoid the ugly tracebacks, insert the following lines between the call of handler.handleRequest() and the following except:, indented with the correct amount (both "excepts" on the same level): except ConnectionAbortedError: if self._verbose: sys.stdout.write('%5i %s connection aborted\n' % (handler._requestID, timestamp()['pretty'])) If you confirm that this fixes your problems and nobody disagrees, I will fix it this way in the trunk. > P.S.: I know this is quite a political issue, but is there a chance to > change from tabs to spaces in Webware code? I think this question should go directly to Chuck, our BDFL who had been strongly against this in the past. I vote for a change as well. -- Christoph ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys-and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ Webware-discuss mailing list Webware-discuss@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/webware-discuss