On Mon, Oct 8, 2012 at 4:48 PM, Norman Gray <[email protected]> wrote:
>
> Jay, hello.
>
> On 8 Oct 2012, at 20:23, Jay McCarthy <[email protected]> wrote:
>
>> All the functions that start the Web server (such as serve) return a
>> function that with close the server when called.
>
> Thanks for this, but is that dependent on the version of Racket?  I did 
> vaguely recall something like this mechanism, but when I look at 
> <http://docs.racket-lang.org/web-server/run.html#(def._((lib._web-server/servlet-env..rkt)._serve/servlet))>
>  (which is pointing to the v5.3 docs, I think), serve/servlet appears to 
> return void, and the only other serve/* procedure in the index to that part 
> is serve/dispatch, which also returns void.
>
> Am I looking in the wrong place?
>
> I see this shutdown procedure in 
> <http://docs.racket-lang.org/more/index.html#(part._.Terminating_.Connections>,
>  but that's in the context of a tutorial example.
>

I was talking about these functions:

http://docs.racket-lang.org/web-server-internal/web-server.html

But you can just do (thread () (serve/servlet ...))) and then kill
that thread or its custodian and it will do the same thing as
serve/servlet's /quit URL does.

>> All that function does is start the server with a particular custodian
>> and then kills that custodian when you call the function. Any
>> resources that the server allocates would have their will executors
>> run. (The custodian controls the resources... killing it will cause
>> the will executor to run on the resources, unless the process is
>> killed, in which case nothing is normally run.)
>
> That makes sense, but I'm afraid I'm not seeing how I'd put my own function 
> (which will close/tidyup a database connection) into the care of the 
> current-custodian.  I'm guessing that there's a link between custodians and 
> will-executors, but the Custodians section (13.7) doesn't mention wills, and 
> the section on Wills and Executors (15.3) doesn't mention custodians.  13.7 
> doesn't seem to say how one would add something to a custodian; and 15.3, 
> although it suggests I should have a thread waiting on will-execute, doesn't 
> seem to guarantee that a will procedure is ever definitely ready, for example 
> when a web-server-closer procedure is called to terminate a custodian.
>
> The only thing I can think of is the following.  Immediately after opening 
> the database, I evaluate (db is the db connection):
>
> (thread (λ ()
>                  (let ((box (sync (make-custodian-box (current-custodian) 
> db))))
>                    (eprintf "Custodian box: ~s [~s]~%" box (custodian-box? 
> box))
>                    (sql:close (custodian-box-value box))
>                    (eprintf "CLOSED!~%"))))
>
> When I Ctrl-C the server, however, I see the "Web Server stopped." which 
> comes from serve/launch/wait and its handler for exn:break? (yes?), but no 
> messages from this thread, even though the custodian-box should become ready 
> when the there-current custodian (which is surely one of those managed by the 
> server's custodian) is shut down.
>
> I'm guessing that I'm missing something, and in particular that there's some 
> document I'm missing.  I'd love to RTFM, but I can't find which FM I should 
> be R-ing.

You could do...

(define we (make-will-executor)
(will-register we db sql:close)
(define we-t (thread (lambda () (will-execute we))))

And when the db was unreachable (because its custodian/thread/etc was
killed), then the db would be closed. I believe you would have to
ensure that we-t is not within the control of the same custodian.

>> I don't have any Web apps that are started by anything other than a
>> shell, so I always just Ctrl-C to quit.
>
> That's my situation, too.  The server is started from a shell, but it opens a 
> database connection (in fact using (planet "sqlite.rkt" ("jaymccarthy" 
> "sqlite.plt" 5 1)), for which many thanks!), and I feel sure I should be 
> carefully calling (close db) at some point.  I haven't been doing so, so far, 
> and nothing's broken, but I don't write to the database very often so I guess 
> I've just got away with it up to now.
>

You should switch to using the built-in 'db' library if possible. Ryan
has fixed some errors and is otherwise doing a better job maintaining.

Regarding if you need to close it... I never close my databases :/ The
worst that could happen is a TXN gets rolled back when you restart
because it was happening as you were killing. If you are not worried
about that... Ctrl-C away!

Jay

> Or am I overcomplicating this, somehow? (not for the first time, regrettably…)
>
> Thanks for any pointers.
>
> Best wishes,
>
> Norman
>
>
> --
> Norman Gray  :  http://nxg.me.uk
> SUPA School of Physics and Astronomy, University of Glasgow, UK
>



-- 
Jay McCarthy <[email protected]>
Assistant Professor / Brigham Young University
http://faculty.cs.byu.edu/~jay

"The glory of God is Intelligence" - D&C 93

____________________
  Racket Users list:
  http://lists.racket-lang.org/users

Reply via email to