Hello, I'm not sure what is causing this error (please see the stack trace below), all I can say it's relatively big XML being sent. I must be doing something tremendously inefficient or else this error means something else, but I hope you would be able to advise:
[2011-07-06 14:20:27 [ERROR]] I/O timeout reading #<SB-SYS:FD-STREAM for "a socket" {B8E0AA1}>. 0: (SB-DEBUG::MAP-BACKTRACE #<CLOSURE (LAMBDA #) {B9034D5}>)[:EXTERNAL] 1: (BACKTRACE 536870911 #<SB-IMPL::STRING-OUTPUT-STREAM {B903471}>) 2: (TRIVIAL-BACKTRACE:PRINT-BACKTRACE-TO-STREAM #<SB-IMPL::STRING-OUTPUT-STREAM {B903471}>) 3: (HUNCHENTOOT::GET-BACKTRACE) 4: ((FLET #:LAMBDA284) #<SB-SYS:IO-TIMEOUT {B903139}>) 5: (SIGNAL #<SB-SYS:IO-TIMEOUT {B903139}>)[:EXTERNAL] 6: (ERROR SB-SYS:IO-TIMEOUT)[:EXTERNAL] 7: (SB-IMPL::SIGNAL-TIMEOUT SB-SYS:IO-TIMEOUT)[:EXTERNAL] 8: (SB-IMPL::REFILL-INPUT-BUFFER #<SB-SYS:FD-STREAM for "a socket" {B8E0AA1}>) 9: (SB-IMPL::FD-STREAM-READ-N-BYTES #<SB-SYS:FD-STREAM for "a socket" {B8E0AA1}> #(97 108 121 116 105 99 115 62 10 32 32 102 49 50 51 52 53 54 55 56 57 48 . . . long array of data ) 0 8191 NIL) 10: (SB-IMPL::ANSI-STREAM-READ-SEQUENCE #(97 108 121 116 105 99 115 62 10 32 32 102 49 50 51 52 53 54 55 56 57 48 . . . long array of data ) #<SB-SYS:FD-STREAM for "a socket" {B8E0AA1}> 0 8191) 11: (READ-SEQUENCE #(97 108 121 116 105 99 115 62 10 32 32 102 49 50 51 52 53 54 55 56 57 48 . . . long array of data ) #<SB-SYS:FD-STREAM for "a socket" {B8E0AA1}>)[:EXTERNAL] 12: ((SB-PCL::FAST-METHOD TRIVIAL-GRAY-STREAMS:STREAM-READ-SEQUENCE (FLEXI-STREAMS:FLEXI-INPUT-STREAM T T T)) #<unavailable argument> #<unavailable argument> #<unavailable argument> #<unavailable argument> #<unavailable argument> #<unavailable argument>)[:EXTERNAL] 13: ((LAMBDA (SB-PCL::.PV. SB-PCL::.NEXT-METHOD-CALL. SB-PCL::.ARG0. SB-PCL::.ARG1. SB-PCL::.ARG2. SB-PCL::.ARG3. SB-INT:&MORE SB-PCL::.DFUN-MORE-CONTEXT. SB-PCL::.DFUN-MORE-COUNT.)) #<unused argument> #<unused argument> #<FLEXI-STREAMS:FLEXI-IO-STREAM {B8EA781}> #(97 108 121 116 105 99 115 62 10 32 32 102 49 50 51 52 53 54 55 56 57 48 . . . long array of data ) 0 8191 -307111303 0) 14: (READ-SEQUENCE #(97 108 121 116 105 99 115 62 10 32 32 102 49 50 51 52 53 54 55 56 57 48 . . . long array of data ) #<FLEXI-STREAMS:FLEXI-IO-STREAM {B8EA781}>)[:EXTERNAL] 15: ((SB-PCL::FAST-METHOD RUNES::XSTREAM-UNDERFLOW (RUNES:XSTREAM)) #<unavailable argument> #<unavailable argument> #<RUNES:XSTREAM [main document :MAIN NIL]>) 16: (CXML::READ-NAME-TOKEN #<unavailable argument>) 17: (CXML::READ-TAG-2 #S(CXML::ZSTREAM :TOKEN-CATEGORY :SEEN-< :TOKEN-SEMANTIC NIL :INPUT-STACK (#<RUNES:XSTREAM [main document :MAIN NIL]>)) #<RUNES:XSTREAM [main document :MAIN NIL]> :STAG) 18: (CXML::FIX-SEEN-< #S(CXML::ZSTREAM :TOKEN-CATEGORY :SEEN-< :TOKEN-SEMANTIC NIL :INPUT-STACK (#<RUNES:XSTREAM [main document :MAIN NIL]>))) 19: (CXML::P/DOCUMENT #S(CXML::ZSTREAM :TOKEN-CATEGORY :SEEN-< :TOKEN-SEMANTIC NIL :INPUT-STACK (#<RUNES:XSTREAM [main document :MAIN NIL]>)) #<RUNE-DOM::DOM-BUILDER {B8EB0B9}>)[:EXTERNAL] 20: ((LAMBDA (CXML::ZSTREAM)) #S(CXML::ZSTREAM :TOKEN-CATEGORY :SEEN-< :TOKEN-SEMANTIC NIL :INPUT-STACK (#<RUNES:XSTREAM [main document :MAIN NIL]>))) 21: (CXML::CALL-WITH-ZSTREAM #<CLOSURE (LAMBDA #) {B8EE055}> #S(CXML::ZSTREAM :TOKEN-CATEGORY :SEEN-< :TOKEN-SEMANTIC NIL :INPUT-STACK (#<RUNES:XSTREAM [main document :MAIN NIL]>))) 22: (CXML::PARSE-XSTREAM #<RUNES:XSTREAM [main document :MAIN NIL]> #<RUNE-DOM::DOM-BUILDER {B8EB0B9}>)[:EXTERNAL] 23: (ROUNDS-WEB::ANALYTICS-SERVICE) ;;; This is my service I've posted the sources next 24: ((SB-PCL::FAST-METHOD HUNCHENTOOT:HANDLE-REQUEST (HUNCHENTOOT:ACCEPTOR HUNCHENTOOT:REQUEST)) #<unavailable argument> #<unavailable argument> #<HUNCHENTOOT:ACCEPTOR (host *, port 8080)> #<HUNCHENTOOT:REQUEST {B8E8A11}>) 25: ((SB-PCL::FAST-METHOD HUNCHENTOOT:PROCESS-REQUEST (T)) #<unavailable argument> #<unavailable argument> #<HUNCHENTOOT:REQUEST {B8E8A11}>) 26: ((SB-PCL::FAST-METHOD HUNCHENTOOT:PROCESS-CONNECTION (HUNCHENTOOT:ACCEPTOR T)) #<unavailable argument> #<unavailable argument> #<HUNCHENTOOT:ACCEPTOR (host *, port 8080)> #<USOCKET:STREAM-USOCKET {B8E0B31}>) 27: ((SB-PCL::FAST-METHOD HUNCHENTOOT:PROCESS-CONNECTION :AROUND (HUNCHENTOOT:ACCEPTOR T)) #<unavailable argument> #S(SB-PCL::FAST-METHOD-CALL :FUNCTION #<FUNCTION #> :PV NIL :NEXT-METHOD-CALL NIL :ARG-INFO (2)) #<HUNCHENTOOT:ACCEPTOR (host *, port 8080)> #<USOCKET:STREAM-USOCKET {B8E0B31}>) 28: ((LAMBDA ())) 29: ((FLET #:WITHOUT-INTERRUPTS-BODY-[BLOCK353]358)) 30: ((FLET SB-THREAD::WITH-MUTEX-THUNK)) 31: ((FLET #:WITHOUT-INTERRUPTS-BODY-[CALL-WITH-MUTEX]267)) 32: (SB-THREAD::CALL-WITH-MUTEX #<CLOSURE (FLET SB-THREAD::WITH-MUTEX-THUNK) {B6C77205}> #S(SB-THREAD:MUTEX :NAME "thread result lock" :%OWNER #<SB-THREAD:THREAD "Hunchentoot worker (client: 127.0.0.1:39378)" RUNNING {B8E2391}> :STATE 1) #<SB-THREAD:THREAD "Hunchentoot worker (client: 127.0.0.1:39378)" RUNNING {B8E2391}> T) 33: ((LAMBDA ())) 34: ("foreign function: #x8066E3B") 35: ("foreign function: #x8052ABD") 36: ("foreign function: #x805DC00") 37: ("foreign function: #xB7FB696E")
[2011-07-06 14:20:27 [ERROR]] Error while processing connection: #<SB-SYS:FD-STREAM for "a socket" {B8E0AA1}> is closed
And here's the code for that service:
(in-package :rounds-web)
(defun split-no-last (subject by) (loop with last = 0 for i = (position by subject :start last) if i collect (subseq subject last i) into parts and do (setf last (1+ i)) else when (> (1- (length subject)) last) collect (subseq subject last) into parts end and return parts end))
(defun time-value (raw-value) (let* ((pos (position #. raw-value)) (result (list (subseq raw-value 0 pos))) (raw-length (length raw-value))) (if (< pos raw-length) (append result (list (subseq raw-value (1+ pos) raw-length))) result)))
(defun parse-name (attribute) ;; *round*, *category* and *event-type* are hash tables defined elsewhere `(,(gethash (subseq attribute 0 1) *round*) ,(gethash (subseq attribute 1 3) *category*) ,(gethash (subseq attribute 3) *event-type*)))
(defun print-attribute (stream attribute val) (format stream "Event: Round ~a | Category ~a | Type ~a~&" (first attribute) (second attribute) (third attribute)) (loop for v in val for split = (time-value v) for time = (first split) for value = (if (> (length split) 1) (second split) nil) do (format stream " Time: ~a, Value: ~a~&" time value)))
(defun save-parsed-events (xml) (with-open-file (stream "./analytics.log" :direction :output :if-exists :supersede) (loop for node across (dom:child-nodes xml) do (when (eq (dom:node-type node) :element) (format stream "VideoSessionId: ~a =========================================~&" (subseq (dom:node-name node) 1)) (when (dom:attributes node) (loop with attributes = (dom:attributes node) for n from 0 upto (1- (dom:length attributes)) for attribute = (dom:item attributes n) do (print-attribute stream (parse-name (dom:name attribute)) (split-no-last (dom:get-attribute node (dom:name attribute)) #,))))))))
(defun analytics-service () (save-parsed-events (dom:first-child (cxml:parse-stream (hunchentoot:raw-post-data :request hunchentoot:*request* :want-stream t) (cxml-dom:make-dom-builder)))))
This code isn't meant for production, all it does it mocks a real service which is meant to do the same thing so I could use it for testing, yet, I'd of course like it to work :) Please, if you have anything to suggest, I'd be very happy to hear!
Thanks!
Oleg