<!-- 
RSS generated by JIRA (9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66) at Thu Feb 08 08:52:18 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>MongoDB Jira</title>
    <link>https://jira.mongodb.org</link>
    <description>This file is an XML representation of an issue</description>
    <language>en-us</language>    <build-info>
        <version>9.7.1</version>
        <build-number>970001</build-number>
        <build-date>13-04-2023</build-date>
    </build-info>


<item>
            <title>[JAVA-448] Tailable Cursor and awaitdata</title>
                <link>https://jira.mongodb.org/browse/JAVA-448</link>
                <project id="10006" key="JAVA">Java Driver</project>
                    <description>&lt;p&gt;In tests, using a tailable cursor and a capped collection, I can fill the collection with say 10 docs and read them back. If I then ask for next doc, my test never ends.  In the test setup if I set a thread to wait for 6 seconds before adding a doc to the collection the test does end. I did a thread dump while the test blocked.  See further down&lt;/p&gt;

&lt;p&gt;Please confirm that the java driver should eventually return a nil doc assuming the await data option is set. Or confirm that this behaviour is for a future version.&lt;/p&gt;

&lt;p&gt;&amp;#8211; Dump (some jruby lines removed) &amp;#8211;&lt;/p&gt;

&lt;p&gt;&quot;ScriptThreadProcess: ./test/collection_test.rb&quot; daemon prio=10 tid=0x0000000002959000 nid=0x55b9 runnable &lt;span class=&quot;error&quot;&gt;&amp;#91;0x00007f2b2b7c1000&amp;#93;&lt;/span&gt;&lt;br/&gt;
   java.lang.Thread.State: RUNNABLE&lt;br/&gt;
	at java.net.SocketInputStream.socketRead0(Native Method)&lt;br/&gt;
	at java.net.SocketInputStream.read(SocketInputStream.java:150)&lt;br/&gt;
	at java.net.SocketInputStream.read(SocketInputStream.java:121)&lt;br/&gt;
	at java.io.BufferedInputStream.fill(BufferedInputStream.java:235)&lt;br/&gt;
	at java.io.BufferedInputStream.read1(BufferedInputStream.java:275)&lt;br/&gt;
	at java.io.BufferedInputStream.read(BufferedInputStream.java:334)&lt;/p&gt;
&lt;ul class=&quot;alternate&quot; type=&quot;square&quot;&gt;
	&lt;li&gt;locked &amp;lt;0x00000000eab22188&amp;gt; (a java.io.BufferedInputStream)&lt;br/&gt;
	at org.bson.io.Bits.readFully(Bits.java:35)&lt;br/&gt;
	at org.bson.io.Bits.readFully(Bits.java:28)&lt;br/&gt;
	at com.mongodb.Response.&amp;lt;init&amp;gt;(Response.java:39)&lt;br/&gt;
	at com.mongodb.DBPort.go(DBPort.java:123)&lt;/li&gt;
	&lt;li&gt;locked &amp;lt;0x00000000eaaf8d88&amp;gt; (a com.mongodb.DBPort)&lt;br/&gt;
	at com.mongodb.DBPort.go(DBPort.java:82)&lt;/li&gt;
	&lt;li&gt;locked &amp;lt;0x00000000eaaf8d88&amp;gt; (a com.mongodb.DBPort)&lt;br/&gt;
	at com.mongodb.DBPort.call(DBPort.java:72)&lt;br/&gt;
	at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:202)&lt;br/&gt;
	at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:186)&lt;br/&gt;
	at com.mongodb.DBApiLayer$Result._advance(DBApiLayer.java:424)&lt;br/&gt;
	at com.mongodb.DBApiLayer$Result.next(DBApiLayer.java:396)&lt;br/&gt;
	at com.mongodb.DBApiLayer$Result.next(DBApiLayer.java:397)&lt;br/&gt;
	at com.mongodb.DBApiLayer$Result.next(DBApiLayer.java:397)&lt;br/&gt;
	at com.mongodb.DBApiLayer$Result.next(DBApiLayer.java:397)&lt;br/&gt;
	at com.mongodb.DBApiLayer$Result.next(DBApiLayer.java:397)&lt;br/&gt;
	at com.mongodb.DBApiLayer$Result.next(DBApiLayer.java:1)&lt;br/&gt;
	at com.mongodb.DBCursor._next(DBCursor.java:445)&lt;br/&gt;
	at com.mongodb.DBCursor.next(DBCursor.java:525)&lt;br/&gt;
	at com.mongodb.DBCursor.next(DBCursor.java:1)&lt;br/&gt;
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)&lt;br/&gt;
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)&lt;br/&gt;
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)&lt;br/&gt;
	at java.lang.reflect.Method.invoke(Method.java:601)&lt;br/&gt;
	at org.jruby.javasupport.JavaMethod.invokeDirectWithExceptionHandling(JavaMethod.java:508)&lt;br/&gt;
	at org.jruby.javasupport.JavaMethod.invokeDirect(JavaMethod.java:368)&lt;br/&gt;
	at org.jruby.java.invokers.InstanceMethodInvoker.call(InstanceMethodInvoker.java:50)&lt;br/&gt;
	at org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:133)&lt;br/&gt;
	at org.jruby.ast.CallNoArgNode.interpret(CallNoArgNode.java:63)&lt;br/&gt;
	at org.jruby.ast.FCallOneArgNode.interpret(FCallOneArgNode.java:36)&lt;br/&gt;
	at org.jruby.ast.NewlineNode.interpret(NewlineNode.java:104)&lt;br/&gt;
	at org.jruby.evaluator.ASTInterpreter.INTERPRET_METHOD(ASTInterpreter.java:75)&lt;br/&gt;
	at org.jruby.internal.runtime.methods.InterpretedMethod.call(InterpretedMethod.java:147)&lt;br/&gt;
	at org.jruby.internal.runtime.methods.DefaultMethod.call(DefaultMethod.java:163)&lt;br/&gt;
	at org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:133)&lt;br/&gt;
	at org.jruby.ast.VCallNode.interpret(VCallNode.java:86)&lt;br/&gt;
	at org.jruby.ast.LocalAsgnNode.interpret(LocalAsgnNode.java:123)&lt;br/&gt;
	at org.jruby.ast.NewlineNode.interpret(NewlineNode.java:104)&lt;br/&gt;
	at org.jruby.ast.IfNode.interpret(IfNode.java:117)&lt;br/&gt;
	at org.jruby.ast.NewlineNode.interpret(NewlineNode.java:104)&lt;br/&gt;
	at org.jruby.evaluator.ASTInterpreter.INTERPRET_BLOCK(ASTInterpreter.java:112)&lt;br/&gt;
	at org.jruby.runtime.Interpreted19Block.evalBlockBody(Interpreted19Block.java:203)&lt;br/&gt;
	at org.jruby.runtime.Interpreted19Block.yield(Interpreted19Block.java:154)&lt;br/&gt;
	at org.jruby.runtime.Interpreted19Block.yieldSpecific(Interpreted19Block.java:127)&lt;br/&gt;
	at org.jruby.runtime.Block.yieldSpecific(Block.java:99)&lt;br/&gt;
	at org.jruby.ast.ZYieldNode.interpret(ZYieldNode.java:25)&lt;br/&gt;
	at org.jruby.ast.NewlineNode.interpret(NewlineNode.java:104)&lt;br/&gt;
	at org.jruby.ast.RescueNode.executeBody(RescueNode.java:216)&lt;br/&gt;
	at org.jruby.ast.RescueNode.interpretWithJavaExceptions(RescueNode.java:120)&lt;br/&gt;
	at org.jruby.ast.RescueNode.interpret(RescueNode.java:110)&lt;br/&gt;
	at org.jruby.ast.BeginNode.interpret(BeginNode.java:83)&lt;br/&gt;
	at org.jruby.ast.NewlineNode.interpret(NewlineNode.java:104)&lt;br/&gt;
	at org.jruby.evaluator.ASTInterpreter.INTERPRET_METHOD(ASTInterpreter.java:75)&lt;br/&gt;
	at org.jruby.internal.runtime.methods.InterpretedMethod.call(InterpretedMethod.java:212)&lt;br/&gt;
	at org.jruby.internal.runtime.methods.DefaultMethod.call(DefaultMethod.java:187)&lt;br/&gt;
	at org.jruby.runtime.callsite.CachingCallSite.callBlock(CachingCallSite.java:176)&lt;br/&gt;
	at org.jruby.runtime.callsite.CachingCallSite.callIter(CachingCallSite.java:187)&lt;br/&gt;
	at org.jruby.ast.FCallOneArgBlockNode.interpret(FCallOneArgBlockNode.java:34)&lt;br/&gt;
	at org.jruby.ast.NewlineNode.interpret(NewlineNode.java:104)&lt;br/&gt;
	at org.jruby.ast.BlockNode.interpret(BlockNode.java:71)&lt;br/&gt;
	at org.jruby.evaluator.ASTInterpreter.INTERPRET_METHOD(ASTInterpreter.java:75)&lt;br/&gt;
	at org.jruby.internal.runtime.methods.InterpretedMethod.call(InterpretedMethod.java:147)&lt;br/&gt;
	at org.jruby.internal.runtime.methods.DefaultMethod.call(DefaultMethod.java:163)&lt;br/&gt;
	at org.jruby.runtime.callsite.CachingCallSite.cacheAndCall(CachingCallSite.java:292)&lt;br/&gt;
	at org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:135)&lt;br/&gt;
	at $&lt;em&gt;dot&lt;/em&gt;.test.collection_test.block_5$RUBY$_&lt;em&gt;file&lt;/em&gt;_(./test/collection_test.rb:941)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;JRUBY&lt;br/&gt;
    it &quot;should find using a tailable cursor&quot; do&lt;br/&gt;
      tail = Mongo::Cursor.new(@capped, :timeout =&amp;gt; false, :tailable =&amp;gt; true,&lt;br/&gt;
                                        :await_data =&amp;gt; true, :order =&amp;gt; [&lt;span class=&quot;error&quot;&gt;&amp;#91;&amp;#39;$natural&amp;#39;, 1&amp;#93;&lt;/span&gt;])&lt;/p&gt;

&lt;p&gt;      10.times do&lt;br/&gt;
        assert tail.next_document&lt;br/&gt;
      end&lt;/p&gt;

&lt;p&gt;      Thread.new(@capped) do |col|&lt;br/&gt;
        sleep 6&lt;br/&gt;
        1.times { col.insert({:n =&amp;gt; 100}) }&lt;br/&gt;
      end&lt;/p&gt;

&lt;p&gt;      assert true, tail.alive?&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;blocks forever unless using thread to insert&lt;br/&gt;
      #assert_nil tail.next_document&lt;/li&gt;
&lt;/ol&gt;


&lt;ol&gt;
	&lt;li&gt;blocks until thread inserts docs&lt;br/&gt;
      assert tail.next_document&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;      assert tail.next_document&lt;br/&gt;
    end&lt;/p&gt;</description>
                <environment>Linux 64 bit Ubuntu, Java 7 Jruby 1.6.4 with 2.6.5 of the java driver on Mongo 1.8.3</environment>
        <key id="23574">JAVA-448</key>
            <summary>Tailable Cursor and awaitdata</summary>
                <type id="3" iconUrl="https://jira.mongodb.org/secure/viewavatar?size=xsmall&amp;avatarId=14718&amp;avatarType=issuetype">Task</type>
                                            <priority id="4" iconUrl="https://jira.mongodb.org/images/icons/priorities/minor.svg">Minor - P4</priority>
                        <status id="6" iconUrl="https://jira.mongodb.org/images/icons/statuses/closed.png" description="The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.">Closed</status>
                    <statusCategory id="3" key="done" colorName="success"/>
                                    <resolution id="9">Done</resolution>
                                        <assignee username="-1">Unassigned</assignee>
                                    <reporter username="guyboertje">Guy Boertje</reporter>
                        <labels>
                            <label>cursor</label>
                            <label>driver</label>
                            <label>tailable</label>
                    </labels>
                <created>Thu, 13 Oct 2011 07:54:44 +0000</created>
                <updated>Wed, 11 Sep 2019 19:12:51 +0000</updated>
                            <resolved>Wed, 19 Oct 2011 00:42:45 +0000</resolved>
                                    <version>2.6.5</version>
                                    <fixVersion>2.7</fixVersion>
                                    <component>API</component>
                                        <votes>0</votes>
                                    <watches>1</watches>
                                                                                                                <comments>
                            <comment id="61532" author="guyboertje" created="Wed, 19 Oct 2011 22:54:49 +0000"  >&lt;p&gt;Much appreciated. I have a modified fork of the driver from commit tagged 2.6.5, which commits will I have to cherry pick to have this behavour in my fork? I know its a long shot.  I modded to include the change for Symbol in BasicBSONCallback as per &lt;a href=&quot;https://jira.mongodb.org/browse/JAVA-441&quot; title=&quot;In BasicBSONCallback treat a Symbol as such&quot; class=&quot;issue-link&quot; data-issue-key=&quot;JAVA-441&quot;&gt;&lt;del&gt;JAVA-441&lt;/del&gt;&lt;/a&gt;.  I have tried cherrypicking Brendans commit but it segfaulted, though it could be my bad as I&apos;m not great at the whole build-to-jar thing.&lt;/p&gt;</comment>
                            <comment id="61524" author="antoine" created="Wed, 19 Oct 2011 22:22:00 +0000"  >&lt;p&gt;The fix here keeps the looping for the AWAIT case as fixed in &lt;a href=&quot;https://jira.mongodb.org/browse/JAVA-155&quot; title=&quot;StackOverflowError when fetching a tailable cursor after getting the last document&quot; class=&quot;issue-link&quot; data-issue-key=&quot;JAVA-155&quot;&gt;&lt;del&gt;JAVA-155&lt;/del&gt;&lt;/a&gt;.&lt;br/&gt;
But without AWAIT the hasNext() method will return as false without blocking.&lt;br/&gt;
The client can still use the cursor at a later time.&lt;br/&gt;
Tests were added for both modes.&lt;/p&gt;</comment>
                            <comment id="61523" author="auto" created="Wed, 19 Oct 2011 22:19:28 +0000"  >&lt;p&gt;Author:&lt;/p&gt;
{u&apos;login&apos;: u&apos;agirbal&apos;, u&apos;name&apos;: u&apos;agirbal&apos;, u&apos;email&apos;: u&apos;antoine@10gen.com&apos;}
&lt;p&gt;Message: &lt;a href=&quot;https://jira.mongodb.org/browse/JAVA-448&quot; title=&quot;Tailable Cursor and awaitdata&quot; class=&quot;issue-link&quot; data-issue-key=&quot;JAVA-448&quot;&gt;&lt;del&gt;JAVA-448&lt;/del&gt;&lt;/a&gt;: Tailable Cursor and awaitdata&lt;br/&gt;
Branch: master&lt;br/&gt;
&lt;a href=&quot;https://github.com/mongodb/mongo-java-driver/commit/c715a138eca38234d08d1d2f730ecec45e4de325&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;https://github.com/mongodb/mongo-java-driver/commit/c715a138eca38234d08d1d2f730ecec45e4de325&lt;/a&gt;&lt;/p&gt;</comment>
                            <comment id="61308" author="brendan" created="Wed, 19 Oct 2011 00:42:45 +0000"  >&lt;p&gt;Tailable cursors w/ no data but not in await mode will no longer block and sleep but instead return null.&lt;/p&gt;</comment>
                            <comment id="61307" author="auto" created="Wed, 19 Oct 2011 00:33:01 +0000"  >&lt;p&gt;Author:&lt;/p&gt;
{u&apos;login&apos;: u&apos;bwmcadams&apos;, u&apos;name&apos;: u&apos;Brendan W. McAdams&apos;, u&apos;email&apos;: u&apos;brendan@10gen.com&apos;}
&lt;p&gt;Message: &lt;a href=&quot;https://jira.mongodb.org/browse/JAVA-448&quot; title=&quot;Tailable Cursor and awaitdata&quot; class=&quot;issue-link&quot; data-issue-key=&quot;JAVA-448&quot;&gt;&lt;del&gt;JAVA-448&lt;/del&gt;&lt;/a&gt; - Tailable Cursor behavior while not in AWAIT mode&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Fixed non-await empty tailable cursor behavior to be more consistently inline with other drivers &amp;amp; user expectations.&lt;br/&gt;
Instead of forcing a sleep of 500 milliseconds on &quot;no data&quot;, we instead when tailable catch an empty cursor and return null instead.  This should be more safely non blocking for users who need to roll their own event driven code, for which the sleep breaks logic.&lt;br/&gt;
Branch: master&lt;br/&gt;
&lt;a href=&quot;https://github.com/mongodb/mongo-java-driver/commit/456b8667b004e8e12d600f811d0ab62caf5d987d&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;https://github.com/mongodb/mongo-java-driver/commit/456b8667b004e8e12d600f811d0ab62caf5d987d&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</comment>
                            <comment id="61297" author="antoine" created="Tue, 18 Oct 2011 23:59:36 +0000"  >&lt;p&gt;when QUERYOPTION_AWAITDATA is on, it behaves properly: blocks in the hasNext() loop.&lt;br/&gt;
when it is off, code still blocks in the loop, doing a sleep(500).&lt;br/&gt;
So in both cases it&apos;s the same behavior.&lt;br/&gt;
But without awaitdata, hasNext() should return right away as false.&lt;br/&gt;
Client can decide to poll again at a later time.&lt;/p&gt;</comment>
                            <comment id="61292" author="brendan" created="Tue, 18 Oct 2011 23:32:21 +0000"  >&lt;p&gt;There&apos;s one relevant bit above that try{Thread.sleep however though:&lt;/p&gt;


&lt;p&gt;        // have a tailable cursor&lt;/p&gt;

&lt;p&gt;        if ( ( _flags &amp;amp; Bytes.RESULTFLAG_AWAITCAPABLE ) &amp;gt; 0 &amp;amp;&amp;amp; ( queryOptions &amp;amp; Bytes.QUERYOPTION_AWAITDATA ) &amp;gt; 0 )&lt;br/&gt;
            return true;&lt;/p&gt;


&lt;p&gt;Which &lt;b&gt;should&lt;/b&gt; behave correctly there, and not block.  Basically it checks that both the server is await capable and AWAIT was set, and returns immediately.  OTHERWISE it blocks...&lt;/p&gt;</comment>
                            <comment id="61226" author="antoine" created="Tue, 18 Oct 2011 19:24:19 +0000"  >&lt;p&gt;I think there is some bad code in the driver, this loops:&lt;/p&gt;

&lt;p&gt;        public boolean hasNext(){&lt;br/&gt;
            while ( true )&lt;/p&gt;
{
                if ( _cur.hasNext() )
                    return true;

                if ( ! _curResult.hasGetMore( _options ) )
                    return false;

                _advance();
            }
&lt;p&gt;        }&lt;/p&gt;

&lt;p&gt;    public boolean hasGetMore( int queryOptions ){&lt;br/&gt;
...&lt;br/&gt;
        try &lt;/p&gt;
{
            Thread.sleep( 500 );
        }
&lt;p&gt;        catch ( Exception e ){}&lt;/p&gt;

&lt;p&gt;        return true;&lt;br/&gt;
    }&lt;/p&gt;

&lt;p&gt;This result in hasNext() being stuck in a loop even without AWAIT.&lt;br/&gt;
I dont know why it was done that way, maybe it was implemented before AWAIT was available.&lt;/p&gt;</comment>
                            <comment id="61224" author="antoine" created="Tue, 18 Oct 2011 19:16:55 +0000"  >&lt;p&gt;I did a quick test and indeed the request blocks even without AWAIT_DATA.&lt;br/&gt;
At first that seems like a bug on the server side.&lt;br/&gt;
But you are saying it is fine with the ruby driver? In that case there is a problem in java driver..&lt;/p&gt;</comment>
                            <comment id="61209" author="guyboertje" created="Tue, 18 Oct 2011 18:41:03 +0000"  >&lt;p&gt;I will double check.  I recall that the original test did not set AWAITDATA but still blocked.&lt;/p&gt;

&lt;p&gt;This is the test&lt;/p&gt;

&lt;p&gt;adds 10 docs in setup&lt;/p&gt;

&lt;p&gt;   should &quot;find using a tailable cursor&quot; do&lt;br/&gt;
      tail = Cursor.new(@capped, :tailable =&amp;gt; true, :order =&amp;gt; [&lt;span class=&quot;error&quot;&gt;&amp;#91;&amp;#39;$natural&amp;#39;, 1&amp;#93;&lt;/span&gt;])&lt;br/&gt;
      10.times do&lt;br/&gt;
        assert tail.next_document&lt;br/&gt;
      end&lt;br/&gt;
      assert_nil tail.next_document &amp;lt;------ blocks here&lt;br/&gt;
      @capped.insert({:n =&amp;gt; 100})&lt;br/&gt;
      assert tail.next_document&lt;br/&gt;
    end&lt;/p&gt;</comment>
                            <comment id="61164" author="antoine" created="Tue, 18 Oct 2011 16:49:30 +0000"  >&lt;p&gt;I am not sure I fully understand the need.&lt;br/&gt;
If you need to return right away, why not use TAILABLE but without AWAITDATA?&lt;br/&gt;
Then you can potentially implement some wait time client side, e.g. a loop that polls and sleeps, with a timeout&lt;/p&gt;</comment>
                            <comment id="60728" author="guyboertje" created="Sun, 16 Oct 2011 00:57:19 +0000"  >&lt;p&gt;This presents a bit of a problem because the ruby driver returns a nil document immediately.  I have looked at the RabbitMq Java driver - it has a QueuingConsumer class that allows for a timeout when waiting for a delivery.  A tailable cursor is similar and I suggest that this driver should provide similar semantics.  I encourage you to look at the class I mentioned.&lt;/p&gt;

&lt;p&gt;Using a tailable cursor in an event driven way needs a loop with a callback and the loop needs to exit occasionally (to shutdown perhaps). I think this the loop, timeout and callback invocation are driver side duties.&lt;/p&gt;

&lt;p&gt;For now I am going be invasive and, in another thread after a timeout period, put a &apos;poison&apos; doc into the collection from the cursor and return nil from the next method if it receives a &apos;poison&apos; doc.&lt;/p&gt;</comment>
                            <comment id="60520" author="antoine" created="Fri, 14 Oct 2011 17:38:22 +0000"  >&lt;p&gt;I have not tested the behavior, but it seems this is independent of the driver and it&apos;s a server feature.&lt;br/&gt;
If using awaitdata, it&apos;s telling the server to block until at least 1 new document is available.&lt;br/&gt;
The doc says that eventually a timeout will make the server return null, but that timeout may be long like 30min.&lt;/p&gt;</comment>
                    </comments>
                    <attachments>
                    </attachments>
                <subtasks>
                    </subtasks>
                <customfields>
                                                                                                                                                                                                                        <customfield id="customfield_10011" key="com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons">
                        <customfieldname>Backwards Compatibility</customfieldname>
                        <customfieldvalues>
                                <customfieldvalue key="10012"><![CDATA[Major Change]]></customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                <customfield id="customfield_15850" key="com.atlassian.jira.plugins.jira-development-integration-plugin:devsummary">
                        <customfieldname>Development</customfieldname>
                        <customfieldvalues>
                            
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    <customfield id="customfield_12550" key="com.pyxis.greenhopper.jira:gh-lexo-rank">
                        <customfieldname>Rank</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>2|hrhbn3:</customfieldvalue>

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