<!-- 
RSS generated by JIRA (9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66) at Thu Feb 08 04:36:02 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>[SERVER-34256] On error within a transaction, expose in response whether transaction can be safely retried from the beginning</title>
                <link>https://jira.mongodb.org/browse/SERVER-34256</link>
                <project id="10000" key="SERVER">Core Server</project>
                    <description></description>
                <environment></environment>
        <key id="520614">SERVER-34256</key>
            <summary>On error within a transaction, expose in response whether transaction can be safely retried from the beginning</summary>
                <type id="3" iconUrl="https://jira.mongodb.org/secure/viewavatar?size=xsmall&amp;avatarId=14718&amp;avatarType=issuetype">Task</type>
                                            <priority id="3" iconUrl="https://jira.mongodb.org/images/icons/priorities/major.svg">Major - P3</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="13201">Fixed</resolution>
                                        <assignee username="siyuan.zhou@mongodb.com">Siyuan Zhou</assignee>
                                    <reporter username="spencer@mongodb.com">Spencer Brody</reporter>
                        <labels>
                    </labels>
                <created>Mon, 2 Apr 2018 17:27:10 +0000</created>
                <updated>Sun, 29 Oct 2023 22:33:05 +0000</updated>
                            <resolved>Tue, 8 May 2018 19:56:35 +0000</resolved>
                                                    <fixVersion>4.0.0-rc0</fixVersion>
                                    <component>Replication</component>
                                        <votes>0</votes>
                                    <watches>10</watches>
                                                                                                                <comments>
                            <comment id="1886275" author="xgen-internal-githook" created="Tue, 8 May 2018 19:55:41 +0000"  >&lt;p&gt;Author:&lt;/p&gt;
{&apos;email&apos;: &apos;siyuan.zhou@mongodb.com&apos;, &apos;name&apos;: &apos;Siyuan Zhou&apos;, &apos;username&apos;: &apos;visualzhou&apos;}
&lt;p&gt;Message: &lt;a href=&quot;https://jira.mongodb.org/browse/SERVER-34256&quot; title=&quot;On error within a transaction, expose in response whether transaction can be safely retried from the beginning&quot; class=&quot;issue-link&quot; data-issue-key=&quot;SERVER-34256&quot;&gt;&lt;del&gt;SERVER-34256&lt;/del&gt;&lt;/a&gt; Expose TransientTxnError error labels in response.&lt;br/&gt;
Branch: master&lt;br/&gt;
&lt;a href=&quot;https://github.com/mongodb/mongo/commit/e6c9fa2388b3ee6f789b14c5f767ea4c01834090&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;https://github.com/mongodb/mongo/commit/e6c9fa2388b3ee6f789b14c5f767ea4c01834090&lt;/a&gt;&lt;/p&gt;</comment>
                            <comment id="1882538" author="jesse" created="Fri, 4 May 2018 01:25:38 +0000"  >&lt;p&gt;Drivers generally have a root exception class, or something like that, which will I hope allow them all to add an errorLabel API to &lt;b&gt;all&lt;/b&gt; exceptions they throw. We have some special exception classes for some exceptions (e.g. PyMongo has a DuplicateKeyError which inherits from OperationFailure), but that&apos;s ok. We&apos;ll add error labels to the root class.&lt;/p&gt;

&lt;p&gt;Note, error labels don&apos;t change our exception class hierarchies. We won&apos;t throw an exception of a different class in response to receiving a server error label. We&apos;ll throw the same class of exception we did before, now with one or more labels added.&lt;/p&gt;</comment>
                            <comment id="1882452" author="spencer" created="Thu, 3 May 2018 22:36:20 +0000"  >&lt;p&gt;Ah I understand.&#160; We have special objects in the shell for representing various types of error returns from operations, and we needed to figure out which ones of those should expose the errorLabels.&#160; I &lt;b&gt;believe&lt;/b&gt;&#160;drivers expose all types of errors in the same way (as exceptions in the languages that support them, not sure about the others), but it would be good to confirm.&#160; &lt;a href=&quot;https://jira.mongodb.org/secure/ViewProfile.jspa?name=jesse&quot; class=&quot;user-hover&quot; rel=&quot;jesse&quot;&gt;jesse&lt;/a&gt;&lt;/p&gt;</comment>
                            <comment id="1881237" author="siyuan.zhou@10gen.com" created="Thu, 3 May 2018 00:43:59 +0000"  >&lt;p&gt;The shell does not return the raw response for write commands, because it has the logic to merge responses from several requests of a single bulk execution. The shell has&#160;&lt;tt&gt;WriteCommandError, WriteResult,&#160;BulkWriteResult,&#160;BulkWriteError,&#160;WriteError and&#160;WriteConcernError&lt;/tt&gt; classes to represent different types of results of a bulk execution. I imagine drivers have something similar and need to expose the new field &lt;tt&gt;errorLables&lt;/tt&gt;&#160;somehow. In the shell,&#160;&lt;tt&gt;WriteCommandError&lt;/tt&gt; will be returned (for insert()) or thrown (for insertOne() and insertMany()) for all TransientTxnErrors, so I exposed the errorLabels there in the patch set I&apos;m working on.&lt;/p&gt;</comment>
                            <comment id="1881170" author="spencer" created="Wed, 2 May 2018 23:05:42 +0000"  >&lt;p&gt;I don&apos;t follow - what do you mean by &quot;wrapping the responses&quot;?&#160; What are you suggesting that the drivers need to do?&lt;/p&gt;</comment>
                            <comment id="1881153" author="siyuan.zhou@10gen.com" created="Wed, 2 May 2018 22:34:42 +0000"  >&lt;p&gt;&lt;a href=&quot;https://jira.mongodb.org/secure/ViewProfile.jspa?name=max.hirschhorn&quot; class=&quot;user-hover&quot; rel=&quot;max.hirschhorn&quot;&gt;max.hirschhorn&lt;/a&gt; told&#160;me that we are wrapping the responses for write commands in the shell. I&apos;m not sure if that&apos;s true in drivers. If so, we need to update either the driver spec or the error handling spec to update the bulk api response format.&lt;/p&gt;</comment>
                            <comment id="1877944" author="jesse" created="Mon, 30 Apr 2018 15:42:59 +0000"  >&lt;p&gt;Good, that sounds like it&apos;s a simple server behavior for drivers to handle.&lt;/p&gt;</comment>
                            <comment id="1877441" author="siyuan.zhou@10gen.com" created="Mon, 30 Apr 2018 06:53:27 +0000"  >&lt;p&gt;It turns out write commands won&apos;t report transaction transient errors in the embedded&#160;&lt;tt&gt;writeErrors&lt;/tt&gt;&#160;array, because any error on any write operation in a transaction will &lt;a href=&quot;https://github.com/mongodb/mongo/blob/793e59f11b558db3d833a12ec23bbacc359011a1/src/mongo/db/ops/write_ops_exec.cpp#L238-L241&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;fail the whole batch by throwing the error&lt;/a&gt;.&lt;/p&gt;</comment>
                            <comment id="1873125" author="tess.avitabile" created="Tue, 24 Apr 2018 19:45:33 +0000"  >&lt;p&gt;We made a decision in the transactions leads meeting today that &lt;tt&gt;NoSuchTransaction&lt;/tt&gt; should get the error label &lt;tt&gt;TransientTxnError&lt;/tt&gt;. The rationale is that if we don&apos;t know why a transaction was aborted, so we don&apos;t know whether it is retryable, we should report that it is retryable be default. This ensures that if a transaction was aborted due to failover, it can be retried. If the transaction was in fact not retryable (but the client missed the response and did not receive the error), then the client will get the correct (non-retryable) error when they attempt to retry. This will make transactions more usable at the expense of sometimes retrying non-retryable transactions.&lt;/p&gt;

&lt;p&gt;The one case of concern is when a transaction was aborted by &lt;tt&gt;killSessions&lt;/tt&gt;. The application can get a &lt;tt&gt;NoSuchTransaction&lt;/tt&gt; error, which is considered retryable, and attempt to retry the transaction, so the operator may need to kill the transaction again. We will consider whether we should do something for 4.0 to record the kill reason in the case of &lt;tt&gt;killSessions&lt;/tt&gt;, so that we do not return a retryable error. But for the sake of this ticket, we will consider &lt;tt&gt;NoSuchTransaction&lt;/tt&gt; a retryable error.&lt;/p&gt;</comment>
                            <comment id="1871847" author="siyuan.zhou@10gen.com" created="Mon, 23 Apr 2018 20:06:30 +0000"  >&lt;p&gt;At the end of the meeting on 4/19, we decided to have drivers to track failover and mark those errors that could happen both on the old and new primary during a failover as &lt;tt&gt;TransientTxnError&lt;/tt&gt;. Just want to confirm that with driver team. &lt;a href=&quot;https://jira.mongodb.org/secure/ViewProfile.jspa?name=shane.harvey&quot; class=&quot;user-hover&quot; rel=&quot;shane.harvey&quot;&gt;shane.harvey&lt;/a&gt; and &lt;a href=&quot;https://jira.mongodb.org/secure/ViewProfile.jspa?name=jesse&quot; class=&quot;user-hover&quot; rel=&quot;jesse&quot;&gt;jesse&lt;/a&gt;, we may need to update the driver spec accordingly.&lt;/p&gt;</comment>
                            <comment id="1870595" author="shane.harvey" created="Fri, 20 Apr 2018 21:11:54 +0000"  >&lt;blockquote&gt;&lt;p&gt;Depending on the timing, I believe the running client can also get TransactionAborted (will be changed to NoSuchTransaction in &lt;a href=&quot;https://jira.mongodb.org/browse/SERVER-34583&quot; title=&quot;Clean up transaction error codes&quot; class=&quot;issue-link&quot; data-issue-key=&quot;SERVER-34583&quot;&gt;&lt;del&gt;SERVER-34583&lt;/del&gt;&lt;/a&gt;) because the primary kills transaction on stepdown. That&apos;s also not transient.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;It&apos;s also possible to get a writeConcernError on the commit, such as:&lt;/p&gt;
&lt;p/&gt;
&lt;div id=&quot;syntaxplugin&quot; class=&quot;syntaxplugin&quot; style=&quot;border: 1px dashed #bbb; border-radius: 5px !important; overflow: auto; max-height: 30em;&quot;&gt;
&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; width=&quot;100%&quot; style=&quot;font-size: 1em; line-height: 1.4em !important; font-weight: normal; font-style: normal; color: black;&quot;&gt;
		&lt;tbody &gt;
				&lt;tr id=&quot;syntaxplugin_code_and_gutter&quot;&gt;
						&lt;td  style=&quot; line-height: 1.4em !important; padding: 0em; vertical-align: top;&quot;&gt;
					&lt;pre style=&quot;font-size: 1em; margin: 0 10px;  margin-top: 10px;   width: auto; padding: 0;&quot;&gt;&lt;span style=&quot;color: black; font-family: &apos;Consolas&apos;, &apos;Bitstream Vera Sans Mono&apos;, &apos;Courier New&apos;, Courier, monospace !important;&quot;&gt;{&lt;/span&gt;&lt;/pre&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
				&lt;tr id=&quot;syntaxplugin_code_and_gutter&quot;&gt;
						&lt;td  style=&quot; line-height: 1.4em !important; padding: 0em; vertical-align: top;&quot;&gt;
					&lt;pre style=&quot;font-size: 1em; margin: 0 10px;   width: auto; padding: 0;&quot;&gt;&lt;span style=&quot;color: black; font-family: &apos;Consolas&apos;, &apos;Bitstream Vera Sans Mono&apos;, &apos;Courier New&apos;, Courier, monospace !important;&quot;&gt;  &apos;ok&apos;: 1.0,&lt;/span&gt;&lt;/pre&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
				&lt;tr id=&quot;syntaxplugin_code_and_gutter&quot;&gt;
						&lt;td  style=&quot; line-height: 1.4em !important; padding: 0em; vertical-align: top;&quot;&gt;
					&lt;pre style=&quot;font-size: 1em; margin: 0 10px;   width: auto; padding: 0;&quot;&gt;&lt;span style=&quot;color: black; font-family: &apos;Consolas&apos;, &apos;Bitstream Vera Sans Mono&apos;, &apos;Courier New&apos;, Courier, monospace !important;&quot;&gt;  &apos;writeConcernError&apos;: {&apos;code&apos;: 91, &apos;codeName&apos;: &apos;ShutdownInProgress&apos;, &apos;errmsg&apos;: &apos;Replication is being shut down&apos;}, &lt;/span&gt;&lt;/pre&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
				&lt;tr id=&quot;syntaxplugin_code_and_gutter&quot;&gt;
						&lt;td  style=&quot; line-height: 1.4em !important; padding: 0em; vertical-align: top;&quot;&gt;
					&lt;pre style=&quot;font-size: 1em; margin: 0 10px;   margin-bottom: 10px;  width: auto; padding: 0;&quot;&gt;&lt;span style=&quot;color: black; font-family: &apos;Consolas&apos;, &apos;Bitstream Vera Sans Mono&apos;, &apos;Courier New&apos;, Courier, monospace !important;&quot;&gt;}&lt;/span&gt;&lt;/pre&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
			&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p/&gt;

&lt;p&gt;In this case, driver&apos;s would need to re-run the commitTransaction command to find out if the transaction reached the new primary. &lt;/p&gt;</comment>
                            <comment id="1869602" author="siyuan.zhou@10gen.com" created="Thu, 19 Apr 2018 23:04:37 +0000"  >&lt;p&gt;To summarize the discussion in the meeting, besides NotMaster and Shutdown error classes, we only mark WriteConflict and SnapshotUnavailable as transient errors. When a failover happens, the driver may get one of the NotMaster errors, e.g. PrimarySteppedDown or InterruptedDueToReplStateChange, or the driver may get a network error since the connection gets closed. NotMaster errors will be marked as transient by the server, and network errors (except that from commitTransaction) will be marked as transient by the driver.&lt;/p&gt;

&lt;p&gt;Another possible scenario is that between the operations in a transaction, the driver notices the failover and changes its belief of the primary, then the following transaction operation will be sent to the new primary and get NoSuchTransaction, which is not transient.&lt;/p&gt;

&lt;p&gt;Depending on the timing, I believe the running client can also get TransactionAborted (will be changed to NoSuchTransaction in &lt;a href=&quot;https://jira.mongodb.org/browse/SERVER-34583&quot; title=&quot;Clean up transaction error codes&quot; class=&quot;issue-link&quot; data-issue-key=&quot;SERVER-34583&quot;&gt;&lt;del&gt;SERVER-34583&lt;/del&gt;&lt;/a&gt;) because the primary kills transaction on stepdown. That&apos;s also not transient.&lt;/p&gt;</comment>
                            <comment id="1869456" author="siyuan.zhou@10gen.com" created="Thu, 19 Apr 2018 21:11:06 +0000"  >&lt;p&gt;&lt;tt&gt;ErrorCodes::ConflictingOperationInProgress&lt;/tt&gt; is used in 2 places for transaction:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Restarting a running transaction&lt;/li&gt;
	&lt;li&gt;When a running transaction sees a unexpected higher txnNumber, due to migration.&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;&lt;tt&gt;ErrorCodes::TransactionAborted&lt;/tt&gt; used for where the transaction is aborted unexpectedly. We don&apos;t distinguish the reasons.&lt;/p&gt;

&lt;p&gt;&lt;tt&gt;ErrorCodes::TransactionTooOld&lt;/tt&gt; is returned in &lt;tt&gt;beginTxn()&lt;/tt&gt; when the txnNumber is less than the active one.&lt;/p&gt;</comment>
                            <comment id="1869123" author="tess.avitabile" created="Thu, 19 Apr 2018 17:50:18 +0000"  >&lt;p&gt;Yes, I agree that should be retryable.&lt;/p&gt;</comment>
                            <comment id="1869104" author="shane.harvey" created="Thu, 19 Apr 2018 17:42:17 +0000"  >&lt;p&gt;I think &lt;tt&gt;SnapshotUnavailable&lt;/tt&gt; should be retryable as well: &quot;Command failed with error 246: &apos;Unable to read from a snapshot due to pending collection catalog changes; please retry the operation.&quot;&lt;/p&gt;</comment>
                            <comment id="1868240" author="shane.harvey" created="Wed, 18 Apr 2018 21:50:52 +0000"  >&lt;p&gt;I think &lt;tt&gt;NoSuchTransaction&lt;/tt&gt; will be hit frequently and should be considered retryable as well. It&apos;s my understanding that &lt;tt&gt;NoSuchTransaction&lt;/tt&gt; could happen when running a command where:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;A previous command in the transaction failed and aborted the transaction (and the application ignored the error and ran another command).&lt;/li&gt;
	&lt;li&gt;The server decided to abort the transaction itself.&lt;/li&gt;
	&lt;li&gt;An election occurred and we&apos;re sending a command to a new primary that does not know about this transaction.&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;For 1 maybe we can tell users not to recover from transaction errors within the transaction but 2 and 3 seem like retryable errors to me.&lt;/p&gt;</comment>
                            <comment id="1868179" author="spencer" created="Wed, 18 Apr 2018 20:55:08 +0000"  >&lt;p&gt;Yeah, I think killSessions shouldn&apos;t cause TransactionAborted.  It should result in NoSuchTransaction, or maybe Interrupted?  The reaper ideally would result in a code that indicated the transaction took too long, either ExceededTimeLimit or a new code.  I think it&apos;s fine to just have both return NoSuchTransaction for 4.0, however.  In 4.2 we plan on being smarter about the error codes we return in general.  TransactionAborted is also likely to make a return in 4.2, but it&apos;s fine if it&apos;s unused in 4.0.&lt;/p&gt;</comment>
                            <comment id="1868161" author="tess.avitabile" created="Wed, 18 Apr 2018 20:38:30 +0000"  >&lt;p&gt;Currently, if there is an in-progress operation on the transaction, and the transaction is killed by killSessions or the reaper, the error returned will be &lt;tt&gt;TransactionAborted&lt;/tt&gt;. If the transaction is killed by killSessions or the reaper while inactive, then the next attempted operation will return error &lt;tt&gt;NoSuchTransaction&lt;/tt&gt;. Would it be preferable to make these both return &lt;tt&gt;NoSuchTransaction&lt;/tt&gt;, and do away will &lt;tt&gt;TransactionAborted&lt;/tt&gt; entirely?&lt;/p&gt;

&lt;p&gt;It sounds like the only &quot;transaction&quot; error that should be considered retryable is &lt;tt&gt;WriteConflict&lt;/tt&gt;.&lt;/p&gt;</comment>
                            <comment id="1868151" author="jesse" created="Wed, 18 Apr 2018 20:33:25 +0000"  >&lt;p&gt;Agreed that killSessions should cause TransactionNotFound, ideally. Would the driver that is using the transaction see that error, whether or not a transaction has an operation in progress when its session is killed?&lt;/p&gt;

&lt;p&gt;Also agreed that TransactionNotFound is a permanent error, not a transient one. &lt;/p&gt;</comment>
                            <comment id="1868148" author="tess.avitabile" created="Wed, 18 Apr 2018 20:29:50 +0000"  >&lt;p&gt;I don&apos;t think we need to include &lt;tt&gt;ConflictingOperationInProgress&lt;/tt&gt;, since there will not be chunk migrations concurrent with transactions in 4.0. In 4.2, hitting &lt;tt&gt;ConflictingOperationInProgress&lt;/tt&gt; in a transaction would indicate a user/driver error, since a newer txnNumber was used on one shard while there was still an open transaction with a lower txnNumber on a different shard.&lt;/p&gt;

&lt;p&gt;For &lt;tt&gt;NoSuchTransaction&lt;/tt&gt;, I am not certain whether we want to say it is safe to retry, since there are several reasons why a transaction could have been aborted. For example, the user aborted it, it was aborted by &lt;tt&gt;killSessions&lt;/tt&gt;, it was aborted for running too long. The drivers&apos; scope doc says that if a transaction was killed by the DBA, it should not be considered safe to retry.&lt;/p&gt;

&lt;p&gt;We only expect to get &lt;tt&gt;TransactionAborted&lt;/tt&gt; if the transaction is aborted in the middle of a user operation on the transaction, i.e. the operation has the session checked out, but either &lt;tt&gt;killSessions&lt;/tt&gt; or the reaper aborts the transaction. I think &lt;tt&gt;TransactionAborted&lt;/tt&gt; should be treated the same as &lt;tt&gt;NoSuchTransaction&lt;/tt&gt;.&lt;/p&gt;

&lt;p&gt;I agree that &lt;tt&gt;TransactionTooOld&lt;/tt&gt; should only happen in the case of user error.&lt;/p&gt;</comment>
                            <comment id="1868094" author="siyuan.zhou@10gen.com" created="Wed, 18 Apr 2018 19:58:05 +0000"  >&lt;p&gt;NoSuchTransaction generally means the expected transaction doesn&apos;t exist. It&apos;s used for&lt;br/&gt;
1) The first operation fails after beginTxn() before unstashTxn(), the next one will abort the transaction and return NoSuchTransaction. The case in &lt;a href=&quot;https://jira.mongodb.org/browse/SERVER-34219&quot; title=&quot;readConcern parse failure on start of multi-statement transaction does not abort&quot; class=&quot;issue-link&quot; data-issue-key=&quot;SERVER-34219&quot;&gt;&lt;del&gt;SERVER-34219&lt;/del&gt;&lt;/a&gt;.&lt;br/&gt;
2) Start a transaction with higher &lt;tt&gt;txnNumber&lt;/tt&gt; but without &lt;tt&gt;startTransaction&lt;/tt&gt; field.&lt;br/&gt;
3) Given transaction number is already aborted.&lt;/p&gt;

&lt;p&gt;TransactionTooOld can happen after a chunk migration.&lt;/p&gt;

&lt;p&gt;&lt;tt&gt;git grep &quot;ErrorCodes&quot; &amp;#8211; src/mongo/db/session.cpp&lt;/tt&gt;   gives all occurrences of error codes.&lt;/p&gt;</comment>
                            <comment id="1867959" author="spencer" created="Wed, 18 Apr 2018 18:27:31 +0000"  >&lt;p&gt;Hmm, I don&apos;t think NoSuchTransaction should be included on this list, since we don&apos;t know anything about the transaction at that point.  I&apos;m also not sure about TransactionTooOld.  That should probably only happen in the case of an application or driver bug, right?&lt;/p&gt;

&lt;p&gt;I also think it might be a problem if killSession results in a transaction returning TransactionAborted.  When would that happen?  I&apos;d expect that if a user tried to use a transaction that was killed by killSessions, that they&apos;d get NoSuchTransaction, not TransactionAborted.  My understanding at this point was that the only way you get TransactionAborted is if you re-use a transaction after explicitly calling abortTransaction.&lt;/p&gt;

&lt;p&gt;CC &lt;a href=&quot;https://jira.mongodb.org/secure/ViewProfile.jspa?name=jesse&quot; class=&quot;user-hover&quot; rel=&quot;jesse&quot;&gt;jesse&lt;/a&gt; &lt;a href=&quot;https://jira.mongodb.org/secure/ViewProfile.jspa?name=tess.avitabile&quot; class=&quot;user-hover&quot; rel=&quot;tess.avitabile&quot;&gt;tess.avitabile&lt;/a&gt; &lt;a href=&quot;https://jira.mongodb.org/secure/ViewProfile.jspa?name=shane.harvey&quot; class=&quot;user-hover&quot; rel=&quot;shane.harvey&quot;&gt;shane.harvey&lt;/a&gt;&lt;/p&gt;</comment>
                            <comment id="1867150" author="siyuan.zhou@10gen.com" created="Wed, 18 Apr 2018 00:06:27 +0000"  >&lt;p&gt;Here&apos;s the list of transient transaction errors. &lt;tt&gt;TransactionAborted&lt;/tt&gt; is interesting because the transaction may be aborted by &lt;tt&gt;killSession&lt;/tt&gt; which implies the user doesn&apos;t want to retry the transaction.&lt;/p&gt;

&lt;p/&gt;
&lt;div id=&quot;syntaxplugin&quot; class=&quot;syntaxplugin&quot; style=&quot;border: 1px dashed #bbb; border-radius: 5px !important; overflow: auto; max-height: 30em;&quot;&gt;
&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; width=&quot;100%&quot; style=&quot;font-size: 1em; line-height: 1.4em !important; font-weight: normal; font-style: normal; color: black;&quot;&gt;
		&lt;tbody &gt;
				&lt;tr id=&quot;syntaxplugin_code_and_gutter&quot;&gt;
						&lt;td  style=&quot; line-height: 1.4em !important; padding: 0em; vertical-align: top;&quot;&gt;
					&lt;pre style=&quot;font-size: 1em; margin: 0 10px;  margin-top: 10px;   width: auto; padding: 0;&quot;&gt;&lt;span style=&quot;color: black; font-family: &apos;Consolas&apos;, &apos;Bitstream Vera Sans Mono&apos;, &apos;Courier New&apos;, Courier, monospace !important;&quot;&gt;// Transaction errors&lt;/span&gt;&lt;/pre&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
				&lt;tr id=&quot;syntaxplugin_code_and_gutter&quot;&gt;
						&lt;td  style=&quot; line-height: 1.4em !important; padding: 0em; vertical-align: top;&quot;&gt;
					&lt;pre style=&quot;font-size: 1em; margin: 0 10px;   width: auto; padding: 0;&quot;&gt;&lt;span style=&quot;color: black; font-family: &apos;Consolas&apos;, &apos;Bitstream Vera Sans Mono&apos;, &apos;Courier New&apos;, Courier, monospace !important;&quot;&gt;ErrorCodes::ConflictingOperationInProgress  // e.g. chunk migration increases the txn number&lt;/span&gt;&lt;/pre&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
				&lt;tr id=&quot;syntaxplugin_code_and_gutter&quot;&gt;
						&lt;td  style=&quot; line-height: 1.4em !important; padding: 0em; vertical-align: top;&quot;&gt;
					&lt;pre style=&quot;font-size: 1em; margin: 0 10px;   width: auto; padding: 0;&quot;&gt;&lt;span style=&quot;color: black; font-family: &apos;Consolas&apos;, &apos;Bitstream Vera Sans Mono&apos;, &apos;Courier New&apos;, Courier, monospace !important;&quot;&gt;ErrorCodes::NoSuchTransaction  // transaction has been aborted and not in the expected state&lt;/span&gt;&lt;/pre&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
				&lt;tr id=&quot;syntaxplugin_code_and_gutter&quot;&gt;
						&lt;td  style=&quot; line-height: 1.4em !important; padding: 0em; vertical-align: top;&quot;&gt;
					&lt;pre style=&quot;font-size: 1em; margin: 0 10px;   width: auto; padding: 0;&quot;&gt;&lt;span style=&quot;color: black; font-family: &apos;Consolas&apos;, &apos;Bitstream Vera Sans Mono&apos;, &apos;Courier New&apos;, Courier, monospace !important;&quot;&gt;ErrorCodes::TransactionAborted  // transaction is aborted while the transaction is running&lt;/span&gt;&lt;/pre&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
				&lt;tr id=&quot;syntaxplugin_code_and_gutter&quot;&gt;
						&lt;td  style=&quot; line-height: 1.4em !important; padding: 0em; vertical-align: top;&quot;&gt;
					&lt;pre style=&quot;font-size: 1em; margin: 0 10px;   width: auto; padding: 0;&quot;&gt;&lt;span style=&quot;color: black; font-family: &apos;Consolas&apos;, &apos;Bitstream Vera Sans Mono&apos;, &apos;Courier New&apos;, Courier, monospace !important;&quot;&gt;ErrorCodes::TransactionTooOld   // txnNumber &amp;lt; activeTxnNumber&lt;/span&gt;&lt;/pre&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
				&lt;tr id=&quot;syntaxplugin_code_and_gutter&quot;&gt;
						&lt;td  style=&quot; line-height: 1.4em !important; padding: 0em; vertical-align: top;&quot;&gt;
					&lt;pre style=&quot;font-size: 1em; margin: 0 10px;   width: auto; padding: 0;&quot;&gt;&lt;span style=&quot;color: black; font-family: &apos;Consolas&apos;, &apos;Bitstream Vera Sans Mono&apos;, &apos;Courier New&apos;, Courier, monospace !important;&quot;&gt;ErrorCodes::WriteConflict  // classic concurrent write conflict.&lt;/span&gt;&lt;/pre&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
				&lt;tr id=&quot;syntaxplugin_code_and_gutter&quot;&gt;
						&lt;td  style=&quot; line-height: 1.4em !important; padding: 0em; vertical-align: top;&quot;&gt;
					&lt;pre style=&quot;font-size: 1em; margin: 0 10px;   width: auto; padding: 0;&quot;&gt;&amp;nbsp;&lt;/pre&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
				&lt;tr id=&quot;syntaxplugin_code_and_gutter&quot;&gt;
						&lt;td  style=&quot; line-height: 1.4em !important; padding: 0em; vertical-align: top;&quot;&gt;
					&lt;pre style=&quot;font-size: 1em; margin: 0 10px;   width: auto; padding: 0;&quot;&gt;&lt;span style=&quot;color: black; font-family: &apos;Consolas&apos;, &apos;Bitstream Vera Sans Mono&apos;, &apos;Courier New&apos;, Courier, monospace !important;&quot;&gt;// Topology change&lt;/span&gt;&lt;/pre&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
				&lt;tr id=&quot;syntaxplugin_code_and_gutter&quot;&gt;
						&lt;td  style=&quot; line-height: 1.4em !important; padding: 0em; vertical-align: top;&quot;&gt;
					&lt;pre style=&quot;font-size: 1em; margin: 0 10px;   width: auto; padding: 0;&quot;&gt;&lt;span style=&quot;color: black; font-family: &apos;Consolas&apos;, &apos;Bitstream Vera Sans Mono&apos;, &apos;Courier New&apos;, Courier, monospace !important;&quot;&gt;ErrorCodes::NotMaster&lt;/span&gt;&lt;/pre&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
				&lt;tr id=&quot;syntaxplugin_code_and_gutter&quot;&gt;
						&lt;td  style=&quot; line-height: 1.4em !important; padding: 0em; vertical-align: top;&quot;&gt;
					&lt;pre style=&quot;font-size: 1em; margin: 0 10px;   width: auto; padding: 0;&quot;&gt;&lt;span style=&quot;color: black; font-family: &apos;Consolas&apos;, &apos;Bitstream Vera Sans Mono&apos;, &apos;Courier New&apos;, Courier, monospace !important;&quot;&gt;ErrorCodes::NotMasterNoSlaveOk&lt;/span&gt;&lt;/pre&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
				&lt;tr id=&quot;syntaxplugin_code_and_gutter&quot;&gt;
						&lt;td  style=&quot; line-height: 1.4em !important; padding: 0em; vertical-align: top;&quot;&gt;
					&lt;pre style=&quot;font-size: 1em; margin: 0 10px;   width: auto; padding: 0;&quot;&gt;&lt;span style=&quot;color: black; font-family: &apos;Consolas&apos;, &apos;Bitstream Vera Sans Mono&apos;, &apos;Courier New&apos;, Courier, monospace !important;&quot;&gt;ErrorCodes::NotMasterOrSecondary&lt;/span&gt;&lt;/pre&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
				&lt;tr id=&quot;syntaxplugin_code_and_gutter&quot;&gt;
						&lt;td  style=&quot; line-height: 1.4em !important; padding: 0em; vertical-align: top;&quot;&gt;
					&lt;pre style=&quot;font-size: 1em; margin: 0 10px;   width: auto; padding: 0;&quot;&gt;&lt;span style=&quot;color: black; font-family: &apos;Consolas&apos;, &apos;Bitstream Vera Sans Mono&apos;, &apos;Courier New&apos;, Courier, monospace !important;&quot;&gt;ErrorCodes::PrimarySteppedDown&lt;/span&gt;&lt;/pre&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
				&lt;tr id=&quot;syntaxplugin_code_and_gutter&quot;&gt;
						&lt;td  style=&quot; line-height: 1.4em !important; padding: 0em; vertical-align: top;&quot;&gt;
					&lt;pre style=&quot;font-size: 1em; margin: 0 10px;   width: auto; padding: 0;&quot;&gt;&lt;span style=&quot;color: black; font-family: &apos;Consolas&apos;, &apos;Bitstream Vera Sans Mono&apos;, &apos;Courier New&apos;, Courier, monospace !important;&quot;&gt;ErrorCodes::InterruptedDueToReplStateChange&lt;/span&gt;&lt;/pre&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
				&lt;tr id=&quot;syntaxplugin_code_and_gutter&quot;&gt;
						&lt;td  style=&quot; line-height: 1.4em !important; padding: 0em; vertical-align: top;&quot;&gt;
					&lt;pre style=&quot;font-size: 1em; margin: 0 10px;   width: auto; padding: 0;&quot;&gt;&amp;nbsp;&lt;/pre&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
				&lt;tr id=&quot;syntaxplugin_code_and_gutter&quot;&gt;
						&lt;td  style=&quot; line-height: 1.4em !important; padding: 0em; vertical-align: top;&quot;&gt;
					&lt;pre style=&quot;font-size: 1em; margin: 0 10px;   width: auto; padding: 0;&quot;&gt;&lt;span style=&quot;color: black; font-family: &apos;Consolas&apos;, &apos;Bitstream Vera Sans Mono&apos;, &apos;Courier New&apos;, Courier, monospace !important;&quot;&gt;// Shutdown&lt;/span&gt;&lt;/pre&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
				&lt;tr id=&quot;syntaxplugin_code_and_gutter&quot;&gt;
						&lt;td  style=&quot; line-height: 1.4em !important; padding: 0em; vertical-align: top;&quot;&gt;
					&lt;pre style=&quot;font-size: 1em; margin: 0 10px;   margin-bottom: 10px;  width: auto; padding: 0;&quot;&gt;&lt;span style=&quot;color: black; font-family: &apos;Consolas&apos;, &apos;Bitstream Vera Sans Mono&apos;, &apos;Courier New&apos;, Courier, monospace !important;&quot;&gt;error_class(&quot;ShutdownError&quot;, [&quot;ShutdownInProgress&quot;, &quot;InterruptedAtShutdown&quot;])&lt;/span&gt;&lt;/pre&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
			&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p/&gt;</comment>
                            <comment id="1867092" author="spencer" created="Tue, 17 Apr 2018 23:07:47 +0000"  >&lt;p&gt;For now, just basing it on code is sufficient.  In the future we may get more context-aware, but we don&apos;t need to do anything for that now.&lt;/p&gt;

&lt;p&gt;We should only be attaching the TransientTxnError label for failed transactions, however, not for all commands.&lt;/p&gt;</comment>
                            <comment id="1862066" author="siyuan.zhou@10gen.com" created="Wed, 11 Apr 2018 23:10:50 +0000"  >&lt;p&gt;&lt;a href=&quot;https://jira.mongodb.org/secure/ViewProfile.jspa?name=spencer&quot; class=&quot;user-hover&quot; rel=&quot;spencer&quot;&gt;spencer&lt;/a&gt;, is it possible for a certain error to sometimes belong to a given error class, but sometimes not? I&apos;m trying to reason about whether we should categorize error codes based on the code themselves (in common code path) or based on the context (in transaction code path). &lt;/p&gt;</comment>
                    </comments>
                <issuelinks>
                            <issuelinktype id="10012">
                    <name>Related</name>
                                            <outwardlinks description="related to">
                                        <issuelink>
            <issuekey id="586488">SERVER-36580</issuekey>
        </issuelink>
            <issuelink>
            <issuekey id="531339">SERVER-34583</issuekey>
        </issuelink>
                            </outwardlinks>
                                                        </issuelinktype>
                    </issuelinks>
                <attachments>
                    </attachments>
                <subtasks>
                    </subtasks>
                <customfields>
                                                <customfield id="customfield_10050" key="com.atlassian.jira.toolkit:comments">
                        <customfieldname># Replies</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>25.0</customfieldvalue>
                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_18555" key="com.onresolve.jira.groovy.groovyrunner:scripted-field">
                        <customfieldname># of Sprints</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>3.0</customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                                                                                                            <customfield id="customfield_10011" key="com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons">
                        <customfieldname>Backwards Compatibility</customfieldname>
                        <customfieldvalues>
                                <customfieldvalue key="10038"><![CDATA[Fully Compatible]]></customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                                                                                                            <customfield id="customfield_10055" key="com.atlassian.jira.ext.charting:firstresponsedate">
                        <customfieldname>Date of 1st Reply</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>Wed, 11 Apr 2018 23:10:50 +0000</customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_10052" key="com.atlassian.jira.toolkit:dayslastcommented">
                        <customfieldname>Days since reply</customfieldname>
                        <customfieldvalues>
                                        5 years, 40 weeks, 1 day ago
    
                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_18254" key="com.onresolve.jira.groovy.groovyrunner:scripted-field">
                        <customfieldname>Dependencies</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue><![CDATA[]]></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_10857" key="com.pyxis.greenhopper.jira:gh-epic-link">
                        <customfieldname>Epic Link</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>PM-718</customfieldvalue>
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                <customfield id="customfield_10057" key="com.atlassian.jira.toolkit:lastusercommented">
                        <customfieldname>Last comment by Customer</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>true</customfieldvalue>
                        </customfieldvalues>
                    </customfield>
                                                                                            <customfield id="customfield_10056" key="com.atlassian.jira.toolkit:lastupdaterorcommenter">
                        <customfieldname>Last commenter</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>luke.bonanomi@mongodb.com</customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_11151" key="com.atlassian.jira.toolkit:LastCommentDate">
                        <customfieldname>Last public comment date</customfieldname>
                        <customfieldvalues>
                            5 years, 40 weeks, 1 day ago
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                    <customfield id="customfield_10051" key="com.atlassian.jira.toolkit:participants">
                        <customfieldname>Participants</customfieldname>
                        <customfieldvalues>
                                        <customfieldvalue>jesse@mongodb.com</customfieldvalue>
            <customfieldvalue>xgen-internal-githook</customfieldvalue>
            <customfieldvalue>shane.harvey@mongodb.com</customfieldvalue>
            <customfieldvalue>siyuan.zhou@mongodb.com</customfieldvalue>
            <customfieldvalue>spencer@mongodb.com</customfieldvalue>
            <customfieldvalue>tess.avitabile@mongodb.com</customfieldvalue>
    
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                        <customfield id="customfield_14254" key="com.pyxis.greenhopper.jira:gh-lexo-rank">
                        <customfieldname>Product Rank</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>1|htu5un:</customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                <customfield id="customfield_12550" key="com.pyxis.greenhopper.jira:gh-lexo-rank">
                        <customfieldname>Rank</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>2|htkuxj:</customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_10558" key="com.pyxis.greenhopper.jira:gh-global-rank">
                        <customfieldname>Rank (Obsolete)</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>9223372036854775807</customfieldvalue>
                        </customfieldvalues>
                    </customfield>
                                                                                            <customfield id="customfield_23361" key="com.onresolve.jira.groovy.groovyrunner:scripted-field">
                        <customfieldname>Requested By</customfieldname>
                        <customfieldvalues>
                                

                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                        <customfield id="customfield_10557" key="com.pyxis.greenhopper.jira:gh-sprint">
                        <customfieldname>Sprint</customfieldname>
                        <customfieldvalues>
                                <customfieldvalue id="2188">Repl 2018-04-23</customfieldvalue>
    <customfieldvalue id="2260">Repl 2018-05-07</customfieldvalue>
    <customfieldvalue id="2278">Repl 2018-05-21</customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                            <customfield id="customfield_10053" key="com.atlassian.jira.ext.charting:timeinstatus">
                        <customfieldname>Time In Status</customfieldname>
                        <customfieldvalues>
                            
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                        <customfield id="customfield_22870" key="com.onresolve.jira.groovy.groovyrunner:scripted-field">
                        <customfieldname>Triagers</customfieldname>
                        <customfieldvalues>
                                

                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                                                    <customfield id="customfield_14350" key="com.pyxis.greenhopper.jira:gh-lexo-rank">
                        <customfieldname>serverRank</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>1|htts2v:</customfieldvalue>

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