Ticket UUID: | 219400 | |||
Title: | EOF sent/received too early or possible bug in http package | |||
Type: | Bug | Version: | obsolete: 8.3.1 | |
Submitter: | nobody | Created on: | 2000-10-26 05:12:27 | |
Subsystem: | 25. Channel System | Assigned To: | andreas_kupries | |
Priority: | 1 Zero | Severity: | ||
Status: | Deleted | Last Modified: | 2006-03-29 10:22:05 | |
Resolution: | Out of Date | Closed By: | sf-robot | |
Closed on: | 2006-03-29 03:22:05 | |||
Description: |
OriginalBugID: 6282 Bug Version: 8.3.1 SubmitDate: '2000-09-18' LastModified: '2000-09-20' Severity: SER Status: UnAssn Submitter: techsupp ChangedBy: welch OS: Linux OSVersion: Linux bugger 2.2.17 #1 Fri Sep 15 02:22:10 EEST 2000 i586 unknow Machine: Various Pentiums FixedDate: '2000-10-25' ClosedDate: '2000-10-25' Name: Kristoffer Lawson ReproducibleScript: =============== Server: variable firstread 1 proc accept {sock addr port} { fconfigure $sock -buffering none fconfigure $sock -blocking 0 fileevent $sock r [list stuff $sock] } proc stuff {sock} { fileevent $sock r {} ;# this was in the original code but with them ;# it's very hard to reproduce! ;# sudo nice -n -20 for sender should do the ;# job... ;) if {[eof $sock]} { puts "***EOF***" exit } puts -nonewline stdout [read $sock] variable firstread variable delay if {$firstread} { set delay 0 after 2000 {set delay 1} vwait delay ## send response puts $sock " " set firstread 0 } fileevent $sock r [list stuff $sock] } socket -server accept 40010 vwait forever =================== Client: set addr [lindex $argv 0] ## called when data from remote end arrives. proc cb {} { variable sock read $sock puts $sock "<callback firstsend>" puts $sock "<callback secondsend>" for {set i 0} {$i < 9000} {incr i} { puts $sock "test32432 test3211 $i" } puts $sock "<callback lastnormalsend>" puts $sock "all data ok" close $sock exit } ## Open & configure variable sock [socket $addr 40010] fconfigure $sock -blocking 0 fconfigure $sock -buffering none fileevent $sock r cb # cb puts $sock "start" vwait forever ObservedBehavior: I am now fairly convinced this is a bug in Tcl8.3.1. When the client is run on a fast machine and especially if it is niced to a high priority tha server receives an EOF before all the data is sent. This also only seems to happen when the server has responded with some data first. The reason for my suspicions is that the http package seems to be doing exactly the same with Tcl 8.3.1. Ie. I might try to receive a large image but a chunk from the end is missing. When I do exactly the same operation with Tcl8.2 or 8.0 I have no problems. Of course, this might be a bug introduced into http but I couldn't see anything in the code that looked like it would cause that kind of behaviour and as we have similar behaviour with scripts like the above I believe there really is something fishy in Tcl's IO (specifically with sockets). This is rather awkward for us as we are building large systems around Tcl which quite heavily use the IO facilities. Of course, this might have been fixed in 8.3.2 (I haven't been able to test that yet), but as I couldn't find this bug listed specifically then I thought it better to report. DesiredBehavior: In the given script all of the data should be sent and outputted to the screen before the EOF notification. I can repeat this with both 8.3.1 and 8.3.2 on Linux, but only in the loopback case where the client and server are on the same host. It works fine on Solaris loopback, and between Solaris and Linux boxes. However, I had to comment-out the fileevent $sock r {} ;# this was in the original code but with them ;# it's very hard to reproduce! ;# sudo nice -n -20 for sender should do the ;# job... ;) call in the server's fileevent handler. Without that it works - the nice'ing doesn't have any effect. So, it could be possible that setting fileevents is perturbing the system somehow. -- 09/20/2000 welch | |||
User Comments: |
sf-robot added on 2006-03-29 10:22:05:
Logged In: YES user_id=1312539 This Tracker item was closed automatically by the system. It was previously set to a Pending status, and the original submitter did not respond within 14 days (the time period specified by the administrator of this Tracker). andreas_kupries added on 2006-03-15 05:55:59: Logged In: YES user_id=75003 Closing this one, it is so old, likely out of date. andreas_kupries added on 2001-09-08 03:38:35: Logged In: YES user_id=75003 Talking with Kristoffer showed that the problem was not reproducible for older linux systems (They had Debian 2.2.something) or IRIX. This suggests an OS problem, although we can't be sure. Decision: This item stays open for now, but at lowest priority. andreas_kupries added on 2001-09-08 03:31:27: Logged In: YES user_id=75003 Trying 8.3.2 now ... Can't get the error for this either. Diffing generic/tclIO.c shows changes, but none which should have an impact on this. There are no changes in "generic/tclNotify.c" at all. Same for the unix notifier "unix/tclUnixNotfy.c", i.e. no changes at all. andreas_kupries added on 2001-09-08 02:44:22: Logged In: YES user_id=75003 I tried to verify this using the current 8.3.3 from the CVS and 8.4cvs on a RedHat Linux 2.2.18, gclibc 2.1.3. I tried nice'd and not, with the fileevent at the beginning of the handler commented out and not, with stdout redirected and not. I never got the early EOF. Kristoffer Lawson is <[email protected]>. andreas_kupries added on 2001-09-08 02:03:53: File Added - 10495: 219400.client andreas_kupries added on 2001-09-08 02:03:27: File Added - 10494: 219400.server andreas_kupries added on 2001-09-08 02:03:26: Logged In: YES user_id=75003 Extracted the inlined code, attaching it to the report as proper files now. dkf added on 2001-02-01 03:32:11: (Maybe put into one of the Channel* categories instead?) |