Repair longstanding, subtle bug in both old- and new-syndicate.

during/spawn used not to add linkage assertions to its
initial-assertion set. In addition, if a spawned actor died in its
initial boot procedure, its initial assertions would never be visible.
These two problems interlocked to cause a space leak in during/spawn,
where monitoring facets would never be cleaned up.

This change does two things:
 - adds linkage assertions to the initial-assertion set in during/spawn
 - properly briefly signals initial-assertions even when a new actor
   immediately crashes.

Together, these repair the space leak in during/spawn with a crashy
child startup procedure.
This commit is contained in:
Tony Garnock-Jones 2018-11-04 13:43:17 +00:00
parent 45f638ebae
commit 93371894a0
2 changed files with 34 additions and 1 deletions

View File

@ -434,7 +434,9 @@
(w.wrapper #:linkage [(assert inst)
(stop-when (retracted (observe inst)))]
#:name name.N
#:assertions [assertions.exprs ...]
#:assertions [inst
(observe (observe inst))
assertions.exprs ...]
O ...)))))]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

View File

@ -0,0 +1,31 @@
#lang imperative-syndicate/test-implementation
;; An error signalled during setup of a new actor's root facet must
;; cause previous actions to be discarded, but must also cause any
;; initial-assertions, including specifically linkage assertions from
;; during/spawn, to be briefly visible.
(test-case
[(assertion-struct request (id))
(assertion-struct response (value))
(spawn (during/spawn (request $id)
(printf "starting request handler\n")
(assert (response 'the-answer)) ;; must not be visible
(printf "asserted response, shouldn't be visible\n")
(error 'aieee "oh no")
(printf "NOTREACHED\n")))
(spawn (stop-when (asserted (observe (request _)))
(printf "service listening\n")
(react
(assert (request 101))
(stop-when (retracted (observe (request _)))
(printf "whole service vanished\n"))
(stop-when (retracted (observe (request 101)))
(printf "specific instance vanished\n"))
(stop-when (asserted (response $v))
(printf "response ~v\n" v)))))]
(expected-output (list "service listening"
"starting request handler"
"asserted response, shouldn't be visible"
"specific instance vanished")))