<!-- 
RSS generated by JIRA (9.4.14#940014-sha1:734e6822bbf0d45eff9af51f82432957f73aa32c) at Sat Feb 10 02:06:54 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-7207] HSM: Add Archive UUID to delete changelog records</title>
                <link>https://jira.whamcloud.com/browse/LU-7207</link>
                <project id="10000" key="LU">Lustre</project>
                    <description>&lt;p&gt;HSM tools currently store an external identifier (such as a UUID) in EA when a file is archived. The identifier is used to identify the file in the backend archive, and there may be more than one identifier if the file has been archived to multiple backends. Currently different tools are doing this independently and are not coordinating their EA names or formats. &lt;/p&gt;

&lt;p&gt;When a file is deleted, the EA is no longer available, so it would be helpful include the  identifier(s) in the Delete changelog record.  I suggest we define a standard name and format HSM archive EA, and this data should be included as is in the delete changelog record.&lt;/p&gt;

&lt;p&gt;One possible format would be to use JSON to encode a list of endpoint and archive id. Here is a strawman example to begin the discussion: &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;{
  &lt;span class=&quot;code-quote&quot;&gt;&quot;replicas&quot;&lt;/span&gt;: [
    {
      &lt;span class=&quot;code-quote&quot;&gt;&quot;endpoint&quot;&lt;/span&gt; : &lt;span class=&quot;code-quote&quot;&gt;&quot;s3:&lt;span class=&quot;code-comment&quot;&gt;//my-bucket/archve&quot;&lt;/span&gt;,
&lt;/span&gt;      &lt;span class=&quot;code-quote&quot;&gt;&quot;id&quot;&lt;/span&gt;: &lt;span class=&quot;code-quote&quot;&gt;&quot;UUID&quot;&lt;/span&gt;
     },
    { 
      &lt;span class=&quot;code-quote&quot;&gt;&quot;endpoint&quot;&lt;/span&gt; : &lt;span class=&quot;code-quote&quot;&gt;&quot;wos:&lt;span class=&quot;code-comment&quot;&gt;//address&quot;&lt;/span&gt;,
&lt;/span&gt;      &lt;span class=&quot;code-quote&quot;&gt;&quot;id&quot;&lt;/span&gt;: OID
    }
  ]
}
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Alternatively, to save space the endpoint could just be an index that refers to a specific endpoint in the local configuration.&lt;/p&gt;</description>
                <environment></environment>
        <key id="32303">LU-7207</key>
            <summary>HSM: Add Archive UUID to delete changelog records</summary>
                <type id="1" iconUrl="https://jira.whamcloud.com/secure/viewavatar?size=xsmall&amp;avatarId=11303&amp;avatarType=issuetype">Bug</type>
                                            <priority id="4" iconUrl="https://jira.whamcloud.com/images/icons/priorities/minor.svg">Minor</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="rread">Robert Read</reporter>
                        <labels>
                    </labels>
                <created>Thu, 24 Sep 2015 17:36:47 +0000</created>
                <updated>Thu, 25 Apr 2019 17:06:24 +0000</updated>
                                                                                <due></due>
                            <votes>0</votes>
                                    <watches>19</watches>
                                                                            <comments>
                            <comment id="128588" author="lixi" created="Mon, 28 Sep 2015 07:13:28 +0000"  >&lt;p&gt;This is really a good idea. Vote +1&lt;/p&gt;</comment>
                            <comment id="133331" author="lixi" created="Thu, 12 Nov 2015 05:33:42 +0000"  >&lt;p&gt;Is there any body working/will work on this? If no, I&apos;d like to do a little bit research on this at least.&lt;/p&gt;</comment>
                            <comment id="135582" author="adilger" created="Tue, 8 Dec 2015 23:20:03 +0000"  >&lt;p&gt;It is my goal that the HSM archive xattr also be usable as a component in a composite file (&lt;a href=&quot;http://wiki.lustre.org/Layout_Enhancement#2.1._Composite_Layouts&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;http://wiki.lustre.org/Layout_Enhancement#2.1._Composite_Layouts&lt;/a&gt;).  That would mean there is no need to have an HSM structure that allows multiple archive IDs to be expressed directly, since this could be handled by the composite layouts rather than as a separate xattr. &lt;/p&gt;

&lt;p&gt;The main reason for to put the HSM archive ID as part of a composite file is to allow partial file restore to be implemented.  The HSM archived file would typically cover the whole file (though it could also cover a subset if that was really needed by specifying the extents of the component, and possibly allowing an &quot;offset&quot; of the archived file within the component).  Partial restores from tape would get separate OST-based components that &quot;mirror&quot; the archive copy (i.e. overlapping extents) for the part of the file that is restored.&lt;/p&gt;

&lt;p&gt;Also, having a binary data structure along the lines of lov_mds_md would be easier to manage in the kernel, and in particular the structure needs to have a unique magic value at the start so that the component type can be identified (e.g. HSM archive component vs. RAID-0 on OST(s) vs. RAID-N parity).&lt;/p&gt;

&lt;p&gt;My strawman would allow the direct use of older HSM xattrs as a sub-layout to allow converting over existing files, something like:&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_hsm_attrs_v1 {
        __u32 hsm_magic;                &lt;span class=&quot;code-comment&quot;&gt;/* LOV_MAGIC_HSM_V1, replaces hsm_compat */&lt;/span&gt;
        __u32 hsm_flags;            &lt;span class=&quot;code-comment&quot;&gt;/* HS_* states from &lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; hsm_states */&lt;/span&gt;
        __u64 hsm_arch_id;           &lt;span class=&quot;code-comment&quot;&gt;/* integer archive number the data is in */&lt;/span&gt;
        __u64 hsm_arch_ver;          &lt;span class=&quot;code-comment&quot;&gt;/* data version of file in archive */&lt;/span&gt;
};
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The new HSM sub-layout that includes the archive UUID would look something like:&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_hsm_attrs_v2 {
        __u32 hsm_magic;             &lt;span class=&quot;code-comment&quot;&gt;/* LOV_MAGIC_HSM_V2, replaces hsm_compat */&lt;/span&gt;
        __u32 hsm_flags;            &lt;span class=&quot;code-comment&quot;&gt;/* HS_* states from &lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; hsm_states */&lt;/span&gt;
        __u64 hsm_arch_id;           &lt;span class=&quot;code-comment&quot;&gt;/* integer archive number the data is in */&lt;/span&gt;
        __u64 hsm_arch_ver;          &lt;span class=&quot;code-comment&quot;&gt;/* data version of file in archive */&lt;/span&gt;
        __u16 hsm_file_id_len;          &lt;span class=&quot;code-comment&quot;&gt;/* length of archive-unique identifier hsm_uuid */&lt;/span&gt;
        __u16 hsm_padding2;
        unsigned &lt;span class=&quot;code-object&quot;&gt;char&lt;/span&gt; hsm_file_id[0];  &lt;span class=&quot;code-comment&quot;&gt;/* identifier &lt;span class=&quot;code-keyword&quot;&gt;for&lt;/span&gt; file data within &lt;span class=&quot;code-quote&quot;&gt;&quot;hsm_arch_num&quot;&lt;/span&gt; archive */&lt;/span&gt;
};
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;ul class=&quot;alternate&quot; type=&quot;square&quot;&gt;
	&lt;li&gt;&lt;tt&gt;hsm_magic&lt;/tt&gt; is &lt;tt&gt;LOV_HSM_MAGIC_V2&lt;/tt&gt; = &lt;tt&gt;0x45320BD0&lt;/tt&gt; (&quot;4532&quot; =&amp;gt; &quot;HSM2&quot;)&lt;/li&gt;
	&lt;li&gt;&lt;tt&gt;hsm_flags&lt;/tt&gt; is one of the &lt;tt&gt;HS_&amp;#42;&lt;/tt&gt; flags from &lt;tt&gt;enum hsm_states&lt;/tt&gt;&amp;#42;&lt;/li&gt;
	&lt;li&gt;&lt;tt&gt;hsm_arch_id&lt;/tt&gt; would continue to be as it is today - an integer identifier for the archive in which the data exists. Normally this would be a small integer that is an index in a table to identify which copytool should be used, but might map directly to some other identifier (e.g. tape volume?) in some implementations.&lt;/li&gt;
	&lt;li&gt;&lt;tt&gt;hsm_arch_ver&lt;/tt&gt; is a hash that identifies the version of data stored in the archived file.  There is no relationship assumed between different &lt;tt&gt;hsm_arch_ver&lt;/tt&gt; values, other than equality indicating that the data is identical.&lt;/li&gt;
	&lt;li&gt;&lt;tt&gt;hsm_file_id_len&lt;/tt&gt; is the length of &lt;tt&gt;hsm_file_id&lt;/tt&gt; in bytes.&lt;/li&gt;
	&lt;li&gt;&lt;tt&gt;hsm_file_id&lt;/tt&gt; is an archive-specific identifier for the file in the archive identified by &lt;tt&gt;hsm_arch_id&lt;/tt&gt;. (Open question - should this be ASCII?  With a trailing NUL?  Or is e.g. a binary 16-byte UUID preferable to save space inside the inode (with one of 
{ HS_UUID | HS_U64 | HS_ASCII | HS_BIN }
&lt;p&gt; so that they could be formatted correctly for printing?), instead of a 36-byte ASCII UUID?)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&amp;#42; &lt;tt&gt;enum hsm_states&lt;/tt&gt; should be renamed &lt;tt&gt;enum hsm_flags&lt;/tt&gt; to match the comment at &lt;tt&gt;struct hsm_attrs&lt;/tt&gt; (or vice versa in the rest of the code), and &lt;tt&gt;enum hsm_flags&lt;/tt&gt; should be used for all of the variables and functions that hold &lt;tt&gt;HS_&amp;#42;&lt;/tt&gt; values.&lt;/p&gt;</comment>
                            <comment id="135607" author="adilger" created="Wed, 9 Dec 2015 00:27:15 +0000"  >&lt;p&gt;For composite layout access by userspace, &quot;lfs getstripe&quot; will be updated as part of the PFL project to format composite layouts in YAML format, so this can be consumed directly by user tools if desired, something like below (still open to suggestions on this):&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;$ lfs getstripe -v /mnt/lustre/file
&quot;/mnt/lustre/file&quot;:
  fid: &quot;[0x200000400:0x2c3:0x0]&quot;
  composite_header:
    composite_magic: 0x0BDC0BD0
    composite_size:  536
    composite_gen:   6
    composite_flags: 0
    component_count: 3
  components:
    - component_id:     2
      component_flags:  stale, version
      component_start:  0
      component_end:    18446744073709551615
      component_offset: 152
      component_size:   48
      sub_layout:
        hsm_magic:      0x45320BD0
        hsm_flags:      [ exists, archived ] 
        hsm_arch_id:    1
        hsm_arch_ver:   0xabcd1234
        hsm_uuid_len:   16
        hsm_uuid:      e60649ac-b4e3-453f-88c7-611e78c38d5a
    - component_id:     3
      component_flags:  0
      component_start:  20971520
      component_end:    216777216
      component_offset: 208
      component_size:   144
      sub_layout:
        lmm_magic:        0x0BD30BD0
        lmm_pattern:      1
        lmm_stripe_size:  1048576
        lmm_stripe_count: 4
        lmm_stripe_index: 0
        lmm_layout_gen:   0
        lmm_layout_pool: flash
        lmm_obj:
          - 0: { lmm_ost: 0, lmm_fid: &quot;[0x100000000:0x2:0x0]&quot; }
          - 1: { lmm_ost: 1, lmm_fid: &quot;[0x100010000:0x3:0x0]&quot; }
          - 2: { lmm_ost: 2, lmm_fid: &quot;[0x100020000:0x4:0x0]&quot; }
          - 3: { lmm_ost: 3, lmm_fid: &quot;[0x100030000:0x4:0x0]&quot; }
    - component_id:     4
      component_flags:  0
      component_start:  3355443200
      component_end:    3367108864
      component_offset: 352
      component_size:   144
      sub_layout:
        lmm_magic:        0x0BD30BD0
        lmm_pattern:      1
        lmm_stripe_size:  4194304
        lmm_stripe_count: 4
        lmm_stripe_index: 5
        lmm_pool:         flash
        lmm_layout_gen:   0
        lmm_obj:
          - 0: { lmm_ost: 5, lmm_fid: &quot;[0x100050000:0x2:0x0]&quot; }
          - 1: { lmm_ost: 6, lmm_fid: &quot;[0x100060000:0x2:0x0]&quot; }
          - 2: { lmm_ost: 7, lmm_fid: &quot;[0x100070000:0x3:0x0]&quot; }
          - 3: { lmm_ost: 0, lmm_fid: &quot;[0x100000000:0x3:0x0]&quot; }
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This describes a file that was originally written (as a normal RAID-0 file), then archived (creating &lt;tt&gt;component_id&lt;/tt&gt; #2 on the same file), and then two disjoint parts of the file (offsets at 21MB and 3.3GB) were read back in from tape to create component_id&apos;s #3 and #4.  The actual policy decisions of when to read in partial files is up to the policy engine and copytool, and outside the scope of the on-disk format.&lt;/p&gt;</comment>
                            <comment id="135673" author="rread" created="Wed, 9 Dec 2015 17:22:25 +0000"  >&lt;p&gt;Will it be possible to support multiple hsm sub_layouts  per component?  &lt;/p&gt;

&lt;p&gt;UUID has specific meaning and not all the identifiers will be UUIDs, so the field should be a bit more generic, such as hsm_identifier or hsm_data. (I know we&apos;ve excessively abused &quot;UUID&quot; in Lustre since forever but no reason to continue doing that.) &lt;/p&gt;

&lt;p&gt;YAML output is great, but I&apos;d expect copytools would be using the API to retrieve the layout data and update the identifiers. &lt;/p&gt;

&lt;p&gt;Note, we&apos;ll still need to use user xattrs to store UUIDs until this work is completed, so the original idea here would still be a useful interim solution. &lt;/p&gt;</comment>
                            <comment id="135769" author="adilger" created="Thu, 10 Dec 2015 03:48:22 +0000"  >&lt;p&gt;My initial thought wouldn&apos;t be to store multiple UUIDs per component, but rather to store each archive copy in a separate component, possibly expanding the lov_hsm_attrs_v2 to store an &quot;archive date&quot; so that this could be used for storing multiple versions of the file (in-filesystem versions would store the timestamps on the OST objects as they do now). That makes archive copies and in-filesystem copies more alike.&lt;/p&gt;

&lt;p&gt;The main difference, besides performance, would be that we can&apos;t randomly update the archive data copy, though we could do clever things like create new components for parts of the file being written, so long as they are block aligned. &lt;/p&gt;</comment>
                            <comment id="135771" author="adilger" created="Thu, 10 Dec 2015 04:48:02 +0000"  >&lt;p&gt;To continue my previous comments, it would be &lt;em&gt;possible&lt;/em&gt; to store multiple UUIDs (or whatever we want to call them) in a single struct lov_hsm_attr_v2, like objects in a lov_mds_md, if it also stored the count of such entries is also stored. They would have to be in the same archive. &lt;/p&gt;

&lt;p&gt;I would hope that if we are adding a new xattr format that we would just use the same lov_hsm_attr_v2 struct (whatever we decide it to look like) for the existing &quot;hsm&quot; xattr until composite layouts are ready, to avoid having three different ways to store this data.  Depending on release schedules it may be that they are ready in the same release and we don&apos;t need to handle both access styles. &lt;/p&gt;</comment>
                            <comment id="138318" author="fzago" created="Fri, 8 Jan 2016 15:53:43 +0000"  >&lt;p&gt;IMO the UUID should be stored as an opaque binary array. If it is ASCII, then it limits its format (or length), and the tools have to do back and forth conversions like is currently done with FIDs.&lt;/p&gt;

&lt;p&gt;YAML output is nice but there isn&apos;t a decent library to read/extract them in C. I&apos;d prefer JSON (which one can still parse as YAML) or XML. Due to YAML complexity, the python YAML is also slower than the JSON parser. Or we could have an --xml / --json / --yaml option to lfs, allowing the user to choose.&lt;/p&gt;</comment>
                            <comment id="143641" author="rread" created="Wed, 24 Feb 2016 19:34:06 +0000"  >&lt;p&gt;I agree, the external key should be opaque data and interpreted by data mover associated with the archive ID for that file.&lt;/p&gt;

&lt;p&gt;Getting back to the original intention of this ticket, no matter how or where the key is stored, we still need a to ensure the data is available after a file has been deleted.  The original proposal here was to add the key to the changelog. Another option is to retain deleted inodes with the archived flag set  in a pending directory (much like what is currently done for open-unlinked and migrated files). The data mover would be able access the extend attributes directly using the FID, and since the remove operation already clears the archive flag, a periodic garbage collector could detect which inodes could be removed safely.  There could also be a timeout (a week?) to cleanup old files regardless of the achieve flag, just to ensure they don&apos;t collect indefinitely. &lt;/p&gt;</comment>
                            <comment id="143773" author="adilger" created="Thu, 25 Feb 2016 16:36:49 +0000"  >&lt;p&gt;If the timeout for these records is a week, then I don&apos;t think it is practical to keep this in unlinked inodes in the PENDING directory. Otherwise, there may be far too many inodes created and deleted in that period and PENDING may get too large. In that case I think it is more practical to store the UUID into the ChangeLog record.&lt;/p&gt;

&lt;p&gt;In newer releases it is possible to add extensible fields to ChangeLog records as needed, and the lifetime of those records will be exactly as needed. They will only consume a few bytes in a block in the log, and not an inode or increase in the size of the PENDING directory. &lt;/p&gt;</comment>
                            <comment id="143790" author="rread" created="Thu, 25 Feb 2016 17:19:34 +0000"  >&lt;p&gt;I agree adding changelog is more compact,, but the advantage of this approach is it decouples how the external HSM metadata is stored from Lustre internals, and provides more flexibility for the HSM tools. &lt;/p&gt;

&lt;p&gt;A week was just a suggestion. Obviously the TTL should be tunable and default to not retaining them at all. If the system is working properly then files should only be retained long enough to process the queue, and if things are not working properly then the directory could be flushed. &lt;/p&gt;</comment>
                            <comment id="156815" author="nrutman" created="Thu, 23 Jun 2016 23:21:58 +0000"  >&lt;p&gt;+1 for the UnlinkedArchived directory. The only files that live there will be ones that were archived, so presumably not your thousands of scratch files, but rather only ones you wanted to keep. (This also seems a yummy way to implement undelete, if one were to track the path somehow.) Mainly it means that you don&apos;t have to know ahead of time what format (or even what EA) the backend may be using to track it&apos;s ids. &lt;br/&gt;
I&apos;ll throw in another thought - it would be nice to send a tombstone request to the coordinator queue at every unlink. This would allow the copytool to do its thing without depending on Robinhood. E.g. copytool could delete the archive copy, or could put it on a delayed-delete list, etc. This has all the same problems (still need to know backend id mapping) except that presumably the reaction time will be fast, no &quot;pending for a week&quot; issues. It also starts moving away from RBH dependence, which IMHO is a good thing.&lt;/p&gt;</comment>
                            <comment id="213495" author="adilger" created="Sat, 11 Nov 2017 05:58:53 +0000"  >&lt;p&gt;Henri, what is the xattr name that is used by the RBH copytool, and what format does it store the archive identifier in the xattr (ASCII/binary, any archive prefix, etc)?&lt;/p&gt;</comment>
                            <comment id="213575" author="fzago" created="Mon, 13 Nov 2017 16:37:30 +0000"  >&lt;p&gt;It&apos;s configurable in Robinhood. For instance Cray&apos;s copytool stores it in &quot;trusted.tascon.uuid&quot;, and the format is ascii.&lt;/p&gt;</comment>
                            <comment id="243892" author="lixi_wc" created="Thu, 14 Mar 2019 01:00:35 +0000"  >&lt;p&gt;I guess not many people use Lustre itself has the HSM storage. But comparing to replying on other types of file system or storage, Lustre should have good support for using Lustre itself as HSM storage. Comparing to other HSM solutions, it would be much easier for the primary Lustre and HSM Lustre to work well together. Thus, instead of using the &quot;informal&quot; way of saving the UUIDs of HSM into Lustre file xattr, the primary Lustre should save the FID of the HSM Lustre into archived file. The target FID on the HSM Lustre could be saved as a inline field in an extended version of XATTR_NAME_HSM, since FID only has 128 bit.&lt;/p&gt;</comment>
                            <comment id="244067" author="adilger" created="Sat, 16 Mar 2019 10:49:25 +0000"  >&lt;p&gt;Yes, the &quot;archive UUID&quot; stored from the archive into the Lustre file is archive-specific, and in the Lustre-on-Lustre case it would likely be the remote FID.  That said, rather than just using an arbitrary xattr, or changing the XATTR_NAME_HSM, there are benefits to putting the archive UUID as part of a composite layout (PFL/FLR) in the file.&lt;/p&gt;

&lt;p&gt;There are several benefits to storing the HSM identifier in a composite layout:&lt;/p&gt;
&lt;ul class=&quot;alternate&quot; type=&quot;square&quot;&gt;
	&lt;li&gt;allow storing multiple different archive objects on the same file as mirrors/versions&lt;/li&gt;
	&lt;li&gt;allow partial restore of a file via PFL/FLR components&lt;/li&gt;
	&lt;li&gt;allow partial archive of a file, or archive in multiple parts if there are single-object size limits in the archive&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;One candidate for this is patch &lt;a href=&quot;https://review.whamcloud.com/33755&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;https://review.whamcloud.com/33755&lt;/a&gt; &quot;&lt;tt&gt;&lt;a href=&quot;https://jira.whamcloud.com/browse/LU-11376&quot; title=&quot;Special file/dir to represent DAOS Containers&quot; class=&quot;issue-link&quot; data-issue-key=&quot;LU-11376&quot;&gt;&lt;del&gt;LU-11376&lt;/del&gt;&lt;/a&gt; lov: new foreign LOV format&lt;/tt&gt;&quot;, which is just a generic Lustre layout, but even with this it would need some infrastructure changes for the code to understand this component type in the context of HSM.&lt;/p&gt;</comment>
                    </comments>
                <issuelinks>
                            <issuelinktype id="10011">
                    <name>Related</name>
                                            <outwardlinks description="is related to ">
                                        <issuelink>
            <issuekey id="31126">LU-6866</issuekey>
        </issuelink>
            <issuelink>
            <issuekey id="48631">LU-10092</issuekey>
        </issuelink>
            <issuelink>
            <issuekey id="53308">LU-11376</issuekey>
        </issuelink>
                            </outwardlinks>
                                                        </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|hzxokv:</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>