<!-- 
RSS generated by JIRA (9.4.14#940014-sha1:734e6822bbf0d45eff9af51f82432957f73aa32c) at Sat Feb 10 02:42:22 UTC 2024

It is possible to restrict the fields that are returned in this document by specifying the 'field' parameter in your request.
For example, to request only the issue key and summary append 'field=key&field=summary' to the URL of your request.
-->
<rss version="0.92" >
<channel>
    <title>Whamcloud Community JIRA</title>
    <link>https://jira.whamcloud.com</link>
    <description>This file is an XML representation of an issue</description>
    <language>en-us</language>    <build-info>
        <version>9.4.14</version>
        <build-number>940014</build-number>
        <build-date>05-12-2023</build-date>
    </build-info>


<item>
            <title>[LU-11264] llapi_* routines demonstrate poor performance</title>
                <link>https://jira.whamcloud.com/browse/LU-11264</link>
                <project id="10000" key="LU">Lustre</project>
                    <description>&lt;p&gt;I&apos;m going to bug Cray about this but Andreas said&#160; &quot;we can&apos;t fix problems that aren&apos;t in Jira&quot; so here I am.&lt;/p&gt;

&lt;p&gt;In the old days one would get striping information via an ioctl:&lt;/p&gt;

&lt;p&gt;&#160;&#160;&#160;&lt;/p&gt;
&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;
struct lov_user_md *lum;
&#160;&#160;&#160; size_t lumsize = sizeof(struct lov_user_md) +LOV_MAX_STRIPE_COUNT * sizeof(struct lov_user_ost_data);
&#160;&#160;&#160; lum-&amp;gt;lmm_magic = LOV_USER_MAGIC;
&#160;&#160;&#160; ret = ioctl( fd, LL_IOC_LOV_GETSTRIPE, (void *)lum );
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&#160;&lt;/p&gt;

&lt;p&gt;&#160;&lt;/p&gt;

&lt;p&gt;Then the llapi_ routines showed up:&lt;/p&gt;

&lt;p&gt;&#160;&lt;/p&gt;
&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;
&#160;&#160; ret = llapi_file_get_stripe(opt_file, lum);&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;and even more sophisticated llapi_layout_ routines:&lt;/p&gt;

&lt;p&gt;&#160;&lt;/p&gt;
&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;
struct llapi_layout *layout;
 layout = llapi_layout_get_by_fd(fd, 0);
 llapi_layout_stripe_count_get(layout, &amp;amp;(lum-&amp;gt;lmm_stripe_count));
 llapi_layout_stripe_size_get(layout, &amp;amp;(lum-&amp;gt;lmm_stripe_size));
 llapi_layout_ost_index_get(layout, 0, &amp;amp;(lum-&amp;gt;lmm_stripe_offset));
&#160;
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&#160;&lt;/p&gt;

&lt;p&gt;I haven&apos;t done a full scaling run, but small scale tests don&apos;t look great for the newer interfaces.&#160;&#160; Average time to get the stripe size for a 2 node 128 process MPI job:&lt;/p&gt;

&lt;p&gt;ioctl:&#160;&#160; 17.2 ms&lt;/p&gt;

&lt;p&gt;llapi_file_get_stripe: 142.0 ms&lt;/p&gt;

&lt;p&gt;llapi_layout:&#160; 2220 ms&lt;/p&gt;

&lt;p&gt;&#160;&lt;/p&gt;

&lt;p&gt;Wow!&#160; I want to use the new interfaces but these overheads are bonkers.&lt;/p&gt;

&lt;p&gt;&#160;&lt;/p&gt;</description>
                <environment>Argonne&amp;#39;s Theta machine is a Cray running lustre: 2.7.3.74&lt;br/&gt;
kernel: patchless_client&lt;br/&gt;
build:  2.7.3.74 </environment>
        <key id="53008">LU-11264</key>
            <summary>llapi_* routines demonstrate poor performance</summary>
                <type id="4" iconUrl="https://jira.whamcloud.com/secure/viewavatar?size=xsmall&amp;avatarId=11310&amp;avatarType=issuetype">Improvement</type>
                                            <priority id="3" iconUrl="https://jira.whamcloud.com/images/icons/priorities/major.svg">Major</priority>
                        <status id="1" iconUrl="https://jira.whamcloud.com/images/icons/statuses/open.png" description="The issue is open and ready for the assignee to start work on it.">Open</status>
                    <statusCategory id="2" key="new" colorName="default"/>
                                    <resolution id="-1">Unresolved</resolution>
                                        <assignee username="wc-triage">WC Triage</assignee>
                                    <reporter username="robl">Robert Latham</reporter>
                        <labels>
                    </labels>
                <created>Fri, 17 Aug 2018 15:23:43 +0000</created>
                <updated>Thu, 14 Sep 2023 04:50:19 +0000</updated>
                                                                                <due></due>
                            <votes>0</votes>
                                    <watches>6</watches>
                                                                            <comments>
                            <comment id="232130" author="robl" created="Fri, 17 Aug 2018 15:27:49 +0000"  >&lt;p&gt;I attached a graph of a scaling experiment on NERSC&apos;s Cray Lustre deployment on Cori from I think two years ago.&#160; The problem is not a recent regression.&lt;/p&gt;</comment>
                            <comment id="233183" author="paf" created="Fri, 7 Sep 2018 20:14:55 +0000"  >&lt;p&gt;Robert,&lt;/p&gt;

&lt;p&gt;I&apos;m a Cray person, but I&apos;ll discuss this here so as not to leave the Whamcloud guys in the cold.&lt;/p&gt;

&lt;p&gt;What exactly are you measuring?&#160; Is this execution time of the function directly, within a binary, or is it execution time of an entire binary containing just this function call?&lt;/p&gt;

&lt;p&gt;Can you share whatever your test code is here?&#160; Just to make our lives easier.&lt;/p&gt;

&lt;p&gt;A few more thoughts/questions.&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;The llapi_file_get_stripe function you selected is &lt;b&gt;not&lt;/b&gt; a direct equivalent of that ioctl.&#160; It also has to open() the file.&#160; So that may be a source of some of the overhead.&lt;/li&gt;
	&lt;li&gt;Which of the llapi_layout functions is taking that much time?&#160; You don&apos;t specify.&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;Those last three functions (stripe_count_get, stripe_size_get, and ost_index_get) literally just access pointers in the memory given, so if they&apos;re taking milliseconds by themselves...&lt;/p&gt;

&lt;p&gt;&#160;&lt;/p&gt;</comment>
                            <comment id="233184" author="paf" created="Fri, 7 Sep 2018 20:15:45 +0000"  >&lt;p&gt;Also, can you compare execution time from one thread?&#160; If it&apos;s really as bad as your measurements indicate, it should be straightforward to do so.&lt;/p&gt;</comment>
                            <comment id="233187" author="robl" created="Fri, 7 Sep 2018 21:28:11 +0000"  >&lt;p&gt;I attached the test program I used.&#160; it&apos;s testing a bunch of different things but to get the routines in this test case:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;ioctl to get information: llapi-perf -i LUSTRE_FILE&lt;/li&gt;
	&lt;li&gt;llapi_file_get_stripe  :       llapi-perf -a LUSTRE_FILE&lt;/li&gt;
	&lt;li&gt;llapi_layout_get_by_fd:  llapi_perf -A LUSTRE_FILE&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Absolutely agreed that llapi_file_get_stripe should be expensive since it is operating on a filename.  Was astonished to see llapi_layout aproach took so long considering it operates on the fd directly.&lt;/p&gt;

&lt;p&gt;I assumed the initial llapi_layout_get_by_fd call took all the time, but I was measuring the time to call the four routines together &amp;#8211; after all, there&apos;s no reason for an application to just call get_by_fd. &lt;br/&gt;
I&apos;ll add some finer grained timing information and re-run the experiment&lt;br/&gt;
&#160;&lt;/p&gt;</comment>
                            <comment id="233188" author="paf" created="Fri, 7 Sep 2018 21:32:50 +0000"  >&lt;p&gt;Thanks, Rob - I actually just grabbed your test and did a bunch of testing myself.&lt;/p&gt;

&lt;p&gt;I see a really wildly large gap even with 1 process - interesting.&lt;/p&gt;

&lt;p&gt;This is with debug turned on, on a small VM setup:&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;error&quot;&gt;&amp;#91;root@cent7c01 cent7s01&amp;#93;&lt;/span&gt;# rm -f testfile; lctl clear; mpirun --allow-run-as-root -n 1 /tmp/a.out -c -i testfile; lctl dk &amp;gt; /tmp/out3&lt;br/&gt;
 opt_file: testfile, opt_create: 1, opt_fstat: 0, opt_lseek: 0, opt_realpath: 0, opt_llapi: 0, opt_ioctl: 1, opt_fpp: 0, opt_llapi_fd: 0, nprocs: 1, time: 2.622000 ms&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;error&quot;&gt;&amp;#91;root@cent7c01 cent7s01&amp;#93;&lt;/span&gt;# rm -f testfile; lctl clear; mpirun --allow-run-as-root -n 1 /tmp/a.out -c -a testfile; lctl dk &amp;gt; /tmp/out&lt;br/&gt;
 opt_file: testfile, opt_create: 1, opt_fstat: 0, opt_lseek: 0, opt_realpath: 0, opt_llapi: 1, opt_ioctl: 0, opt_fpp: 0, opt_llapi_fd: 0, nprocs: 1, time: 3.715000 ms&lt;br/&gt;
 &lt;span class=&quot;error&quot;&gt;&amp;#91;root@cent7c01 cent7s01&amp;#93;&lt;/span&gt;# rm -f testfile; lctl clear; mpirun --allow-run-as-root -n 1 /tmp/a.out -c -A testfile; lctl dk &amp;gt; /tmp/out2&lt;br/&gt;
 opt_file: testfile, opt_create: 1, opt_fstat: 0, opt_lseek: 0, opt_realpath: 0, opt_llapi: 0, opt_ioctl: 0, opt_fpp: 0, opt_llapi_fd: 1, nprocs: 1, time: 5.026000 ms&lt;/p&gt;

&lt;p&gt;So that&apos;s &quot;ioctl&quot; at 2.6 ms&lt;/p&gt;

&lt;p&gt;Get_stripe at 3.7 ms&lt;br/&gt;
 And&lt;br/&gt;
 get_by_fd at 5.0 ms&lt;/p&gt;

&lt;p&gt;That&apos;s... wild.&#160; I&apos;ll try to dig in later.&lt;/p&gt;

&lt;p&gt;EDIT:&lt;br/&gt;
My previous comment about no additional server communications was wrong; had an error in my data collection.&lt;/p&gt;

&lt;p&gt;The simple create+ioctl does 2, one of which is close().&lt;/p&gt;

&lt;p&gt;The llapi_get_stripe function does 3 (create, some sort of get, then close).&lt;/p&gt;

&lt;p&gt;The layout get function does 4&lt;img class=&quot;emoticon&quot; src=&quot;https://jira.whamcloud.com/images/icons/emoticons/warning.png&quot; height=&quot;16&quot; width=&quot;16&quot; align=&quot;absmiddle&quot; alt=&quot;&quot; border=&quot;0&quot;/&gt;.&lt;/p&gt;

&lt;p&gt;I&apos;ve got some ideas why - I&apos;ll take a further look next week.&lt;/p&gt;</comment>
                            <comment id="233189" author="robl" created="Fri, 7 Sep 2018 21:35:16 +0000"  >&lt;p&gt;oh yeah, lots of variance in these tests.  It&apos;s not statistically rigorous but above numbers came from me running each test 5 times and reporting an average.&lt;/p&gt;</comment>
                            <comment id="233249" author="paf" created="Mon, 10 Sep 2018 16:29:16 +0000"  >&lt;p&gt;Robert,&lt;/p&gt;

&lt;p&gt;Here&apos;s the problem in a nutshell.&lt;/p&gt;

&lt;p&gt;lfs getstripe asks the client for the stripe count information that it has locally, and gets it locally if it&apos;s present.&#160; This is fast because that information is generally already cached locally when the file is open.&lt;/p&gt;

&lt;p&gt;The other two functions do not ask the client for the layout, as such - Instead, the ioctl they use actually directly reads the layout extended attribute from the MDS.&#160; This read of an extended attribute cannot be satisfied by the layout information held in memory on the client (which it usually has if the file is open), instead, it goes directly to the MDS.&lt;/p&gt;

&lt;p&gt;The solution would be to rewrite the implementation of those new ioctls to get the layout that the client has in memory and request it if it&apos;s not present.&lt;/p&gt;</comment>
                            <comment id="233250" author="paf" created="Mon, 10 Sep 2018 16:29:34 +0000"  >&lt;p&gt;By the way, thanks for your quick reply last week.&lt;/p&gt;</comment>
                            <comment id="248087" author="adilger" created="Fri, 31 May 2019 01:19:06 +0000"  >&lt;p&gt;I just happened to be looking at this code on the &lt;tt&gt;setstripe&lt;/tt&gt; side and see a number of places where it could be optimized. Running a simple test comparing &lt;tt&gt;lfs setstripe&lt;/tt&gt; with &lt;tt&gt;touch&lt;/tt&gt; and &lt;tt&gt;createmany&lt;/tt&gt; shows a big difference in performance (files removed between each test):&lt;/p&gt;
&lt;div class=&quot;preformatted panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;preformattedContent panelContent&quot;&gt;
&lt;pre&gt;$ time lfs setstripe -c 1 /myth/tmp/tmp/f{1..1000} :  real: 0m11.089s, user: 0m0.115s, sys: 0m2.132s
$ time touch /myth/tmp/tmp/f{1..1000}              :  real:  0m6.400s, user: 0m0.018s, sys: 0m0.863s
$ time createmany -o /myth/tmp/tmp/f    1000       :  real:  0m2.329s, user: 0m0.008s, sys: 0m0.185s
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;It is pretty clear from the elapsed time and the system time that &lt;tt&gt;lfs setstripe&lt;/tt&gt; is doing a lot more stuff for each file create compared to the others (&lt;tt&gt;touch&lt;/tt&gt; is additionally setting the timestamps). Looking at the &lt;tt&gt;strace&lt;/tt&gt; of &lt;tt&gt;lfs setstripe -c1&lt;/tt&gt; on a client shows what is going on:&lt;/p&gt;
&lt;div class=&quot;preformatted panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;preformattedContent panelContent&quot;&gt;
&lt;pre&gt;gettid()                                = 3237
open(&quot;/dev/urandom&quot;, O_RDONLY|O_NOFOLLOW) = 3
read(3, &quot;Fg#\306&quot;, 4)                   = 4
close(3)                                = 0
lstat(&quot;/myth&quot;, {st_mode=S_IFDIR|0755, st_size=12288, ...}) = 0
lstat(&quot;/myth/tmp&quot;, {st_mode=S_IFDIR|S_ISVTX|0777, st_size=4096, ...}) = 0
lstat(&quot;/myth/tmp/tmp&quot;, {st_mode=S_IFDIR|0775, st_size=53248, ...}) = 0
lstat(&quot;/myth/tmp/tmp/foo&quot;, 0x7ffe9dc99410) = -1 ENOENT (No such file or directory)
lstat(&quot;/myth&quot;, {st_mode=S_IFDIR|0755, st_size=12288, ...}) = 0
lstat(&quot;/myth/tmp&quot;, {st_mode=S_IFDIR|S_ISVTX|0777, st_size=4096, ...}) = 0
lstat(&quot;/myth/tmp/tmp&quot;, {st_mode=S_IFDIR|0775, st_size=53248, ...}) = 0
lstat(&quot;/myth/tmp/tmp/foo&quot;, 0x7ffe9dc99410) = -1 ENOENT (No such file or directory)
lstat(&quot;/myth&quot;, {st_mode=S_IFDIR|0755, st_size=12288, ...}) = 0
lstat(&quot;/myth/tmp&quot;, {st_mode=S_IFDIR|S_ISVTX|0777, st_size=4096, ...}) = 0
lstat(&quot;/myth/tmp/tmp&quot;, {st_mode=S_IFDIR|0775, st_size=53248, ...}) = 0
open(&quot;/proc/mounts&quot;, O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
read(3, &quot;rootfs / rootfs rw 0 0\nproc /pro&quot;..., 1024) = 1024
read(3, &quot;tmp ext4 ro,relatime,barrier=1,d&quot;..., 1024) = 88
read(3, &quot;&quot;, 1024)                       = 0
close(3)                                = 0
open(&quot;/myth/tmp/tmp/foo&quot;, O_WRONLY|O_CREAT|O_LOV_DELAY_CREATE, 0644) = 3
ioctl(3, LL_IOC_LOV_SETSTRIPE, 0x942060)          = 0
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Firstly, it appears that &lt;tt&gt;liblustreapi_init()&lt;/tt&gt; function is always doing some work to initialize the PRNG, but this PRNG is only used in a small number of cases. This initialization can be skipped unless the PRNG is actually needed in particular functions, even though it is only a one-time thing it is still needless overhead.&lt;/p&gt;

&lt;p&gt;More importantly, it is doing multiple traversals of the full pathname (bad) to do &lt;tt&gt;realpath()&lt;/tt&gt; on the filename and processing &lt;tt&gt;/proc/mounts&lt;/tt&gt; for each file to determine if the file is on a Lustre filesystem or not. IMHO, it should be enough to return an error from &lt;tt&gt;ioctl(LL_IOC_LOV_SETSTRIPE)&lt;/tt&gt; to determine that the file is not on a Lustre filesystem, or if that is really deemed necessary we can do &lt;tt&gt;statfs()&lt;/tt&gt; on the directory and check the magic without doing dozens of syscalls.&lt;/p&gt;

&lt;p&gt;There is also extra overhead if a pool name is specified to verify that it is valid that could be a one-time check for repeated use of the same pool(s), and to verify the &lt;tt&gt;stripe_size &amp;gt;= PAGE_SIZE&lt;/tt&gt;, where again the &lt;tt&gt;PAGE_SIZE&lt;/tt&gt; does not change from one file to the next.&lt;/p&gt;

&lt;p&gt;Finally, I observe in the debug logs that between &lt;tt&gt;open(O_LOV_DELAY_CREATE)&lt;/tt&gt; and &lt;tt&gt;ioctl(LL_IOC_LOV_SETSTRIPE)&lt;/tt&gt; there is a DLM lock callback from the MDS to the client for the layout&#160; lock (I think). It doesn&apos;t make sense to grant the &lt;tt&gt;MDS_INODELOCK_LAYOUT&lt;/tt&gt; lock to the client opening with &lt;tt&gt;O_LOV_DELAY_CREATE&lt;/tt&gt;, when we know the client will immediately be changing it.&lt;/p&gt;</comment>
                            <comment id="248183" author="gerrit" created="Sat, 1 Jun 2019 05:03:17 +0000"  >&lt;p&gt;Andreas Dilger (adilger@whamcloud.com) uploaded a new patch: &lt;a href=&quot;https://review.whamcloud.com/35028&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;https://review.whamcloud.com/35028&lt;/a&gt;&lt;br/&gt;
Subject: &lt;a href=&quot;https://jira.whamcloud.com/browse/LU-11264&quot; title=&quot;llapi_* routines demonstrate poor performance&quot; class=&quot;issue-link&quot; data-issue-key=&quot;LU-11264&quot;&gt;LU-11264&lt;/a&gt; utils: avoid pool overhead in lfs setstripe&lt;br/&gt;
Project: fs/lustre-release&lt;br/&gt;
Branch: master&lt;br/&gt;
Current Patch Set: 1&lt;br/&gt;
Commit: e1246538418d2b58f5457d91956c7c75a9fb1153&lt;/p&gt;</comment>
                            <comment id="248617" author="gerrit" created="Fri, 7 Jun 2019 03:48:04 +0000"  >&lt;p&gt;Andreas Dilger (adilger@whamcloud.com) uploaded a new patch: &lt;a href=&quot;https://review.whamcloud.com/35091&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;https://review.whamcloud.com/35091&lt;/a&gt;&lt;br/&gt;
Subject: &lt;a href=&quot;https://jira.whamcloud.com/browse/LU-11264&quot; title=&quot;llapi_* routines demonstrate poor performance&quot; class=&quot;issue-link&quot; data-issue-key=&quot;LU-11264&quot;&gt;LU-11264&lt;/a&gt; llapi: reduce llapi_stripe_limit_check() overhead&lt;br/&gt;
Project: fs/lustre-release&lt;br/&gt;
Branch: master&lt;br/&gt;
Current Patch Set: 1&lt;br/&gt;
Commit: dfea5bd239531a91d19f603945601e39f9254f84&lt;/p&gt;</comment>
                            <comment id="249529" author="gerrit" created="Thu, 20 Jun 2019 03:52:54 +0000"  >&lt;p&gt;Oleg Drokin (green@whamcloud.com) merged in patch &lt;a href=&quot;https://review.whamcloud.com/35091/&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;https://review.whamcloud.com/35091/&lt;/a&gt;&lt;br/&gt;
Subject: &lt;a href=&quot;https://jira.whamcloud.com/browse/LU-11264&quot; title=&quot;llapi_* routines demonstrate poor performance&quot; class=&quot;issue-link&quot; data-issue-key=&quot;LU-11264&quot;&gt;LU-11264&lt;/a&gt; llapi: reduce llapi_stripe_limit_check() overhead&lt;br/&gt;
Project: fs/lustre-release&lt;br/&gt;
Branch: master&lt;br/&gt;
Current Patch Set: &lt;br/&gt;
Commit: 1c8ce141c6b6b621cf0fc89d32e1e7a2db43729d&lt;/p&gt;</comment>
                            <comment id="251183" author="gerrit" created="Fri, 12 Jul 2019 05:19:33 +0000"  >&lt;p&gt;Oleg Drokin (green@whamcloud.com) merged in patch &lt;a href=&quot;https://review.whamcloud.com/35092/&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;https://review.whamcloud.com/35092/&lt;/a&gt;&lt;br/&gt;
Subject: &lt;a href=&quot;https://jira.whamcloud.com/browse/LU-11264&quot; title=&quot;llapi_* routines demonstrate poor performance&quot; class=&quot;issue-link&quot; data-issue-key=&quot;LU-11264&quot;&gt;LU-11264&lt;/a&gt; llapi: clean up llapi_search_tgt() code&lt;br/&gt;
Project: fs/lustre-release&lt;br/&gt;
Branch: master&lt;br/&gt;
Current Patch Set: &lt;br/&gt;
Commit: 096db80e0810b4abb8e268a58623c23bf0b57d2c&lt;/p&gt;</comment>
                            <comment id="252825" author="gerrit" created="Fri, 9 Aug 2019 04:39:36 +0000"  >&lt;p&gt;Oleg Drokin (green@whamcloud.com) merged in patch &lt;a href=&quot;https://review.whamcloud.com/35093/&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;https://review.whamcloud.com/35093/&lt;/a&gt;&lt;br/&gt;
Subject: &lt;a href=&quot;https://jira.whamcloud.com/browse/LU-11264&quot; title=&quot;llapi_* routines demonstrate poor performance&quot; class=&quot;issue-link&quot; data-issue-key=&quot;LU-11264&quot;&gt;LU-11264&lt;/a&gt; llapi: clean up llapi_file_create_foreign()&lt;br/&gt;
Project: fs/lustre-release&lt;br/&gt;
Branch: master&lt;br/&gt;
Current Patch Set: &lt;br/&gt;
Commit: efe6615d7558ee6bda106546c55d92758bec528d&lt;/p&gt;</comment>
                    </comments>
                <issuelinks>
                            <issuelinktype id="10010">
                    <name>Duplicate</name>
                                                                <inwardlinks description="is duplicated by">
                                                        </inwardlinks>
                                    </issuelinktype>
                            <issuelinktype id="10011">
                    <name>Related</name>
                                            <outwardlinks description="is related to ">
                                        <issuelink>
            <issuekey id="63961">LU-14645</issuekey>
        </issuelink>
            <issuelink>
            <issuekey id="59627">LU-13693</issuekey>
        </issuelink>
                            </outwardlinks>
                                                                <inwardlinks description="is related to">
                                        <issuelink>
            <issuekey id="77406">LU-17025</issuekey>
        </issuelink>
            <issuelink>
            <issuekey id="62293">LU-14316</issuekey>
        </issuelink>
            <issuelink>
            <issuekey id="65457">LU-14897</issuekey>
        </issuelink>
            <issuelink>
            <issuekey id="50199">LU-10500</issuekey>
        </issuelink>
            <issuelink>
            <issuekey id="55718">LU-12327</issuekey>
        </issuelink>
            <issuelink>
            <issuekey id="55811">LU-12369</issuekey>
        </issuelink>
            <issuelink>
            <issuekey id="53410">LU-14396</issuekey>
        </issuelink>
                            </inwardlinks>
                                    </issuelinktype>
                    </issuelinks>
                <attachments>
                            <attachment id="31010" name="llapi-perf.c" size="8042" author="robl" created="Fri, 7 Sep 2018 21:10:41 +0000"/>
                            <attachment id="30801" name="lustre-ioctl-vs-llapi.png" size="59575" author="robl" created="Fri, 17 Aug 2018 15:26:45 +0000"/>
                    </attachments>
                <subtasks>
                    </subtasks>
                <customfields>
                                                                                                                                                                                            <customfield id="customfield_10890" key="com.atlassian.jira.plugins.jira-development-integration-plugin:devsummary">
                        <customfieldname>Development</customfieldname>
                        <customfieldvalues>
                            
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                    <customfield id="customfield_10030" key="com.atlassian.jira.plugin.system.customfieldtypes:labels">
                        <customfieldname>Epic/Theme</customfieldname>
                        <customfieldvalues>
                                        <label>Performance</label>
    
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                        <customfield id="customfield_10390" key="com.pyxis.greenhopper.jira:gh-lexo-rank">
                        <customfieldname>Rank</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>1|i000y7:</customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_10090" key="com.pyxis.greenhopper.jira:gh-global-rank">
                        <customfieldname>Rank (Obsolete)</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>9223372036854775807</customfieldvalue>
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                                                                                </customfields>
    </item>
</channel>
</rss>