<!-- 
RSS generated by JIRA (9.4.14#940014-sha1:734e6822bbf0d45eff9af51f82432957f73aa32c) at Sat Feb 10 03:13:53 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-14918] too many ldiskfs transaction credits when unlinking overstriped files</title>
                <link>https://jira.whamcloud.com/browse/LU-14918</link>
                <project id="10000" key="LU">Lustre</project>
                    <description>&lt;p&gt;Removing widely overstriped files from an ldiskfs MDT causes excessively many transaction credits to be reserved.  This can be seen in the MDS console logs:&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;Lustre: DEBUG MARKER: == sanity test 130g: FIEMAP (overstripe file) ========
Lustre: 25401:0:(osd_handler.c:1934:osd_trans_start()) lustre-MDT0000: credits 54595 &amp;gt; trans_max 2592
Lustre: 25401:0:(osd_handler.c:1863:osd_trans_dump_creds())   create: 800/6400/0, destroy: 1/4/0
Lustre: 25401:0:(osd_handler.c:1870:osd_trans_dump_creds())   attr_set: 3/3/0, xattr_set: 804/148/0
Lustre: 25401:0:(osd_handler.c:1880:osd_trans_dump_creds())   write: 4001/34410/0, punch: 0/0/0, quota 6/6/0
Lustre: 25401:0:(osd_handler.c:1887:osd_trans_dump_creds())   insert: 801/13616/0, delete: 2/5/0
Lustre: 25401:0:(osd_handler.c:1894:osd_trans_dump_creds())   ref_add: 1/1/0, ref_del: 2/2/0
Pid: 25401, comm: mdt00_004 3.10.0-1160.36.2.el7_lustre.x86_64 #1 SMP Tue Aug 3 23:03:31 UTC 2021
Call Trace:
libcfs_call_trace+0x90/0xf0 [libcfs]
libcfs_debug_dumpstack+0x26/0x30 [libcfs]
osd_trans_start+0x4bb/0x4e0 [osd_ldiskfs]
top_trans_start+0x702/0x940 [ptlrpc]
lod_trans_start+0x34/0x40 [lod]
mdd_trans_start+0x1a/0x20 [mdd]
mdd_unlink+0x4ee/0xae0 [mdd]
mdo_unlink+0x1b/0x1d [mdt]
mdt_reint_unlink+0xb64/0x1890 [mdt]
mdt_reint_rec+0x83/0x210 [mdt]
mdt_reint_internal+0x720/0xaf0 [mdt]
mdt_reint+0x67/0x140 [mdt]
tgt_request_handle+0x7ea/0x1750 [ptlrpc]
ptlrpc_server_handle_request+0x256/0xb10 [ptlrpc]
ptlrpc_main+0xb3c/0x14e0 [ptlrpc]
Lustre: 25401:0:(osd_internal.h:1325:osd_trans_exec_op()) lustre-MDT0000: opcode 7: before 2589 &amp;lt; left 34410, rollback = 7
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;and&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;Lustre: DEBUG MARKER: == sanity test 27Cd: test maximum stripe count ========
Lustre: 12686:0:(osd_handler.c:1934:osd_trans_start()) lustre-MDT0003: credits 136195 &amp;gt; trans_max 2592
Lustre: 12686:0:(osd_handler.c:1863:osd_trans_dump_creds())   create: 2000/16000/0, destroy: 1/4/0
Lustre: 12686:0:(osd_handler.c:1870:osd_trans_dump_creds())   attr_set: 3/3/0, xattr_set: 2004/148/0
Lustre: 12686:0:(osd_handler.c:1880:osd_trans_dump_creds())   write: 10001/86010/0, punch: 0/0/0, quota 6/6/0
Lustre: 12686:0:(osd_handler.c:1887:osd_trans_dump_creds())   insert: 2001/34016/0, delete: 2/5/0
Lustre: 12686:0:(osd_handler.c:1894:osd_trans_dump_creds())   ref_add: 1/1/0, ref_del: 2/2/0
Pid: 12686, comm: mdt00_000 3.10.0-1160.36.2.el7_lustre.x86_64 #1 SMP Tue Aug 3 23:03:31 UTC 2021
Call Trace:
libcfs_call_trace+0x90/0xf0 [libcfs]
libcfs_debug_dumpstack+0x26/0x30 [libcfs]
osd_trans_start+0x4bb/0x4e0 [osd_ldiskfs]
top_trans_start+0x702/0x940 [ptlrpc]
lod_trans_start+0x34/0x40 [lod]
mdd_trans_start+0x1a/0x20 [mdd]
mdd_unlink+0x4ee/0xae0 [mdd]
mdo_unlink+0x1b/0x1d [mdt]
mdt_reint_unlink+0xb64/0x1890 [mdt]
mdt_reint_rec+0x83/0x210 [mdt]
mdt_reint_internal+0x720/0xaf0 [mdt]
mdt_reint+0x67/0x140 [mdt]
tgt_request_handle+0x7ea/0x1750 [ptlrpc]
ptlrpc_server_handle_request+0x256/0xb10 [ptlrpc]
ptlrpc_main+0xb3c/0x14e0 [ptlrpc]
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;and similarly in sanity test_130e, sanity-pfl test_0b, test_1c, always during unlink.&lt;/p&gt;

&lt;p&gt;The two examples shown are trying to reserve a whopping 213MiB and 532MiB of journal space, respectively.  Since the maximum xattr size for an overstriped file is 64KiB, this is pretty excessive.  &lt;/p&gt;</description>
                <environment></environment>
        <key id="65548">LU-14918</key>
            <summary>too many ldiskfs transaction credits when unlinking overstriped files</summary>
                <type id="1" iconUrl="https://jira.whamcloud.com/secure/viewavatar?size=xsmall&amp;avatarId=11303&amp;avatarType=issuetype">Bug</type>
                                            <priority id="3" iconUrl="https://jira.whamcloud.com/images/icons/priorities/major.svg">Major</priority>
                        <status id="5" iconUrl="https://jira.whamcloud.com/images/icons/statuses/resolved.png" description="A resolution has been taken, and it is awaiting verification by reporter. From here issues are either reopened, or are closed.">Resolved</status>
                    <statusCategory id="3" key="done" colorName="success"/>
                                    <resolution id="1">Fixed</resolution>
                                        <assignee username="bzzz">Alex Zhuravlev</assignee>
                                    <reporter username="adilger">Andreas Dilger</reporter>
                        <labels>
                    </labels>
                <created>Fri, 6 Aug 2021 22:58:54 +0000</created>
                <updated>Fri, 29 Dec 2023 11:10:38 +0000</updated>
                            <resolved>Tue, 14 Feb 2023 13:25:41 +0000</resolved>
                                    <version>Lustre 2.14.0</version>
                    <version>Lustre 2.15.0</version>
                                    <fixVersion>Lustre 2.16.0</fixVersion>
                                        <due></due>
                            <votes>0</votes>
                                    <watches>11</watches>
                                                                            <comments>
                            <comment id="309554" author="adilger" created="Fri, 6 Aug 2021 23:04:10 +0000"  >&lt;p&gt;There was previously patch &lt;a href=&quot;http://review.whamcloud.com/8881&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;http://review.whamcloud.com/8881&lt;/a&gt; &quot;&lt;tt&gt;&lt;a href=&quot;https://jira.whamcloud.com/browse/LU-4648&quot; title=&quot;inode deletion transaction does not count large EA inode deletion credits&quot; class=&quot;issue-link&quot; data-issue-key=&quot;LU-4648&quot;&gt;&lt;del&gt;LU-4648&lt;/del&gt;&lt;/a&gt; ldiskfs: delete external EA in another transaction&lt;/tt&gt;&quot; that pushed the unlink of the xattr inode to a separate transaction, so either that code is not working properly anymore, or &lt;tt&gt;mdd_declare_unlink()&lt;/tt&gt; (and sub-functions) is counting the entire xattr size in the credits for the unlink, even though it is done in a separate transaction.&lt;/p&gt;</comment>
                            <comment id="311284" author="adilger" created="Thu, 26 Aug 2021 16:36:04 +0000"  >&lt;p&gt;This may also be fixed by the &lt;a href=&quot;https://jira.whamcloud.com/browse/LU-14965&quot; title=&quot;ldiskfs/namei.c:3331 ldiskfs_orphan_add+0x11e/0x290 [ldiskfs]&quot; class=&quot;issue-link&quot; data-issue-key=&quot;LU-14965&quot;&gt;&lt;del&gt;LU-14965&lt;/del&gt;&lt;/a&gt; patch. &lt;/p&gt;</comment>
                            <comment id="311398" author="bobijam" created="Fri, 27 Aug 2021 10:19:55 +0000"  >&lt;p&gt;I&apos;m confused where these &quot;create/write&quot; requests come from, since mdd_declare_unlink() is quite simple &lt;/p&gt;
&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeHeader panelHeader&quot; style=&quot;border-bottom-width: 1px;&quot;&gt;&lt;b&gt;mdd_declare_unlink()&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;
1628         &lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; (c != NULL) {                                                        
1629                 rc = mdo_declare_ref_del(env, c, handle);                       
1630                 &lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; (rc)                                                         
1631                         &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; rc;                                              
1632                                                                                 
1633                 rc = mdo_declare_ref_del(env, c, handle);                       
1634                 &lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; (rc)                                                         
1635                         &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; rc;                                              
1636                                                                                 
1637                 la-&amp;gt;la_valid = LA_CTIME;                                        
1638                 rc = mdo_declare_attr_set(env, c, la, handle);                  
1639                 &lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; (rc)                                                         
1640                         &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; rc;                                              
1641                                                                                 
1642                 rc = mdd_declare_finish_unlink(env, c, handle);                 
1643                 &lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; (rc)                                                         
1644                         &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; rc;                                              
1645                                                                                 
1646                 &lt;span class=&quot;code-comment&quot;&gt;/* FIXME: need changelog &lt;span class=&quot;code-keyword&quot;&gt;for&lt;/span&gt; remove entry */&lt;/span&gt;                    
1647                 rc = mdd_declare_changelog_store(env, mdd, CL_UNLINK, name,     
1648                                                  NULL, handle);                 
1649         }                                             
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeHeader panelHeader&quot; style=&quot;border-bottom-width: 1px;&quot;&gt;&lt;b&gt;mdd_declare_finish_unlink()&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;
1519         rc = mdd_mark_orphan_object(env, obj, handle, &lt;span class=&quot;code-keyword&quot;&gt;true&lt;/span&gt;);                    
1520         &lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; (rc != 0)                                                            
1521                 &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; rc;                                                              
1522                                                                                 
1523         rc = mdo_declare_destroy(env, obj, handle);                             
1524         &lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; (rc != 0)                                                            
1525                 &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; rc;                                                      
1526                                                                                 
1527         rc = mdd_orphan_declare_insert(env, obj, mdd_object_type(obj), handle); 
1528         &lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; (rc != 0)                                                            
1529                 &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; rc;                                                      
1530                                                                                 
1531         &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; mdd_declare_links_del(env, obj, handle);    
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;mdd_declare_changelog_store() should not generate so much write requests I think.&lt;/p&gt;</comment>
                            <comment id="311478" author="adilger" created="Sat, 28 Aug 2021 08:53:54 +0000"  >&lt;p&gt;The debug message shows that it is logging thousands of separate operations:&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;create: 800/6400/0, destroy: 1/4/0
write: 4001/34410/0, punch: 0/0/0, quota 6/6/0
insert: 801/13616/0, delete: 2/5/0
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;This means 800 creates for 6400 credits, 4000 writes (5 per create/insert) for 34410 credits, and 801 inserts for 13616 credits.  The sanity &lt;tt&gt;test_130g&lt;/tt&gt; itself is unlinking an overstriped file with &lt;tt&gt;$((OSTCOUNT * 100)) = 800&lt;/tt&gt; stripes, and &lt;tt&gt;test_27Cd&lt;/tt&gt; is unlinking a 2000-stripe file, but those objects are on the OSTs, not on the MDT.  It looks like the LOD layer is declaring local credits for each remote object being unlinked?  I could understand that LOD needs a few credits to update llog records for each unlinks (e.g. enough to allocate a few blocks for each OST), but it doesn&apos;t need hundreds of MB of credits.&lt;/p&gt;

&lt;p&gt;It wouldn&apos;t be too hard to add extra debugging into &lt;tt&gt;osd_declare_create()&lt;/tt&gt;, &lt;tt&gt;osd_declare_write()&lt;/tt&gt;, and &lt;tt&gt;osd_declare_insert()&lt;/tt&gt; that if there are more than, say, 50 such operations in a single handle to print a &lt;tt&gt;CWARN()&lt;/tt&gt; and &lt;tt&gt;libcfs_debug_dumpstack()&lt;/tt&gt; (and set a flag so that it doesn&apos;t happen another 750 or 3950 times) to see where this is happening in the code.  However, looking at &lt;tt&gt;lod_declare_destroy()&lt;/tt&gt; it appears clear that this is doing a declare for every stripe, and not limiting itself when there are multiple objects per OST.  &lt;/p&gt;

&lt;p&gt;Firstly, it is worthwhile to confirm that there is not a &quot;sub handle&quot; for each &lt;b&gt;stripe&lt;/b&gt; instead of for each &lt;b&gt;OST&lt;/b&gt;.  That would both increase the RAM usage, and make it difficult to aggregate credits for a single OST&apos;s objects.  Next, if &lt;tt&gt;ldo_dir_stripe_count &amp;gt; ost_count&lt;/tt&gt; to declare a bitmap for the number of OSTs and then limit the number of credits if that OST has already been assigned credits for logging the unlink of the objects.&lt;/p&gt;

&lt;p&gt;Alex should know the details, but I expect the number of credits needed to unlink an object are essentially one llog block with indirects to write an llog record (64 bytes for &lt;tt&gt;llog_unlink64_rec&lt;/tt&gt;, if that is the right one, but close enough), plus a rare chance of creating a new llog file and inserting it into the &lt;tt&gt;O/1/dN&lt;/tt&gt; directory.  A new llog file might happen &lt;b&gt;once&lt;/b&gt; per unlink per OST, but not 2000 times.  Similarly, destroying 2000 objects doesn&apos;t take 4000 llog blocks with 34000 blocks.  Instead, it would take either one llog block+ overhead per OST, or about 2000x64/4096 &lt;b&gt;bytes&lt;/b&gt; =32KB = 8 blocks + 32 indirects if all the objects were on a single OST.&lt;/p&gt;</comment>
                            <comment id="311670" author="bobijam" created="Tue, 31 Aug 2021 10:38:29 +0000"  >&lt;p&gt;Yes, the write/create declaration come from the llog record for unlinking all stripe objects.&lt;/p&gt;
&lt;div class=&quot;panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;panelHeader&quot; style=&quot;border-bottom-width: 1px;&quot;&gt;&lt;b&gt;like this example&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;panelContent&quot;&gt;
&lt;p&gt;&lt;span class=&quot;error&quot;&gt;&amp;#91;10033.829237&amp;#93;&lt;/span&gt; &lt;span class=&quot;error&quot;&gt;&amp;#91;&amp;lt;ffffffffa757a3ae&amp;gt;&amp;#93;&lt;/span&gt; dump_stack+0x19/0x1b&lt;br/&gt;
 &lt;span class=&quot;error&quot;&gt;&amp;#91;10033.829244&amp;#93;&lt;/span&gt; &lt;span class=&quot;error&quot;&gt;&amp;#91;&amp;lt;ffffffffc1908d74&amp;gt;&amp;#93;&lt;/span&gt; osd_declare_write+0x434/0x540 &lt;span class=&quot;error&quot;&gt;&amp;#91;osd_ldiskfs&amp;#93;&lt;/span&gt;&lt;br/&gt;
 &lt;span class=&quot;error&quot;&gt;&amp;#91;10033.829255&amp;#93;&lt;/span&gt; &lt;span class=&quot;error&quot;&gt;&amp;#91;&amp;lt;ffffffffc104a150&amp;gt;&amp;#93;&lt;/span&gt; llog_osd_declare_write_rec+0xe0/0x3a0 &lt;span class=&quot;error&quot;&gt;&amp;#91;obdclass&amp;#93;&lt;/span&gt;&lt;br/&gt;
 &lt;span class=&quot;error&quot;&gt;&amp;#91;10033.829265&amp;#93;&lt;/span&gt; &lt;span class=&quot;error&quot;&gt;&amp;#91;&amp;lt;ffffffffc103e196&amp;gt;&amp;#93;&lt;/span&gt; llog_declare_write_rec+0x1e6/0x240 &lt;span class=&quot;error&quot;&gt;&amp;#91;obdclass&amp;#93;&lt;/span&gt;&lt;br/&gt;
 &lt;span class=&quot;error&quot;&gt;&amp;#91;10033.829289&amp;#93;&lt;/span&gt; &lt;span class=&quot;error&quot;&gt;&amp;#91;&amp;lt;ffffffffc104475c&amp;gt;&amp;#93;&lt;/span&gt; llog_cat_declare_add_rec+0x9c/0x260 &lt;span class=&quot;error&quot;&gt;&amp;#91;obdclass&amp;#93;&lt;/span&gt;&lt;br/&gt;
 &lt;span class=&quot;error&quot;&gt;&amp;#91;10033.829297&amp;#93;&lt;/span&gt; &lt;span class=&quot;error&quot;&gt;&amp;#91;&amp;lt;ffffffffc103b3ef&amp;gt;&amp;#93;&lt;/span&gt; llog_declare_add+0x14f/0x1c0 &lt;span class=&quot;error&quot;&gt;&amp;#91;obdclass&amp;#93;&lt;/span&gt;&lt;br/&gt;
 &lt;span class=&quot;error&quot;&gt;&amp;#91;10033.829302&amp;#93;&lt;/span&gt; &lt;span class=&quot;error&quot;&gt;&amp;#91;&amp;lt;ffffffffc1bb75ba&amp;gt;&amp;#93;&lt;/span&gt; osp_sync_declare_add+0x11a/0x490 &lt;span class=&quot;error&quot;&gt;&amp;#91;osp&amp;#93;&lt;/span&gt;&lt;br/&gt;
 &lt;span class=&quot;error&quot;&gt;&amp;#91;10033.829306&amp;#93;&lt;/span&gt; &lt;span class=&quot;error&quot;&gt;&amp;#91;&amp;lt;ffffffffc1ba6443&amp;gt;&amp;#93;&lt;/span&gt; osp_declare_destroy+0x1a3/0x200 &lt;span class=&quot;error&quot;&gt;&amp;#91;osp&amp;#93;&lt;/span&gt;&lt;br/&gt;
 &lt;span class=&quot;error&quot;&gt;&amp;#91;10033.829312&amp;#93;&lt;/span&gt; &lt;span class=&quot;error&quot;&gt;&amp;#91;&amp;lt;ffffffffc1b54a6e&amp;gt;&amp;#93;&lt;/span&gt; lod_sub_declare_destroy+0xce/0x2d0 &lt;span class=&quot;error&quot;&gt;&amp;#91;lod&amp;#93;&lt;/span&gt;&lt;br/&gt;
 &lt;span class=&quot;error&quot;&gt;&amp;#91;10033.829318&amp;#93;&lt;/span&gt; &lt;span class=&quot;error&quot;&gt;&amp;#91;&amp;lt;ffffffffc1b2a51d&amp;gt;&amp;#93;&lt;/span&gt; lod_obj_stripe_destroy_cb+0x8d/0xa0 &lt;span class=&quot;error&quot;&gt;&amp;#91;lod&amp;#93;&lt;/span&gt;&lt;br/&gt;
 &lt;span class=&quot;error&quot;&gt;&amp;#91;10033.829325&amp;#93;&lt;/span&gt; &lt;span class=&quot;error&quot;&gt;&amp;#91;&amp;lt;ffffffffc1b37c8e&amp;gt;&amp;#93;&lt;/span&gt; lod_obj_for_each_stripe+0x11e/0x2c0 &lt;span class=&quot;error&quot;&gt;&amp;#91;lod&amp;#93;&lt;/span&gt;&lt;br/&gt;
 &lt;span class=&quot;error&quot;&gt;&amp;#91;10033.829330&amp;#93;&lt;/span&gt; &lt;span class=&quot;error&quot;&gt;&amp;#91;&amp;lt;ffffffffc1b38bf2&amp;gt;&amp;#93;&lt;/span&gt; lod_declare_destroy+0x5c2/0x630 &lt;span class=&quot;error&quot;&gt;&amp;#91;lod&amp;#93;&lt;/span&gt;&lt;br/&gt;
 &lt;span class=&quot;error&quot;&gt;&amp;#91;10033.829344&amp;#93;&lt;/span&gt; &lt;span class=&quot;error&quot;&gt;&amp;#91;&amp;lt;ffffffffc19c55f3&amp;gt;&amp;#93;&lt;/span&gt; mdd_declare_finish_unlink+0x83/0x200 &lt;span class=&quot;error&quot;&gt;&amp;#91;mdd&amp;#93;&lt;/span&gt;&lt;br/&gt;
 &lt;span class=&quot;error&quot;&gt;&amp;#91;10033.829349&amp;#93;&lt;/span&gt; &lt;span class=&quot;error&quot;&gt;&amp;#91;&amp;lt;ffffffffc19d63af&amp;gt;&amp;#93;&lt;/span&gt; mdd_unlink+0x4af/0xaf0 &lt;span class=&quot;error&quot;&gt;&amp;#91;mdd&amp;#93;&lt;/span&gt;&lt;br/&gt;
 &lt;span class=&quot;error&quot;&gt;&amp;#91;10033.829359&amp;#93;&lt;/span&gt; &lt;span class=&quot;error&quot;&gt;&amp;#91;&amp;lt;ffffffffc1a9cb9c&amp;gt;&amp;#93;&lt;/span&gt; mdo_unlink+0x1b/0x1d &lt;span class=&quot;error&quot;&gt;&amp;#91;mdt&amp;#93;&lt;/span&gt;&lt;br/&gt;
 &lt;span class=&quot;error&quot;&gt;&amp;#91;10033.829368&amp;#93;&lt;/span&gt; &lt;span class=&quot;error&quot;&gt;&amp;#91;&amp;lt;ffffffffc1a5893f&amp;gt;&amp;#93;&lt;/span&gt; mdt_reint_unlink+0x9ff/0x1460 &lt;span class=&quot;error&quot;&gt;&amp;#91;mdt&amp;#93;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&#160;&lt;br/&gt;
 I think the &quot;sub handle&quot; for each &lt;b&gt;stripe&lt;/b&gt; is eventually derived from the &lt;b&gt;device&lt;/b&gt; of the stripes, so that&apos;s comforting.&lt;/p&gt;

&lt;p&gt;lod_sub_declare_destroy(env, dt, th)-&amp;gt;lod_sub_get_thandle(env, th, dt, ...)&lt;/p&gt;
&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeHeader panelHeader&quot; style=&quot;border-bottom-width: 1px;&quot;&gt;&lt;b&gt;lod_sub_declare_destroy(env, dt, th)&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;
350         sub_th = lod_sub_get_thandle(env, th, dt, &amp;amp;record_update);    
...
357         rc = dt_declare_destroy(env, dt, sub_th);    
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeHeader panelHeader&quot; style=&quot;border-bottom-width: 1px;&quot;&gt;&lt;b&gt;lod_sub_get_thandle(env, th, dt, ...)&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;
104         sub_th = thandle_get_sub(env, th, dt);       
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeHeader panelHeader&quot; style=&quot;border-bottom-width: 1px;&quot;&gt;&lt;b&gt;thandle_get_sub(env, th, dt)&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;
474 {                                                                               
475         &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; thandle_get_sub_by_dt(env, th, lu2dt_dev(dt-&amp;gt;do_lu.lo_dev));         
476 } 
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;So the issue locates in that unlinking a wide-striped file reserves too much credits for llog records of unlinking its sub objects.&lt;/p&gt;</comment>
                            <comment id="311699" author="adilger" created="Tue, 31 Aug 2021 14:46:18 +0000"  >&lt;p&gt;Bobijam, are you able to work on a fix for this, or should Mike look into it?&lt;/p&gt;</comment>
                            <comment id="311701" author="bzzz" created="Tue, 31 Aug 2021 14:59:15 +0000"  >&lt;p&gt;well, it&apos;s still possible (though not likely) that, for example, after some manual manipulations such an unlink will need to create that many llog files.&lt;/p&gt;</comment>
                            <comment id="311702" author="bzzz" created="Tue, 31 Aug 2021 15:00:41 +0000"  >&lt;p&gt;I think we can postpone llog object removal using a dedicated thread, this would save some credits.&lt;/p&gt;</comment>
                            <comment id="311711" author="adilger" created="Tue, 31 Aug 2021 15:45:30 +0000"  >&lt;p&gt;Alex, in the overstriping case, how would it be possible for the unlink to have eg. 100 different llog files for a single OST?  I am understand it would be possible to create one new llog file, and several new blocks in that file, but with 65000 records per llog file it isn&apos;t possible even under crazy cases to need so many credits. &lt;/p&gt;</comment>
                            <comment id="311727" author="bzzz" created="Tue, 31 Aug 2021 17:01:32 +0000"  >&lt;p&gt;ok, I got it, how many different OSTs were actually involved?&lt;/p&gt;</comment>
                            <comment id="311789" author="bobijam" created="Wed, 1 Sep 2021 10:27:52 +0000"  >&lt;p&gt;Needs Mike&apos;s input, llog_osd_declare_write_rec() just use loghandle-&amp;gt;lgh_ctxt-&amp;gt;loc_chunk_size instead of llog records len to write the llog, which is wasteful.&lt;/p&gt;</comment>
                            <comment id="311790" author="bzzz" created="Wed, 1 Sep 2021 10:43:26 +0000"  >&lt;p&gt;a single new record involves:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;record itself, which can&apos;t be less than blocksize (4K for ldiskfs)&lt;/li&gt;
	&lt;li&gt;llog header, which in turn can be two different blocks: 1st with llh_count (4K), 2nd with bitmap (4K)&lt;/li&gt;
&lt;/ul&gt;
</comment>
                            <comment id="311984" author="adilger" created="Thu, 2 Sep 2021 17:32:33 +0000"  >&lt;p&gt;Alex, this issue can be seen in any review-dne-part-1 sanity test_27Cd (or other subtest using overstriping), for example:&lt;br/&gt;
&lt;a href=&quot;https://testing.whamcloud.com/test_sets/afe2d412-628d-4a7f-bda4-1c3359a97ff1&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;https://testing.whamcloud.com/test_sets/afe2d412-628d-4a7f-bda4-1c3359a97ff1&lt;/a&gt;&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;[ 1863.395427] Lustre: DEBUG MARKER: /usr/sbin/lctl mark == sanity test 27Cd: test maximum stripe count =========== 11:50:04 \(1630583404\)
[ 1863.871341] Lustre: DEBUG MARKER: == sanity test 27Cd: test maximum stripe count =========== 11:50:04 (1630583404)
[ 1870.327497] Lustre: 11292:0:(osd_handler.c:1938:osd_trans_start()) lustre-MDT0003: credits 128195 &amp;gt; trans_max 2592
[ 1870.329179] Lustre: 11292:0:(osd_handler.c:1867:osd_trans_dump_creds())   create: 2000/8000/0, destroy: 1/4/0
[ 1870.330663] Lustre: 11292:0:(osd_handler.c:1874:osd_trans_dump_creds())   attr_set: 3/3/0, xattr_set: 2004/148/0
[ 1870.332184] Lustre: 11292:0:(osd_handler.c:1884:osd_trans_dump_creds())   write: 10001/86010/0, punch: 0/0/0, quota 6/6/0
[ 1870.333817] Lustre: 11292:0:(osd_handler.c:1891:osd_trans_dump_creds())   insert: 2001/34016/0, delete: 2/5/0
[ 1870.335318] Lustre: 11292:0:(osd_handler.c:1898:osd_trans_dump_creds())   ref_add: 1/1/0, ref_del: 2/2/0
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;There are 4 MDTs and 8 OSTs in that case, and a 512MB transaction handle request.&lt;/p&gt;</comment>
                            <comment id="312028" author="bobijam" created="Fri, 3 Sep 2021 06:03:10 +0000"  >&lt;p&gt;Tried a patch to use llog rec len instread of chunk_size in llog_osd_declare_write_rec(), the write credits demand decreased a little&lt;/p&gt;
&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeHeader panelHeader&quot; style=&quot;border-bottom-width: 1px;&quot;&gt;&lt;b&gt;patch&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;
diff --git a/lustre/obdclass/llog_osd.c b/lustre/obdclass/llog_osd.c
index 5aed12e9b9..18b1b80fdf 100644
--- a/lustre/obdclass/llog_osd.c
+++ b/lustre/obdclass/llog_osd.c
@@ -320,7 +320,6 @@ &lt;span class=&quot;code-keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;code-object&quot;&gt;int&lt;/span&gt; llog_osd_declare_write_rec(&lt;span class=&quot;code-keyword&quot;&gt;const&lt;/span&gt; struct lu_env *env,
                                      &lt;span class=&quot;code-object&quot;&gt;int&lt;/span&gt; idx, struct thandle *th)
 {
        struct llog_thread_info *lgi = llog_info(env);
-       __u32                   chunk_size;
        struct dt_object        *o;
        &lt;span class=&quot;code-object&quot;&gt;int&lt;/span&gt;                      rc;
 
@@ -335,8 +334,7 @@ &lt;span class=&quot;code-keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;code-object&quot;&gt;int&lt;/span&gt; llog_osd_declare_write_rec(&lt;span class=&quot;code-keyword&quot;&gt;const&lt;/span&gt; struct lu_env *env,
        o = loghandle-&amp;gt;lgh_obj;
        LASSERT(o);
 
-       chunk_size = loghandle-&amp;gt;lgh_ctxt-&amp;gt;loc_chunk_size;
-       lgi-&amp;gt;lgi_buf.lb_len = chunk_size;
+       lgi-&amp;gt;lgi_buf.lb_len = sizeof(struct llog_log_hdr);
        lgi-&amp;gt;lgi_buf.lb_buf = NULL;
        &lt;span class=&quot;code-comment&quot;&gt;/* each time we update header */&lt;/span&gt;
        rc = dt_declare_record_write(env, o, &amp;amp;lgi-&amp;gt;lgi_buf, 0,
@@ -348,7 +346,7 @@ &lt;span class=&quot;code-keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;code-object&quot;&gt;int&lt;/span&gt; llog_osd_declare_write_rec(&lt;span class=&quot;code-keyword&quot;&gt;const&lt;/span&gt; struct lu_env *env,
         * the pad record can be inserted so take into account &lt;span class=&quot;code-object&quot;&gt;double&lt;/span&gt;
         * record size
         */
-       lgi-&amp;gt;lgi_buf.lb_len = chunk_size * 2;
+       lgi-&amp;gt;lgi_buf.lb_len = rec-&amp;gt;lrh_len * 2;
        lgi-&amp;gt;lgi_buf.lb_buf = NULL;
        &lt;span class=&quot;code-comment&quot;&gt;/* XXX: implement declared window or multi-chunks approach */&lt;/span&gt;
        rc = dt_declare_record_write(env, o, &amp;amp;lgi-&amp;gt;lgi_buf, -1, th);
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;sanity.sh test_27Cd&lt;br/&gt;
credits demand before the patch&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;[ 2954.917326] Lustre: 20362:0:(osd_handler.c:1938:osd_trans_start()) lustre-MDT0001: credits 128195 &amp;gt; trans_max 2496
[ 2954.917330] Lustre: 20362:0:(osd_handler.c:1867:osd_trans_dump_creds())   create: 2000/8000/0, destroy: 1/4/0
[ 2954.917333] Lustre: 20362:0:(osd_handler.c:1874:osd_trans_dump_creds())   attr_set: 3/3/0, xattr_set: 2004/148/0
[ 2954.917335] Lustre: 20362:0:(osd_handler.c:1884:osd_trans_dump_creds())   write: 10001/86010/0, punch: 0/0/0, quota 6/6/0
[ 2954.917337] Lustre: 20362:0:(osd_handler.c:1891:osd_trans_dump_creds())   insert: 2001/34016/0, delete: 2/5/0
[ 2954.917339] Lustre: 20362:0:(osd_handler.c:1898:osd_trans_dump_creds())   ref_add: 1/1/0, ref_del: 2/2/0
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;credits demand after the patch&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;[ 3371.600695] Lustre: 30759:0:(osd_handler.c:1938:osd_trans_start()) lustre-MDT0000: credits 92195 &amp;gt; trans_max 2496
[ 3371.600699] Lustre: 30759:0:(osd_handler.c:1867:osd_trans_dump_creds())   create: 2000/8000/0, destroy: 1/4/0
[ 3371.600701] Lustre: 30759:0:(osd_handler.c:1874:osd_trans_dump_creds())   attr_set: 3/3/0, xattr_set: 2004/148/0
[ 3371.600704] Lustre: 30759:0:(osd_handler.c:1884:osd_trans_dump_creds())   write: 10001/50010/0, punch: 0/0/0, quota 6/6/0
[ 3371.600706] Lustre: 30759:0:(osd_handler.c:1891:osd_trans_dump_creds())   insert: 2001/34016/0, delete: 2/5/0
[ 3371.600708] Lustre: 30759:0:(osd_handler.c:1898:osd_trans_dump_creds())   ref_add: 1/1/0, ref_del: 2/2/0
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                            <comment id="312033" author="bzzz" created="Fri, 3 Sep 2021 06:43:14 +0000"  >&lt;p&gt;this means that loc_chunk_size is not LLOG_MIN_CHUNK_SIZE for unlink llogs?&lt;/p&gt;</comment>
                            <comment id="312042" author="tappro" created="Fri, 3 Sep 2021 07:42:12 +0000"  >&lt;p&gt;Alex, as I understand patch uses just header size and &lt;tt&gt;rec-&amp;gt;lrh_len&lt;/tt&gt;&#160;to declare llog write but not &lt;tt&gt;loc_chunk_size&lt;/tt&gt; so yes, both are not &lt;tt&gt;LLOG_MIN_CHUNK_SIZE&lt;/tt&gt;.&lt;/p&gt;

&lt;p&gt;As I remember we were using &lt;tt&gt;loc_chunk_size&lt;/tt&gt; in declaration just because we don&apos;t know where record (and bit in bitmap) will be really written due to llog append nature, that is why we are declaring whole chunk for header and current chunk along with next one for the record. So we can&apos;t replace that with declaration of just record size and header size.&lt;/p&gt;

&lt;p&gt;Note that write itself is more narrowed, it is done with exact offset/len values as they are known at the moment of write.&lt;/p&gt;</comment>
                            <comment id="312044" author="bzzz" created="Fri, 3 Sep 2021 08:00:41 +0000"  >&lt;p&gt;yes, I don&apos;t think this change is correct:&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;
+       lgi-&amp;gt;lgi_buf.lb_len = rec-&amp;gt;lrh_len * 2;
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;as lrh_len can be more than remaining space in the last block we may need to write a padding record (last block N), then add the new record to block N+1&lt;/p&gt;</comment>
                            <comment id="312046" author="bzzz" created="Fri, 3 Sep 2021 08:09:22 +0000"  >&lt;p&gt;what we can do, I guess, is to declare that potential padding block not as an append, but a record within llog&apos;s size which would mean a single block to modify (in contrast of append which may need many more blocks - allocation, externt tree, etc)&lt;/p&gt;</comment>
                            <comment id="312048" author="bzzz" created="Fri, 3 Sep 2021 08:18:29 +0000"  >&lt;p&gt;but I think this way we don&apos;t save much, like Andreas said instead we should be looking for ways to declare at most OSTCOUNT new plain llogs and #stripes records. what about the case when lots of MDT threads are unlinking such overstriped files concurrently?&lt;br/&gt;
64K records / 128 threads = 512 records per thread&lt;/p&gt;</comment>
                            <comment id="312049" author="tappro" created="Fri, 3 Sep 2021 08:21:26 +0000"  >&lt;p&gt;also as I remember that was mostly due to ZFS which needs exact offset/len to be declared and complains if write doesn&apos;t match. So as we can&apos;t say for sure exact offset at the declaration time we assume range where it can go - the current chunk and the next one. And also we should take case about non-atomic &apos;declare&apos;-&apos;write&apos; nature, I think there could be concurrent record additions in between, can&apos;t they?&lt;/p&gt;</comment>
                            <comment id="312090" author="adilger" created="Fri, 3 Sep 2021 19:12:46 +0000"  >&lt;p&gt;Mike, I think that was later fixed by Alex to remove the &quot;specific declare&quot; since that hurt performance and didn&apos;t save much space...&lt;/p&gt;</comment>
                            <comment id="312091" author="adilger" created="Fri, 3 Sep 2021 19:14:30 +0000"  >&lt;p&gt;As for concurrent records, that would be mostly fine.  As I wrote before, there &lt;b&gt;may&lt;/b&gt; be some interleaving of records, but not 65000 different records written from other threads between each delete of the overstriped object that would trigger a new llog file each time.&lt;/p&gt;</comment>
                            <comment id="319287" author="adilger" created="Sat, 27 Nov 2021 02:02:39 +0000"  >&lt;p&gt;I&apos;d like to still keep this under consideration for 2.15.0 since it is hit very often during usage, and the transaction size (over 500MB) can hurt performance significantly.&lt;/p&gt;</comment>
                            <comment id="319299" author="adilger" created="Sat, 27 Nov 2021 19:23:28 +0000"  >&lt;p&gt;Assign to Alex to balance 2.15 tickets. &lt;/p&gt;</comment>
                            <comment id="320170" author="gerrit" created="Tue, 7 Dec 2021 08:18:37 +0000"  >&lt;p&gt;&quot;Alex Zhuravlev &amp;lt;bzzz@whamcloud.com&amp;gt;&quot; uploaded a new patch: &lt;a href=&quot;https://review.whamcloud.com/45765&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;https://review.whamcloud.com/45765&lt;/a&gt;&lt;br/&gt;
Subject: &lt;a href=&quot;https://jira.whamcloud.com/browse/LU-14918&quot; title=&quot;too many ldiskfs transaction credits when unlinking overstriped files&quot; class=&quot;issue-link&quot; data-issue-key=&quot;LU-14918&quot;&gt;&lt;del&gt;LU-14918&lt;/del&gt;&lt;/a&gt; osd: don&apos;t declare similar writes twice&lt;br/&gt;
Project: fs/lustre-release&lt;br/&gt;
Branch: master&lt;br/&gt;
Current Patch Set: 1&lt;br/&gt;
Commit: 54aef59ac5bd349a3d42b71b3d0bdc9cda93066e&lt;/p&gt;</comment>
                            <comment id="359722" author="gerrit" created="Thu, 19 Jan 2023 19:09:12 +0000"  >&lt;p&gt;&quot;Alex Zhuravlev &amp;lt;bzzz@whamcloud.com&amp;gt;&quot; uploaded a new patch: &lt;a href=&quot;https://review.whamcloud.com/c/fs/lustre-release/+/49701&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;https://review.whamcloud.com/c/fs/lustre-release/+/49701&lt;/a&gt;&lt;br/&gt;
Subject: &lt;a href=&quot;https://jira.whamcloud.com/browse/LU-14918&quot; title=&quot;too many ldiskfs transaction credits when unlinking overstriped files&quot; class=&quot;issue-link&quot; data-issue-key=&quot;LU-14918&quot;&gt;&lt;del&gt;LU-14918&lt;/del&gt;&lt;/a&gt; osd: don&apos;t declare similar writes twice&lt;br/&gt;
Project: fs/lustre-release&lt;br/&gt;
Branch: master&lt;br/&gt;
Current Patch Set: 1&lt;br/&gt;
Commit: e4a86ff32d18b6598880df1ca19e16af5a8b781b&lt;/p&gt;</comment>
                            <comment id="362662" author="gerrit" created="Tue, 14 Feb 2023 06:02:47 +0000"  >&lt;p&gt;&quot;Oleg Drokin &amp;lt;green@whamcloud.com&amp;gt;&quot; merged in patch &lt;a href=&quot;https://review.whamcloud.com/c/fs/lustre-release/+/45765/&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;https://review.whamcloud.com/c/fs/lustre-release/+/45765/&lt;/a&gt;&lt;br/&gt;
Subject: &lt;a href=&quot;https://jira.whamcloud.com/browse/LU-14918&quot; title=&quot;too many ldiskfs transaction credits when unlinking overstriped files&quot; class=&quot;issue-link&quot; data-issue-key=&quot;LU-14918&quot;&gt;&lt;del&gt;LU-14918&lt;/del&gt;&lt;/a&gt; osd: don&apos;t declare similar ldiskfs writes twice&lt;br/&gt;
Project: fs/lustre-release&lt;br/&gt;
Branch: master&lt;br/&gt;
Current Patch Set: &lt;br/&gt;
Commit: 9e6225b2e7385cbb7be0474df01075fafc4966d5&lt;/p&gt;</comment>
                            <comment id="362663" author="gerrit" created="Tue, 14 Feb 2023 06:02:58 +0000"  >&lt;p&gt;&quot;Oleg Drokin &amp;lt;green@whamcloud.com&amp;gt;&quot; merged in patch &lt;a href=&quot;https://review.whamcloud.com/c/fs/lustre-release/+/49701/&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;https://review.whamcloud.com/c/fs/lustre-release/+/49701/&lt;/a&gt;&lt;br/&gt;
Subject: &lt;a href=&quot;https://jira.whamcloud.com/browse/LU-14918&quot; title=&quot;too many ldiskfs transaction credits when unlinking overstriped files&quot; class=&quot;issue-link&quot; data-issue-key=&quot;LU-14918&quot;&gt;&lt;del&gt;LU-14918&lt;/del&gt;&lt;/a&gt; osd: don&apos;t declare similar zfs writes twice&lt;br/&gt;
Project: fs/lustre-release&lt;br/&gt;
Branch: master&lt;br/&gt;
Current Patch Set: &lt;br/&gt;
Commit: c1936c9d294d53ff39741e1b07ffc74f51fcddb6&lt;/p&gt;</comment>
                            <comment id="362726" author="pjones" created="Tue, 14 Feb 2023 13:25:41 +0000"  >&lt;p&gt;Landed for 2.16&lt;/p&gt;</comment>
                    </comments>
                <issuelinks>
                            <issuelinktype id="10011">
                    <name>Related</name>
                                            <outwardlinks description="is related to ">
                                        <issuelink>
            <issuekey id="65805">LU-14965</issuekey>
        </issuelink>
                            </outwardlinks>
                                                                <inwardlinks description="is related to">
                                        <issuelink>
            <issuekey id="67671">LU-15380</issuekey>
        </issuelink>
            <issuelink>
            <issuekey id="27519">LU-5890</issuekey>
        </issuelink>
                            </inwardlinks>
                                    </issuelinktype>
                    </issuelinks>
                <attachments>
                    </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_10390" key="com.pyxis.greenhopper.jira:gh-lexo-rank">
                        <customfieldname>Rank</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>1|i0215z:</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>
                                                                                            <customfield id="customfield_10060" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                        <customfieldname>Severity</customfieldname>
                        <customfieldvalues>
                                <customfieldvalue key="10022"><![CDATA[3]]></customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                        </customfields>
    </item>
</channel>
</rss>