From: Lorenz M. <moe...@in...> - 2012-05-29 11:52:18
|
Hi Nikodemus, I'm definitely not signalling deadlines in a timer :) In my case, the timeout error occurs when closing a socket. On a reasonably fast computer and a fast network connection, it almost never occurs, but on a slow computer or high network load, it happens way too often. Attached, you find a simple test file that can be executed using `sbcl --script` which runs a simple server on a socket and periodically connects to it. I get the following backtrace pretty reliably on a netbook with an Atom processor: unhandled SB-SYS:DEADLINE-TIMEOUT in thread #<SB-THREAD:THREAD "initial thread" RUNNING {AAA2EB1}>: A deadline was reached after 0.002 seconds. 0: (SB-DEBUG::MAP-BACKTRACE #<CLOSURE (LAMBDA #) {B2B798D}> :START 0 :COUNT 128) 1: (SB-DEBUG:BACKTRACE 128 #<SB-SYS:FD-STREAM for "standard error" {AAA3C49}>) 2: (SB-DEBUG::DEBUGGER-DISABLED-HOOK #<SB-SYS:DEADLINE-TIMEOUT {B2B4D09}> #<unavailable argument>) 3: (SB-DEBUG::RUN-HOOK SB-EXT:*INVOKE-DEBUGGER-HOOK* #<SB-SYS:DEADLINE-TIMEOUT {B2B4D09}>) 4: (INVOKE-DEBUGGER #<SB-SYS:DEADLINE-TIMEOUT {B2B4D09}>) 5: (ERROR #<SB-SYS:DEADLINE-TIMEOUT {B2B4D09}>) 6: (SB-IMPL::RELEASE-FD-STREAM-RESOURCES #<SB-SYS:FD-STREAM for "socket 127.0.0.1:34219, peer: 127.0.0.1:11111" {B2B47E1}>) 7: ((SB-PCL::FAST-METHOD SB-GRAY::PCL-CLOSE (SB-KERNEL:ANSI-STREAM)) #<unused argument> #<unused argument> #<SB-SYS:FD-STREAM for "socket 127.0.0.1:34219, peer: 127.0.0.1:11111" {B2B47E1}> :ABORT NIL) 8: ((FLET #:CLEANUP-FUN-[PERFORM-REQUEST]4))[:CLEANUP] 9: (PERFORM-REQUEST) 10: (RUN) 11: (SB-INT:SIMPLE-EVAL-IN-LEXENV (RUN) #<NULL-LEXENV>) 12: (SB-EXT:EVAL-TLF (RUN) 8 #<NULL-LEXENV>) 13: ((FLET SB-FASL::EVAL-FORM) (RUN) 8) 14: (SB-INT:LOAD-AS-SOURCE #<SB-SYS:FD-STREAM for "file /home/moesenle/tmp/deadlines.lisp" {AAA67C9}> :VERBOSE NIL :PRINT NIL :CONTEXT "loading") 15: ((FLET SB-FASL::LOAD-STREAM) #<SB-SYS:FD-STREAM for "file /home/moesenle/tmp/deadlines.lisp" {AAA67C9}> NIL) 16: (LOAD #<SB-SYS:FD-STREAM for "file /home/moesenle/tmp/deadlines.lisp" {AAA67C9}> :VERBOSE NIL :PRINT NIL :IF-DOES-NOT-EXIST T :EXTERNAL-FORMAT :DEFAULT) 17: ((FLET SB-IMPL::LOAD-SCRIPT) #<SB-SYS:FD-STREAM for "file /home/moesenle/tmp/deadlines.lisp" {AAA67C9}>) 18: ((FLET #:WITHOUT-INTERRUPTS-BODY-[PROCESS-SCRIPT]69)) 19: (SB-IMPL::PROCESS-SCRIPT "./deadlines.lisp") 20: (SB-IMPL::TOPLEVEL-INIT) 21: ((FLET #:WITHOUT-INTERRUPTS-BODY-[RESTART-LISP]30)) 22: ((LABELS SB-IMPL::RESTART-LISP)) The backtrace is hard to reproduce on a faster computer though. I don't know enough about how deadlines are implemented internally, I just know that it happens and I don't see any timers involved :) Thanks, Lorenz On Sun, May 27, 2012 at 5:51 PM, Nikodemus Siivola <nik...@ra...> wrote: >>> RELEASE-FD-STREAM-RESOURCES removes the restarts created by >>> SIGNAL-DEADLINE if a deadline is signaled inside the HANDLER-CASE form >>> in RELEASE-FD-STREAM-RESOURCES. The reason is that all serious >>> conditions are caught and re-signaled outside the WITH-INTERRUPTS form >>> which causes SIGNAL-DEADLINE including its restarts to be unwound. >>> That means it becomes impossible to defer or cancel the deadline and >>> DEADLINE-TIMEOUT conditions occur. > > Lorenz, having taken a better look, it seems to me that the only way > to provoke the this is by having something signaling deadlines in a > timer which fires when WITHOUT-INTERRUPTS is exited. > > Am I missing something? > > While the forcible unwind is not ideal, and something will be done > about it, I just wanted to point out that because of exactly this sort > of reason having timers doing things which may signal deadlines is a > fundamentally losing proposal, unless those timers handle their own > deadlines. > > Cheers, > > -- Nikodemus > -- Lorenz Mösenlechner | moe...@in... Technische Universität München | Karlstraße 45 80335 München | Germany http://ias.cs.tum.edu/ | Tel: +49 (89) 289-26910 |