<div dir="ltr"><br><div class="gmail_extra">Dear Lars,</div><div class="gmail_extra"><br></div><div class="gmail_extra">Thank you for your kind reply.~</div><div class="gmail_extra"><br></div><div class="gmail_extra">Frankly speaking, I don&#39;t understand your comments clearly yet. </div><div class="gmail_extra">Let me check deeply our modification code, later.</div><div class="gmail_extra"><br></div><div class="gmail_extra">Anyway, I think you might have meet this situation if you did CASE-14 test.</div><div class="gmail_extra">Could you please test &quot;CASE-14 primary node hang by VM-net-disconnect during big file copy&quot;.</div><div class="gmail_extra">I think it&#39;s critical problem.</div><div class="gmail_extra"><br></div><div class="gmail_extra">I will wait for your good news.</div><div class="gmail_extra"><br></div><div class="gmail_extra">Thanks.</div><div class="gmail_extra"><br></div><div class="gmail_extra"><br><div class="gmail_quote">2016-02-15 22:54 GMT+09:00 Lars Ellenberg <span dir="ltr">&lt;<a href="mailto:lars.ellenberg@linbit.com" target="_blank">lars.ellenberg@linbit.com</a>&gt;</span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><div>On Sun, Feb 14, 2016 at 07:39:36PM +0900, 김재헌 wrote:<br>
&gt; Dear Philipp,<br>
&gt;<br>
&gt; Please check my previous question of CASE-14(&quot;[DRBD-user] [CASE-14] primary<br>
&gt; node hang by VM-net-disconnect during big file copy&quot;).<br>
&gt; According to this case, Linux drbd deadlock may occur.<br>
&gt; On the other hand, Windows side there is no deadlock but sometimes the<br>
&gt; transfer_log  list is broken in _tl_restart function.<br>
&gt;<br>
&gt; So, We are trying to modify the source code as follows:<br>
&gt;<br>
&gt; 1. Modifications<br>
&gt;<br>
&gt; 1) in drbd_send_and_submit()<br>
&gt;<br>
&gt; if (likely(req-&gt;i.size != 0)) {<br>
&gt; if (rw == WRITE) {<br>
&gt; struct drbd_request *req2;<br>
&gt; resource-&gt;current_tle_writes++;<br>
&gt; #if 0 // WIN32 ### ignore tail_recursion ###<br>
&gt; list_for_each_entry_reverse(req2, &amp;resource-&gt;transfer_log, tl_requests) {<br>
&gt; if (req2-&gt;rq_state[0] &amp; RQ_WRITE) {<br>
&gt; /* Make the new write request depend on<br>
&gt; * the previous one. */<br>
&gt; kref_get(&amp;req-&gt;kref);<br>
&gt; break;<br>
&gt; }<br>
&gt; }<br>
&gt; #endif<br>
&gt; }<br>
&gt;<br>
&gt; list_add_tail(&amp;req-&gt;tl_requests, &amp;resource-&gt;transfer_log);<br>
&gt; }<br>
&gt;<br>
&gt;<br>
&gt; 2) in drbd_req_destroy()<br>
&gt;<br>
&gt; if (s &amp; RQ_WRITE &amp;&amp; req_size) {<br>
&gt; list_for_each_entry(req, &amp;device-&gt;resource-&gt;transfer_log, tl_requests) {<br>
&gt; if (req-&gt;rq_state[0] &amp; RQ_WRITE) {<br>
&gt; /*<br>
&gt; * Do the equivalent of:<br>
&gt; *   kref_put(&amp;req-&gt;kref, drbd_req_destroy)<br>
&gt; * without recursing into the destructor.<br>
&gt; */<br>
&gt; #if 0  // WIN32 ### ignore tail_recursion ###<br>
&gt; if (atomic_dec_and_test(&amp;req-&gt;kref.refcount))<br>
&gt; goto tail_recursion;<br>
&gt; #endif<br>
&gt; break;<br>
&gt; }<br>
&gt; }<br>
&gt; }<br>
&gt;<br>
&gt;<br>
&gt; 2. Questions<br>
&gt;<br>
&gt; 1) This part of &quot;tail_recursion&quot; is a new design on verson 9.<br>
&gt;      Is this essential operation?<br>
&gt;      I mean, what do you think about my ignoring tail_recursion part for<br>
&gt; temporary workaround?<br>
<br>
</div></div>I cannot explain all the implications within two lines of text, but we<br>
want the &quot;destruction&quot; of drbd_requests to happen in the order they have<br>
been put on the transfer log.<br>
That is important in some multi-peer scenarios.<br>
<br>
If there is no explicit dependency (here implemented via kref), they<br>
could be destroyed out-of-order, and that could lead to bad decisions<br>
elsewhere, or potentially not enough being resynced in some scenarios.<br>
<span><br>
&gt; 2)   And what is the reason for the marking of &quot;kref_get(&amp;req-&gt;kref);&quot;  in<br>
&gt; drbd_send_and_submit and processing with recursion in  drbd_req_destroy<br>
&gt; later?<br>
<br>
</span>see above.<br>
<span><br>
&gt; 3) On Windows side, we ignore this part(see source code of &quot;#if 0 // WIN32<br>
&gt; ### ignore tail_recursion ###&quot;).<br>
&gt;      Anyway, after ignore, Windows drbd engine works well, till now.  Is<br>
&gt; there any problem?<br>
<br>
</span>see above.<br>
<span><br>
&gt; On Linux side, you cannot see this list-crash-case because the CASE-14 test<br>
&gt; may be done by deadlock first.<br>
&gt; Please check the CASE-14 deadlock case first and then check this CASE-20.<br>
<br>
</span>Cheers,<br>
<br>
        Lars<br>
<br>
</blockquote></div><div><div dir="ltr"><div><div dir="ltr"><p style="margin:0cm 0cm 0.0001pt;line-height:21px"><span lang="EN-US" style="font-size:8pt;line-height:16px;font-family:&#39;\00b9d1\00c740  \00ace0\00b515&#39;;color:rgb(127,127,127)"><br></span></p></div></div></div></div>
</div></div>