<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jan 10, 2017 at 8:08 AM, Tatsuo Ishii <span dir="ltr">&lt;<a href="mailto:ishii@sraoss.co.jp" target="_blank">ishii@sraoss.co.jp</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Usama,<br>
<br>
Problem is, there are some places where standard library functions<br>
that calls malloc() internally.<br>
(For example, asprintf(), getaddrinfo()).<br>
<br></blockquote><div>You are right, this problem makes this solution not feasible.</div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Also blocking signals/unblocking signals every time malloc() called<br>
might hurt performance (I have not done an actual measurement. So this<br>
just a guess).<br></blockquote><div><br></div><div>Yes the benchmark can revel the actual overhead, but I think the impact of this change should be</div><div>very small, since Memory manager allocates the memory in chunks and malloc is not issued for every palloc call,</div><div>But again its hard to guess the actual impact before doing the measurements.</div><div><br></div><div>So I think we can proceed with the simple solution for now and remove the ereports from the signal handlers.</div><div><br></div><div>Kind regards</div><div>Muhammad Usama</div><div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="HOEnZb"><div class="h5"><br>
Best regards,<br>
--<br>
Tatsuo Ishii<br>
SRA OSS, Inc. Japan<br>
English: <a href="http://www.sraoss.co.jp/index_en.php" rel="noreferrer" target="_blank">http://www.sraoss.co.jp/index_<wbr>en.php</a><br>
Japanese:<a href="http://www.sraoss.co.jp" rel="noreferrer" target="_blank">http://www.sraoss.co.<wbr>jp</a><br>
<br>
&gt; Hi Ishii-San<br>
&gt;<br>
&gt; I have been thinking about this and I think there is one solution we can<br>
&gt; adopt.<br>
&gt;<br>
&gt; We can block signals before doing malloc() in, AllocSetAlloc() and<br>
&gt; AllocSetContextCreate() function, And since pgpool-II only uses palloc and<br>
&gt; friends to allocate memory and there are only few places where the malloc()<br>
&gt; are issued by MemoryManager API, So if we block signals before calling the<br>
&gt; malloc(), we can safely use elog/ereport from signal handler routines.<br>
&gt; What are your thoughts on this. I am attaching the sample patch for the<br>
&gt; reference.<br>
&gt;<br>
&gt; Kind regards<br>
&gt; Muhammad Usama<br>
&gt;<br>
&gt;<br>
&gt; On Fri, Jan 6, 2017 at 12:03 PM, Muhammad Usama &lt;<a href="mailto:m.usama@gmail.com">m.usama@gmail.com</a>&gt; wrote:<br>
&gt;<br>
&gt;&gt; Hi Ishii-San<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; On Fri, Jan 6, 2017 at 11:22 AM, Tatsuo Ishii &lt;<a href="mailto:ishii@sraoss.co.jp">ishii@sraoss.co.jp</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt;&gt; After some investigations, I found PostgreSQL does not block all<br>
&gt;&gt;&gt; signals: SIGTERM etc. still can interrupt.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Probably we should take out elog/ereport call from child.c:die().<br>
&gt;&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; Yes, this seems to be a good fix for now, But I am looking for some more<br>
&gt;&gt; future proof fix. Give me a couple of more days to get to the solution,<br>
&gt;&gt; otherwise we will go with removing the ereport from child.c:die.<br>
&gt;&gt;<br>
&gt;&gt; Thanks<br>
&gt;&gt; Best regards<br>
&gt;&gt; Muhammad Usama<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;&gt; Best regards,<br>
&gt;&gt;&gt; --<br>
&gt;&gt;&gt; Tatsuo Ishii<br>
&gt;&gt;&gt; SRA OSS, Inc. Japan<br>
&gt;&gt;&gt; English: <a href="http://www.sraoss.co.jp/index_en.php" rel="noreferrer" target="_blank">http://www.sraoss.co.jp/index_<wbr>en.php</a><br>
&gt;&gt;&gt; Japanese:<a href="http://www.sraoss.co.jp" rel="noreferrer" target="_blank">http://www.sraoss.co.<wbr>jp</a><br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt; I have asked this how PostgreSQL solves similar problems like this.<br>
&gt;&gt;&gt; &gt; It turned out that PostgreSQL mostly blocks all signals:<br>
&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt; &gt; <a href="https://www.postgresql.org/message-id/18405.1482794285%40sss.pgh.pa.us" rel="noreferrer" target="_blank">https://www.postgresql.org/<wbr>message-id/18405.1482794285%<wbr>40sss.pgh.pa.us</a><br>
&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt; &gt; Probably we should do the same way...<br>
&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt; &gt; Best regards,<br>
&gt;&gt;&gt; &gt; --<br>
&gt;&gt;&gt; &gt; Tatsuo Ishii<br>
&gt;&gt;&gt; &gt; SRA OSS, Inc. Japan<br>
&gt;&gt;&gt; &gt; English: <a href="http://www.sraoss.co.jp/index_en.php" rel="noreferrer" target="_blank">http://www.sraoss.co.jp/index_<wbr>en.php</a><br>
&gt;&gt;&gt; &gt; Japanese:<a href="http://www.sraoss.co.jp" rel="noreferrer" target="_blank">http://www.sraoss.co.<wbr>jp</a><br>
&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt; &gt;&gt; Usama,<br>
&gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt; If I hit CTRL-C key while executing the regression test, sometimes a<br>
&gt;&gt;&gt; &gt;&gt; orphan pgpool child remains. Here&#39;s a stack trace of the process:<br>
&gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt; t-ishii@localhost: gdb temp/installed/bin/pgpool 3794<br>
&gt;&gt;&gt; &gt;&gt; GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1<br>
&gt;&gt;&gt; &gt;&gt; [snip]<br>
&gt;&gt;&gt; &gt;&gt; Loaded symbols for /lib/x86_64-linux-gnu/libnss_<wbr>files.so.2<br>
&gt;&gt;&gt; &gt;&gt; __lll_lock_wait_private () at ../nptl/sysdeps/unix/sysv/linu<br>
&gt;&gt;&gt; x/x86_64/lowlevellock.S:95<br>
&gt;&gt;&gt; &gt;&gt; 95   ../nptl/sysdeps/unix/sysv/<wbr>linux/x86_64/lowlevellock.S:<br>
&gt;&gt;&gt; そのようなファイルやディレクトリはありません.<br>
&gt;&gt;&gt; &gt;&gt; (gdb) bt<br>
&gt;&gt;&gt; &gt;&gt; #0  __lll_lock_wait_private () at ../nptl/sysdeps/unix/sysv/linu<br>
&gt;&gt;&gt; x/x86_64/lowlevellock.S:95<br>
&gt;&gt;&gt; &gt;&gt; #1  0x00007f67fe20ccba in _L_lock_12808 () from<br>
&gt;&gt;&gt; /lib/x86_64-linux-gnu/libc.so.<wbr>6<br>
&gt;&gt;&gt; &gt;&gt; #2  0x00007f67fe20a6b5 in __GI___libc_malloc (bytes=15) at<br>
&gt;&gt;&gt; malloc.c:2887<br>
&gt;&gt;&gt; &gt;&gt; #3  0x00007f67fe21072a in __GI___strdup (s=0x7f67fe305dd8<br>
&gt;&gt;&gt; &quot;/etc/localtime&quot;) at strdup.c:42<br>
&gt;&gt;&gt; &gt;&gt; #4  0x00007f67fe239f51 in tzset_internal (always=&lt;optimized out&gt;,<br>
&gt;&gt;&gt; explicit=explicit@entry=1)<br>
&gt;&gt;&gt; &gt;&gt;     at tzset.c:444<br>
&gt;&gt;&gt; &gt;&gt; #5  0x00007f67fe23a913 in __tz_convert (timer=timer@entry=0x7ffce1c1b<br>
&gt;&gt;&gt; 7f8,<br>
&gt;&gt;&gt; &gt;&gt;     use_localtime=use_localtime@<wbr>entry=1, tp=tp@entry=0x7f67fe54bde0<br>
&gt;&gt;&gt; &lt;_tmbuf&gt;) at tzset.c:632<br>
&gt;&gt;&gt; &gt;&gt; #6  0x00007f67fe2387d1 in __GI_localtime (t=t@entry=0x7ffce1c1b7f8)<br>
&gt;&gt;&gt; at localtime.c:42<br>
&gt;&gt;&gt; &gt;&gt; #7  0x000000000045627b in log_line_prefix (buf=buf@entry=0x7ffce1c1b8d0,<br>
&gt;&gt;&gt; line_prefix=&lt;optimized out&gt;,<br>
&gt;&gt;&gt; &gt;&gt;     edata=&lt;optimized out&gt;) at ../../src/utils/error/elog.c:<wbr>2059<br>
&gt;&gt;&gt; &gt;&gt; #8  0x000000000045894d in send_message_to_server_log (edata=0x753320<br>
&gt;&gt;&gt; &lt;errordata&gt;)<br>
&gt;&gt;&gt; &gt;&gt;     at ../../src/utils/error/elog.c:<wbr>2084<br>
&gt;&gt;&gt; &gt;&gt; #9  EmitErrorReport () at ../../src/utils/error/elog.c:<wbr>1129<br>
&gt;&gt;&gt; &gt;&gt; #10 0x0000000000456d8e in errfinish (dummy=&lt;optimized out&gt;) at<br>
&gt;&gt;&gt; ../../src/utils/error/elog.c:<wbr>434<br>
&gt;&gt;&gt; &gt;&gt; #11 0x0000000000421f57 in die (sig=2) at protocol/child.c:925<br>
&gt;&gt;&gt; &gt;&gt; #12 &lt;signal handler called&gt;<br>
&gt;&gt;&gt; &gt;&gt; #13 _int_malloc (av=0x7f67fe546760 &lt;main_arena&gt;, bytes=4176) at<br>
&gt;&gt;&gt; malloc.c:3302<br>
&gt;&gt;&gt; &gt;&gt; #14 0x00007f67fe20a6c0 in __GI___libc_malloc (bytes=4176) at<br>
&gt;&gt;&gt; malloc.c:2891<br>
&gt;&gt;&gt; &gt;&gt; #15 0x000000000045561d in AllocSetAlloc (context=0xf90000, size=4128)<br>
&gt;&gt;&gt; at ../../src/utils/mmgr/aset.c:<wbr>674<br>
&gt;&gt;&gt; &gt;&gt; #16 0x000000000042cd1e in pool_init_cp () at<br>
&gt;&gt;&gt; protocol/pool_connection_pool.<wbr>c:70<br>
&gt;&gt;&gt; &gt;&gt; #17 0x0000000000423024 in do_child (fds=fds@entry=0xfa35c0) at<br>
&gt;&gt;&gt; protocol/child.c:194<br>
&gt;&gt;&gt; &gt;&gt; #18 0x00000000004086f5 in fork_a_child (fds=0xfa35c0, id=11) at<br>
&gt;&gt;&gt; main/pgpool_main.c:723<br>
&gt;&gt;&gt; &gt;&gt; #19 0x00000000004090cc in reaper () at main/pgpool_main.c:2427<br>
&gt;&gt;&gt; &gt;&gt; #20 0x000000000040d869 in PgpoolMain (discard_status=discard_<wbr>status@entry=1<br>
&gt;&gt;&gt; &#39;\001&#39;,<br>
&gt;&gt;&gt; &gt;&gt;     clear_memcache_oidmaps=clear_<wbr>memcache_oidmaps@entry=0 &#39;\000&#39;) at<br>
&gt;&gt;&gt; main/pgpool_main.c:457<br>
&gt;&gt;&gt; &gt;&gt; #21 0x0000000000406eb3 in main (argc=&lt;optimized out&gt;, argv=&lt;optimized<br>
&gt;&gt;&gt; out&gt;) at main/main.c:305<br>
&gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt; As you can see, the process was stuck while calling malloc().<br>
&gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt; pool_init_cp() was interrupted by SIGINT (because I hit the key), and<br>
&gt;&gt;&gt; &gt;&gt; the signal handler die() was called. In die(), elog() was<br>
&gt;&gt;&gt; &gt;&gt; called. elog() calls log_line_prefix(), which calls<br>
&gt;&gt;&gt; &gt;&gt; localtime(). localtime() calls malloc(), which seems to try to obtain<br>
&gt;&gt;&gt; &gt;&gt; a lock, then it causes a dead lock since pool_init_cp() was<br>
&gt;&gt;&gt; &gt;&gt; interrupted while calling malloc().<br>
&gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt; log_line_prefix() was copied from PostgreSQL but I see subtle<br>
&gt;&gt;&gt; &gt;&gt; differences from the PostgreSQL&#39;s original log_line_prefix().:<br>
&gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt; pg_strftime(strfbuf, sizeof(strfbuf),<br>
&gt;&gt;&gt; &gt;&gt;      &quot;%Y-%m-%d %H:%M:%S %Z&quot;,<br>
&gt;&gt;&gt; &gt;&gt;      pg_localtime(&amp;stamp_time, log_timezone));<br>
&gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt; Ours:<br>
&gt;&gt;&gt; &gt;&gt;      strftime(strbuf, 128, &quot;%Y-%m-%d %H:%M:%S&quot;, localtime(&amp;now));<br>
&gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt; Apparently the call stuck shows that the hang happened inside<br>
&gt;&gt;&gt; &gt;&gt; localtime() because it calls malloc(). On the other hand,<br>
&gt;&gt;&gt; &gt;&gt; pg_localtime() seems to avoid calling localtime() by using their home<br>
&gt;&gt;&gt; &gt;&gt; made version of localtime(), which does *not* call malloc(). I&#39;m not<br>
&gt;&gt;&gt; &gt;&gt; sure if it&#39;s a intention but it seems it&#39;d better to follow<br>
&gt;&gt;&gt; &gt;&gt; PostgreSQL&#39;s way to avoid the hang problem.<br>
&gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt; What do you think, Usama?<br>
&gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt; Best regards,<br>
&gt;&gt;&gt; &gt;&gt; --<br>
&gt;&gt;&gt; &gt;&gt; Tatsuo Ishii<br>
&gt;&gt;&gt; &gt;&gt; SRA OSS, Inc. Japan<br>
&gt;&gt;&gt; &gt;&gt; English: <a href="http://www.sraoss.co.jp/index_en.php" rel="noreferrer" target="_blank">http://www.sraoss.co.jp/index_<wbr>en.php</a><br>
&gt;&gt;&gt; &gt;&gt; Japanese:<a href="http://www.sraoss.co.jp" rel="noreferrer" target="_blank">http://www.sraoss.co.<wbr>jp</a><br>
&gt;&gt;&gt; &gt;&gt; ______________________________<wbr>_________________<br>
&gt;&gt;&gt; &gt;&gt; pgpool-hackers mailing list<br>
&gt;&gt;&gt; &gt;&gt; <a href="mailto:pgpool-hackers@pgpool.net">pgpool-hackers@pgpool.net</a><br>
&gt;&gt;&gt; &gt;&gt; <a href="http://www.pgpool.net/mailman/listinfo/pgpool-hackers" rel="noreferrer" target="_blank">http://www.pgpool.net/mailman/<wbr>listinfo/pgpool-hackers</a><br>
&gt;&gt;&gt; &gt; ______________________________<wbr>_________________<br>
&gt;&gt;&gt; &gt; pgpool-hackers mailing list<br>
&gt;&gt;&gt; &gt; <a href="mailto:pgpool-hackers@pgpool.net">pgpool-hackers@pgpool.net</a><br>
&gt;&gt;&gt; &gt; <a href="http://www.pgpool.net/mailman/listinfo/pgpool-hackers" rel="noreferrer" target="_blank">http://www.pgpool.net/mailman/<wbr>listinfo/pgpool-hackers</a><br>
&gt;&gt;&gt; ______________________________<wbr>_________________<br>
&gt;&gt;&gt; pgpool-hackers mailing list<br>
&gt;&gt;&gt; <a href="mailto:pgpool-hackers@pgpool.net">pgpool-hackers@pgpool.net</a><br>
&gt;&gt;&gt; <a href="http://www.pgpool.net/mailman/listinfo/pgpool-hackers" rel="noreferrer" target="_blank">http://www.pgpool.net/mailman/<wbr>listinfo/pgpool-hackers</a><br>
&gt;&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
</div></div></blockquote></div><br></div></div>