<div dir="ltr">Thanks for this, github works for review right now :-)<div><br></div><div>I am occupied till Wednesday, and will review them by this week. A glance on the changes looks good to me.</div><div><br></div><div>Few tests which can run for validations are :</div><div><br></div><div><pre class="gmail-console-output" style="box-sizing:border-box;white-space:pre-wrap;margin-top:0px;margin-bottom:0px;color:rgb(51,51,51);font-size:14px">tests/bugs/shard/bug-1696136-lru-limit-equals-deletion-rate.t</pre><pre class="gmail-console-output" style="box-sizing:border-box;white-space:pre-wrap;margin-top:0px;margin-bottom:0px;color:rgb(51,51,51);font-size:14px"><pre class="gmail-console-output" style="box-sizing:border-box;white-space:pre-wrap;margin-top:0px;margin-bottom:0px">tests/features/fuse-lru-limit.t</pre><pre class="gmail-console-output" style="box-sizing:border-box;white-space:pre-wrap;margin-top:0px;margin-bottom:0px">tests/bugs/shard/shard-inode-refcount-test.t</pre><pre class="gmail-console-output" style="box-sizing:border-box;white-space:pre-wrap;margin-top:0px;margin-bottom:0px"><br></pre><pre class="gmail-console-output" style="box-sizing:border-box;white-space:pre-wrap;margin-top:0px;margin-bottom:0px">Ideal is to run the full regression with `./run-tests.sh -c` </pre><pre class="gmail-console-output" style="box-sizing:border-box;white-space:pre-wrap;margin-top:0px;margin-bottom:0px"><br></pre><pre class="gmail-console-output" style="box-sizing:border-box;white-space:pre-wrap;margin-top:0px;margin-bottom:0px">Regards,</pre><pre class="gmail-console-output" style="box-sizing:border-box;white-space:pre-wrap;margin-top:0px;margin-bottom:0px">Amar</pre></pre></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Nov 4, 2019 at 9:21 AM Changwei Ge &lt;<a href="mailto:chge@linux.alibaba.com">chge@linux.alibaba.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi Amar,<br>
<br>
On 2019/10/31 6:30 下午, Amar Tumballi wrote:<br>
&gt; <br>
&gt; <br>
&gt; On Wed, Oct 30, 2019 at 4:32 PM Xavi Hernandez &lt;<a href="mailto:jahernan@redhat.com" target="_blank">jahernan@redhat.com</a> <br>
&gt; &lt;mailto:<a href="mailto:jahernan@redhat.com" target="_blank">jahernan@redhat.com</a>&gt;&gt; wrote:<br>
&gt; <br>
&gt;     Hi Changwei,<br>
&gt; <br>
&gt;     On Tue, Oct 29, 2019 at 7:56 AM Changwei Ge &lt;<a href="mailto:chge@linux.alibaba.com" target="_blank">chge@linux.alibaba.com</a><br>
&gt;     &lt;mailto:<a href="mailto:chge@linux.alibaba.com" target="_blank">chge@linux.alibaba.com</a>&gt;&gt; wrote:<br>
&gt; <br>
&gt;         Hi,<br>
&gt; <br>
&gt;         I am recently working on reducing inode_[un]ref() locking<br>
&gt;         contention by<br>
&gt;         getting rid of inode table lock. Just use inode lock to protect<br>
&gt;         inode<br>
&gt;         REF. I have already discussed a couple rounds with several<br>
&gt;         Glusterfs<br>
&gt;         developers via emails and Gerrit and basically get understood on<br>
&gt;         major<br>
&gt;         logic around.<br>
&gt; <br>
&gt;         Currently, inode REF can be ZERO and be reused by increasing it<br>
&gt;         to ONE.<br>
&gt;         This is IMO why we have to burden so much work for inode table when<br>
&gt;         REF/UNREF. It makes inode [un]ref() and inode table and<br>
&gt;         dentries(alias)<br>
&gt;         searching hard to run concurrently.<br>
&gt; <br>
&gt;         So my question is in what cases, how can we find a inode whose<br>
&gt;         REF is ZERO?<br>
&gt; <br>
&gt;         As Glusterfs store its inode memory address into kernel/fuse,<br>
&gt;         can we<br>
&gt;         conclude that only fuse_ino_to_inode() can bring back a REF=0 inode?<br>
&gt; <br>
&gt; <br>
&gt; Xavi&#39;s answer below provides some insights. and same time, assuming that <br>
&gt; only fuse_ino_to_inode() can bring back inode from ref=0 state (for <br>
&gt; now), is a good start.<br>
&gt; <br>
&gt; <br>
&gt;     Yes, when an inode gets refs = 0, it means that gluster code is not<br>
&gt;     using it anywhere, so it cannot be referenced again unless kernel<br>
&gt;     sends new requests on the same inode. Once refs=0 and nlookup=0, the<br>
&gt;     inode can be destroyed.<br>
&gt; <br>
&gt;     Inode code is quite complex right now and I haven&#39;t had time to<br>
&gt;     investigate this further, but I think we could simplify inode<br>
&gt;     management significantly (specially unref) if we add a reference<br>
&gt;     when nlookup becomes &gt; 0, and remove a reference when<br>
&gt;     nlookup becomes 0 again. Maybe with this approach we could avoid<br>
&gt;     inode table lock in many cases. However we need to make sure we<br>
&gt;     correctly handle invalidation logic to keep inode table size under<br>
&gt;     control.<br>
&gt; <br>
&gt; <br>
&gt; My suggestion is, don&#39;t wait for a complete solution for posting the <br>
&gt; patch. Let us get a chance to have a look at WorkInProgress patches, so <br>
&gt; we can have discussions on code itself. It would help to reach better <br>
&gt; solutions sooner.<br>
<br>
Agree.<br>
<br>
I have almost implemented my draft design for this experiment.<br>
The immature code has been pushed to my personal Glusterfs repo[1].<br>
<br>
Now it&#39;s a single large patch, I will split it to patches when I decide <br>
to push it to Gerrit for review convenience. If you prefer to push it to <br>
Gerrit for a early review and discussion, I can do that :-). But I am <br>
still doing some debug stuff.<br>
<br>
My work includes:<br>
<br>
1. Move inode refing and unrefing logic unrelated logic out from <br>
`__inode_[un]ref()` hence to reduce their arguments.<br>
2. Add a specific ‘ref_lock’ to inode to keep ref/unref atomicity.<br>
3. As `inode_table::active_size` is only used for debug purpose, convert <br>
it to atomic variable.<br>
4. Factor out pruning inode.<br>
5. In order to run inode search and grep run concurrently, firstly  use <br>
RDLOCK  and then convert it WRLOCK if necessary.<br>
6. Inode table lock is not necessary for inode ref/unref unless we have <br>
to move it between table lists.<br>
<br>
etc...<br>
<br>
Any comments, ideas, suggestions are kindly welcomed.<br>
<br>
Thanks,<br>
Changwei<br>
<br>
[1]:<br>
<a href="https://github.com/changweige/glusterfs/commit/d7226d2458281212af19ec8c2ca3d8c8caae1330" rel="noreferrer" target="_blank">https://github.com/changweige/glusterfs/commit/d7226d2458281212af19ec8c2ca3d8c8caae1330</a><br>
<br>
&gt; <br>
&gt;     Regards,<br>
&gt; <br>
&gt;     Xavi<br>
&gt; <br>
&gt; <br>
&gt; <br>
&gt;         Thanks,<br>
&gt;         Changwei<br>
&gt;         _______________________________________________<br>
&gt; <br>
&gt;         Community Meeting Calendar:<br>
&gt; <br>
&gt;         APAC Schedule -<br>
&gt;         Every 2nd and 4th Tuesday at 11:30 AM IST<br>
&gt;         Bridge: <a href="https://bluejeans.com/118564314" rel="noreferrer" target="_blank">https://bluejeans.com/118564314</a><br>
&gt; <br>
&gt;         NA/EMEA Schedule -<br>
&gt;         Every 1st and 3rd Tuesday at 01:00 PM EDT<br>
&gt;         Bridge: <a href="https://bluejeans.com/118564314" rel="noreferrer" target="_blank">https://bluejeans.com/118564314</a><br>
&gt; <br>
&gt;         Gluster-devel mailing list<br>
&gt;         <a href="mailto:Gluster-devel@gluster.org" target="_blank">Gluster-devel@gluster.org</a> &lt;mailto:<a href="mailto:Gluster-devel@gluster.org" target="_blank">Gluster-devel@gluster.org</a>&gt;<br>
&gt;         <a href="https://lists.gluster.org/mailman/listinfo/gluster-devel" rel="noreferrer" target="_blank">https://lists.gluster.org/mailman/listinfo/gluster-devel</a><br>
&gt; <br>
</blockquote></div>