<!-- 
RSS generated by JIRA (9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66) at Thu Feb 08 09:03:11 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-4874] BsonDocument.clone should return a mutable deep copy, or we need a different mechanism of achieving that</title>
                <link>https://jira.mongodb.org/browse/JAVA-4874</link>
                <project id="10006" key="JAVA">Java Driver</project>
                    <description>&lt;p&gt;Currently we have at least two places (that I know of) where we rely on &lt;tt&gt;BsonDocument.clone&lt;/tt&gt; returning not only a deep copy, but mutable deep copy:&lt;/p&gt;

&lt;p&gt;1. &lt;tt&gt;AbstractConstructibleBson.newMerged&lt;/tt&gt;&lt;br/&gt;
2. The new method &lt;tt&gt;ClientEncryption.createEncryptedCollection&lt;/tt&gt; introduced in &lt;a href=&quot;https://github.com/mongodb/mongo-java-driver/pull/1079&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;https://github.com/mongodb/mongo-java-driver/pull/1079&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://jira.mongodb.org/secure/ViewProfile.jspa?name=ross%40mongodb.com&quot; class=&quot;user-hover&quot; rel=&quot;ross@mongodb.com&quot;&gt;ross@mongodb.com&lt;/a&gt; &lt;a href=&quot;https://github.com/mongodb/mongo-java-driver/pull/1079#discussion_r1097664225&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;pointed out&lt;/a&gt; that &lt;tt&gt;RawBsonDocument&lt;/tt&gt; breaks the &quot;mutable&quot; part and can come from users.&lt;/p&gt;</description>
                <environment></environment>
        <key id="2257285">JAVA-4874</key>
            <summary>BsonDocument.clone should return a mutable deep copy, or we need a different mechanism of achieving that</summary>
                <type id="1" iconUrl="https://jira.mongodb.org/secure/viewavatar?size=xsmall&amp;avatarId=14703&amp;avatarType=issuetype">Bug</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="13201">Fixed</resolution>
                                        <assignee username="valentin.kovalenko@mongodb.com">Valentin Kavalenka</assignee>
                                    <reporter username="valentin.kovalenko@mongodb.com">Valentin Kavalenka</reporter>
                        <labels>
                    </labels>
                <created>Wed, 8 Feb 2023 15:30:01 +0000</created>
                <updated>Sat, 28 Oct 2023 11:20:29 +0000</updated>
                            <resolved>Mon, 13 Feb 2023 19:45:15 +0000</resolved>
                                                    <fixVersion>4.10.0</fixVersion>
                                    <component>BSON</component>
                                        <votes>0</votes>
                                    <watches>2</watches>
                                                                                                                <comments>
                            <comment id="5194372" author="xgen-internal-githook" created="Mon, 13 Feb 2023 19:44:52 +0000"  >&lt;p&gt;Author: &lt;/p&gt;
{&apos;name&apos;: &apos;Valentin Kovalenko&apos;, &apos;email&apos;: &apos;valentin.kovalenko@mongodb.com&apos;, &apos;username&apos;: &apos;stIncMale&apos;}
&lt;p&gt;Message: Introduce `BsonUtil.mutableDeepCopy` (#1081)&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://jira.mongodb.org/browse/JAVA-4874&quot; title=&quot;BsonDocument.clone should return a mutable deep copy, or we need a different mechanism of achieving that&quot; class=&quot;issue-link&quot; data-issue-key=&quot;JAVA-4874&quot;&gt;&lt;del&gt;JAVA-4874&lt;/del&gt;&lt;/a&gt;&lt;br/&gt;
Branch: master&lt;br/&gt;
&lt;a href=&quot;https://github.com/mongodb/mongo-java-driver/commit/a7489266d5eced73ce129357ec1782accccf0a5a&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;https://github.com/mongodb/mongo-java-driver/commit/a7489266d5eced73ce129357ec1782accccf0a5a&lt;/a&gt;&lt;/p&gt;</comment>
                            <comment id="5183824" author="JIRAUSER1258163" created="Thu, 9 Feb 2023 17:58:43 +0000"  >&lt;blockquote&gt;
&lt;p&gt;The idea here was to make it as efficient as possible&lt;br/&gt;
...&lt;br/&gt;
The same goes for RawBsonDocument.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;If performance matters, I wonder why we clone &lt;tt&gt;bytes&lt;/tt&gt; in &lt;tt&gt;RawBsonDocument.clone&lt;/tt&gt;, given that &lt;tt&gt;RawBsonDocument&lt;/tt&gt; is documented to be immutable.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Could we instead say that, if you need an actual instance of BsonDocument that is a mutable copy of the source, it&apos;s your responsibility to do so using a BsonDocument constructor?&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;I am not sure users really need something like this, otherwise we would have had requests from them by now. Let&apos;s introduce a &lt;tt&gt;mutableDeepCopy(BsonDocument)&lt;/tt&gt; internal utility method. And if users ever request something like that, we can expose it via &lt;tt&gt;BsonDocument&lt;/tt&gt;.&lt;/p&gt;</comment>
                            <comment id="5183582" author="jeff.yemin" created="Thu, 9 Feb 2023 17:02:29 +0000"  >&lt;p&gt;The &lt;a href=&quot;https://github.com/mongodb/mongo-java-driver/commit/96d9170522ef74f24632190b12a39058fbe34145#diff-ce1a46fcfba4936f00bc746e810405ba56a1d111434b83a94ebe50aa8c8cd79f&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;original commit&lt;/a&gt; that added support for cloning provides some more context on the intent.  Specifically:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;This is in order to facilitate upcoming CommandListener implementations to clone BsonDocument instances representing commands and command responses.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;The idea here was to make it as efficient as possible for the driver to include the command and command reply in the events, but still provide a way for event listeners to efficiently copy those documents for later use, in the event they are needed outside the scope of the event listener method. Hence the Javadoc for &lt;tt&gt;CommandStartedEvent#getCommand&lt;/tt&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;The document is only usable within the method that delivered the event.  If it&apos;s needed for longer, it must be cloned via {@link Object#clone()}.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;It should probably also indicate that the document is read-only, and in practice it is, because it&apos;s actually an instance of &lt;tt&gt;com.mongodb.internal.connection.ByteBufBsonDocument&lt;/tt&gt;.&lt;/p&gt;

&lt;p&gt;I don&apos;t think we should change the clone method of that class to return a mutable BsonDocument, as it would change the performance characteristics of the method significantly.  The same goes for RawBsonDocument.&lt;/p&gt;

&lt;p&gt;Could we instead say that, if you need an actual instance of BsonDocument that is a mutable copy of the source, it&apos;s your responsibility to do so using a BsonDocument constructor?  Currently, it doesn&apos;t seem like there is a convenient one to use, but we could add one.&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="10038"><![CDATA[Fully Compatible]]></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_10257" key="com.atlassian.jira.plugin.system.customfieldtypes:radiobuttons">
                        <customfieldname>Documentation Changes</customfieldname>
                        <customfieldvalues>
                                <customfieldvalue key="11861"><![CDATA[Not Needed]]></customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_14266" key="com.atlassian.jira.plugin.system.customfieldtypes:textarea">
                        <customfieldname>Documentation Changes Summary</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>&lt;p&gt;1.  What would you like to communicate to the user about this feature?&lt;br/&gt;
2.  Would you like the user to see examples of the syntax and/or executable code and its output?&lt;br/&gt;
3.  Which versions of the driver/connector does this apply to?&lt;/p&gt;</customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            <customfield id="customfield_12550" key="com.pyxis.greenhopper.jira:gh-lexo-rank">
                        <customfieldname>Rank</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>2|i1d78g:</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>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            </customfields>
    </item>
</channel>
</rss>