<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>Am 29.10.2013 um 16:18 schrieb Ralf Mattes <<a href="mailto:rm@seid-online.de">rm@seid-online.de</a>>:</div><br class="Apple-interchange-newline"><blockquote type="cite">On Tue, Oct 29, 2013 at 04:14:22PM +0100, Paul Meurer wrote:<br><blockquote type="cite">Hi,<br><br>I need some advice on how to further debug the following.<br><br>I am consistently observing crashes when I do run concurrent database selects using clsql against a PostgreSQL backend. I am running the newest ccl-1.9 64bit on CentOS, the PostgreSQL library advertises itself as being thread safe. Here is the code I am running:<br><br>(dotimes (i 16)<br>  (ccl:process-run-function<br>   (format nil "test~d" i)<br>   (lambda (i)<br>     (with-database (*default-database* *connection-spec* :if-exists :new)<br>       (select [text] :from [text-table] :limit 10000)<br>       (print i)))<br>   i))<br><br>This form can be run several times without problems, but eventually I get a segfault. I tried to debug in gdb, where I see that the crash seems to be GC-related (see below). The crash always happens at the same place in bits.c.<br><br>I am aware that this is a complex scenario, where either the db lib, or uffi/clsql, or clozure could be the culprit, and it does not seem to be trivial to boil this down to a minimal case. So I would be grateful if somebody could give me some advice as to what would be the most promising way of nailing down this bug.<br></blockquote><br>I'm afraid it's none of the above - what makes you think that you can simultaneous queries over<br>the same shared connection?<br></blockquote><div><br></div><div>Nothing.</div><br><blockquote type="cite"><blockquote type="cite">From the fine docs [<a href="http://www.postgresql.org/docs/9.3/static/ecpg-connect.html">http://www.postgresql.org/docs/9.3/static/ecpg-connect.html</a>]<br></blockquote><br>" If your application uses multiple threads of execution, they cannot share a connection <br>  concurrently. You must either explicitly control access to the connection (using mutexes) <br>  or use a connection for each thread."<br><br>You need to set up a connection per thread of execution (or use one from a pool, but then<br>you need to protect shared access to the pool with a mutex).<br></blockquote><div><br></div><div>Of course I am using a dedicated connection per thread. That's done by specifying :new to :if-exists in the with-database() macro. I could have achieved the same by using a connection pool abstraction (that's what I am doing in my application) with the same effect. (Using one connection for all threads immediately gives you statement-out-of-order errors from the database.)</div><div><br></div><div>Concurrent execution works fine otherwise in my app, where I am using it all over the place, but there, selects come in more sporadically. Only when heavy fetching is done simultaneously in many threads this error seems to show up.</div><br><blockquote type="cite"> HTH Ralf Mattes<br></blockquote><div><br></div><blockquote type="cite"><blockquote type="cite">----------<br><br>? Unhandled exception 11 at 0x412360, context->regs at #x7f3ea52ed538<br>Exception occurred while executing foreign code<br>received signal 11; faulting address: 0x307e3f94d000<br>invalid permissions for mapped object<br>?<br><br>and in gdb:<br><br>(gdb) br *0x0000000000412360<br>Breakpoint 2 at 0x412360: file ../bits.c, line 45.<br>(gdb) continue<br>Continuing.<br>[Switching to Thread 0x7f3ea52ef700 (LWP 3974)]<br><br>Breakpoint 2, set_n_bits (bits=<value optimized out>, <br>    first=<value optimized out>, n=<value optimized out>) at ../bits.c:45<br>45<span class="Apple-tab-span" style="white-space:pre">     </span>        *wstart++ = ALL_ONES;<br>1: x/i $pc<br>=> 0x412360 <set_n_bits+112>:<span class="Apple-tab-span" style="white-space:pre">        </span>movq   $0xffffffffffffffff,(%rax)<br>(gdb) bt<br>#0  set_n_bits (bits=<value optimized out>, first=<value optimized out>, <br>    n=<value optimized out>) at ../bits.c:45<br>#1  0x000000000041111c in rmark (n=52914162892765) at ../x86-gc.c:770<br>#2  0x00000000004116fd in mark_root (n=<value optimized out>) at ../x86-gc.c:516<br>#3  0x0000000000411b05 in mark_ephemeral_root (n=<value optimized out>)<br>    at ../x86-gc.c:650<br>#4  0x000000000040bfa2 in mark_memoized_area (a=0x1e926e0, <br>    num_memo_dnodes=10288289) at ../gc-common.c:1473<br>#5  0x000000000040d9f0 in gc (tcr=<value optimized out>, <br>    param=<value optimized out>) at ../gc-common.c:1688<br>#6  0x0000000000412c9b in gc_from_tcr (tcr=<value optimized out>, <br>    param=<value optimized out>) at ../x86-exceptions.c:2924<br>#7  0x0000000000413358 in gc_like_from_xp (xp=<value optimized out>, <br>    fun=0x412c70 <gc_from_tcr>, param=0) at ../x86-exceptions.c:2881<br>#8  0x000000000041341e in gc_from_xp (xp=<value optimized out>, <br>    param=<value optimized out>) at ../x86-exceptions.c:2936<br>#9  0x0000000000414ad1 in allocate_object (xp=0x7f3ea52ee440, bytes_needed=32, <br>    disp_from_allocptr=19, tcr=0x7f3ea52ef570, <br>    crossed_threshold=<value optimized out>) at ../x86-exceptions.c:204<br>#10 0x0000000000414b9d in handle_alloc_trap (xp=0x7f3ea52ee440, <br>    tcr=0x7f3ea52ef570, notify=0x7f3ea52ee1cc) at ../x86-exceptions.c:644<br>#11 0x0000000000415552 in handle_exception (signum=<value optimized out>, <br>    info=<value optimized out>, context=0x7f3ea52ee440, <br>    tcr=<value optimized out>, old_valence=<value optimized out>)<br>    at ../x86-exceptions.c:1193<br>#12 0x00000000004157fa in signal_handler (signum=11, info=0x7f3ea52ee7f0, <br>    context=0x7f3ea52ee440) at ../x86-exceptions.c:1466<br>#13 <signal handler called><br>#14 0x0000302000bdca65 in ?? ()<br>#15 0x0000000000000052 in ?? ()<br><br>-- <br>Best wishes,<br>Paul<br><br>_______________________________________________<br>Openmcl-devel mailing list<br><a href="mailto:Openmcl-devel@clozure.com">Openmcl-devel@clozure.com</a><br>http://clozure.com/mailman/listinfo/openmcl-devel<br></blockquote></blockquote></div><br><div>
<span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: 'Lucida Grande'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; ">-- <br>Paul</span>

</div>
<br></body></html>