Thanks David, that makes a little sense also because it often happens after
there has been no activity on the server for a while. If it is a stale
handle, is there something I can do about it?

I got rid of the string-join, although I think I was using bind params
already -- I did not join strings that were variable, all variables get
passed via "?" in the string itself. It might be because I do
`(number->string (random 1000000)), which is because it means I don't have
to convert it to strings every time I put it in the webpage.

Cheers,
Marc

On Wed, Apr 5, 2017 at 1:25 PM, David Storrs <[email protected]> wrote:

> I'm guessing here, but these lines:
>
>    /usr/share/racket/pkgs/db-lib/db/private/mysql/message.rkt:417:0:
> parse-packet
>    /usr/share/racket/pkgs/db-lib/db/private/mysql/connection.rkt:105:4:
> recv* method in connection%
>
> suggest to me that the issue is:
>
> 1) The connection handle is stale or not established
>
> 2) It's failing to make the connection before the initial call is
> made, so it receives something that isn't a packet back (my guess
> would be #f, but that's purely a guess).
>
> 3) The connection then finishes being made so the second call works.
>
>
> The reason it works on localhost is that the DB is instantly available
> with no network latency and your handles are not stale.
>
> As an aside, I would suggest using bind params for your SQL instead of
> assembling it as a string.  It will be faster, might fix your problem,
> and will be substantially more secure depending on where your data is
> coming from.  It will also allow the handle to cache statements for
> future use.  The only change you need is to get rid of the
> string-append:
>
>   (query-exec
>         dbc
>         "INSERT INTO participant (subscribed, next_matrix,
> completion_code, comprehension_incorrect, comprehension_question)
> VALUES (1, 1, ?, 0, 0)"
>         (random 1000000))
>
>
> Hope this helps,
>
> Dave
>
> On Wed, Apr 5, 2017 at 12:08 PM, Marc Kaufmann
> <[email protected]> wrote:
> > Hi all,
> >
> > I have the following code that occasionally throws an error when called,
> but definitely not always:
> >
> > "
> > (define (study-add-participant! a-study)
> >   (displayln-date)
> >   (define dbc (study-db a-study))
> >   (displayln "Inserting new participant...")
> >   (query-exec
> >         dbc
> >         (string-join
> >           '(
> >                 "INSERT INTO participant (subscribed, next_matrix,
> completion_code, comprehension_incorrect, comprehension_question)"
> >                 "VALUES (1, 1, ?, 0, 0)"))
> >         (number->string (random 1000000)))
> >   (displayln "New participant inserted. Getting id of new
> participant...")
> >   ... ; More stuff
> > "
> >
> > Sometimes I hit the following error, but never if I refresh the page
> that calls 'study-add-participant!, and usually I don't hit the error at
> all.
> >
> > "
> > Servlet (@ /tutorial) exception:
> > io:read-le-intN: internal error;
> >  unexpected eof; got #<eof>
> >
> >   context...:
> >    /usr/share/racket/collects/db/private/generic/interfaces.rkt:209:0:
> error*9
> >    /usr/share/racket/pkgs/db-lib/db/private/mysql/message.rkt:417:0:
> parse-packet
> >    /usr/share/racket/pkgs/db-lib/db/private/mysql/connection.rkt:105:4:
> recv* method in connection%
> >    .../more-scheme.rkt:261:28
> >    /usr/share/racket/collects/db/private/generic/common.rkt:276:13
> >    /usr/share/racket/collects/db/private/generic/../../../
> racket/private/more-scheme.rkt:261:28
> >    [repeats 1 more time]
> >    /usr/share/racket/collects/db/private/generic/functions.rkt:141:0:
> compose-statement
> >    /usr/share/racket/collects/db/private/generic/functions.rkt:216:0:
> query-exec
> >    /home/marc/mturk/model.rkt:99:0: study-add-participant!
> >    /home/marc/mturk/pages.rkt:563:0: tutorial
> >    /usr/share/racket/collects/racket/contract/private/arrow-
> higher-order.rkt:342:33
> >    [repeats 1 more time]
> >    /usr/share/racket/pkgs/web-server-lib/web-server/
> dispatchers/dispatch-servlets.rkt:58:2
> >    /usr/share/racket/collects/racket/contract/private/arrow-
> higher-order.rkt:342:33
> >    [repeats 1 more time]
> > ...
> > "
> >
> > From the logs, I know that this happens in the query-exec, since I see
> the first `displayln message, but not the second one. What I do not
> understand is how I can hit the message sometimes but not other times? What
> (hidden?) state is there that is changing and sometimes causes the
> io:read-le-intN to fail?
> >
> > If it helps with diagnosing:
> >
> > - The query did not get run successfully on the database.
> > - The query itself is correct, since it succeeds the second time, and
> since it succeeded yesterday. Thus, it's not that I am addressing a missing
> database or anything.
> > - I have never yet hit this error when running the code on localhost for
> testing and development. This is on the live server.
> >
> > I am happy to provide more logs or run commands to figure out what is
> going on, but unfortunately I cannot even replicate the bug reliably (I hit
> it 4 times so far.
> >
> > Thanks,
> > Marc
> >
> > --
> > You received this message because you are subscribed to the Google
> Groups "Racket Users" group.
> > To unsubscribe from this group and stop receiving emails from it, send
> an email to [email protected].
> > For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to