<!-- 
RSS generated by JIRA (8.20.10#820010-sha1:ace47f9899e9ee25d7157d59aa17ab06aee30d3d) at Wed Feb 07 20:08:36 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>OpenDaylight JIRA</title>
    <link>https://jira.opendaylight.org</link>
    <description>This file is an XML representation of an issue</description>
    <language>en-us</language>    <build-info>
        <version>8.20.10</version>
        <build-number>820010</build-number>
        <build-date>22-06-2022</build-date>
    </build-info>


<item>
            <title>[MDSAL-86] Split up BindingDOMRpcImplementationAdapter</title>
                <link>https://jira.opendaylight.org/browse/MDSAL-86</link>
                <project id="10137" key="MDSAL">mdsal</project>
                    <description>&lt;p&gt;We create an instance of this class for each RPC registration, which means we need to dynamically create a SchemaPath on each invocation.&lt;/p&gt;

&lt;p&gt;That schema path is used for lookup in the codec tree cache, which is lazily instantiated. Since we are using a different SchemaPath object on each lookup, equals() part of the cache lookup strays away from the identity comparison, leading to lost performance.&lt;/p&gt;

&lt;p&gt;Break up the Adapter such that we maintain a per-method registration, which retains the registration SchemaPath. This will result in the lookup not allocating any objects and keeping on the identity path.&lt;/p&gt;</description>
                <environment>&lt;p&gt;Operating System: All&lt;br/&gt;
Platform: All&lt;/p&gt;</environment>
        <key id="26908">MDSAL-86</key>
            <summary>Split up BindingDOMRpcImplementationAdapter</summary>
                <type id="10100" iconUrl="https://jira.opendaylight.org/secure/viewavatar?size=xsmall&amp;avatarId=10310&amp;avatarType=issuetype">Improvement</type>
                                            <priority id="3" iconUrl="https://jira.opendaylight.org/images/icons/priorities/major.svg">Medium</priority>
                        <status id="5" iconUrl="https://jira.opendaylight.org/images/icons/statuses/resolved.png" description="A resolution has been taken, and it is awaiting verification by reporter. From here issues are either reopened, or are closed.">Resolved</status>
                    <statusCategory id="3" key="done" colorName="green"/>
                                    <resolution id="10000">Done</resolution>
                                        <assignee username="rovarga">Robert Varga</assignee>
                                    <reporter username="rovarga">Robert Varga</reporter>
                        <labels>
                            <label>pt</label>
                    </labels>
                <created>Thu, 28 May 2015 12:08:27 +0000</created>
                <updated>Mon, 28 Nov 2022 18:24:39 +0000</updated>
                            <resolved>Fri, 25 Nov 2022 01:10:25 +0000</resolved>
                                                    <fixVersion>11.0.0</fixVersion>
                                    <component>Binding runtime</component>
                        <due></due>
                            <votes>0</votes>
                                    <watches>4</watches>
                                                                                                                <comments>
                            <comment id="67355" author="rovarga" created="Tue, 5 Nov 2019 10:40:04 +0000"  >&lt;p&gt;We will need to implement BindingCodecTree.getSubtreeCodec(SchemaNodeIdentifier), so that we can efficiently lookup RPC input/output as well as notifications. Once we have that, we can properly bind methods to their SchemaContext counterparts without having to go through the codec.&lt;/p&gt;

&lt;p&gt;This should result in a BindingDOMRpcProviderServiceAdapter having a&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;
Cache&amp;lt;&lt;span class=&quot;code-object&quot;&gt;Class&lt;/span&gt;&amp;lt;? &lt;span class=&quot;code-keyword&quot;&gt;extends&lt;/span&gt; RpcService&amp;gt;, RpcServiceClassContext&amp;gt; rpcServiceClasses;
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;populated lazily as services are registered. Furthermore RpcServiceClassContext should have the basic shape of:&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-keyword&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;code-keyword&quot;&gt;class &lt;/span&gt;RpcServiceClassContext &lt;span class=&quot;code-keyword&quot;&gt;implements&lt;/span&gt; Immutable {
    &lt;span class=&quot;code-keyword&quot;&gt;final&lt;/span&gt; ImmutableMap&amp;lt;SchemaNodeIdentifier, RpcServiceMethodContext&amp;gt; methods;
}&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Note the methods map should not be used during invocation, only during decomposition of the RPC implementation &#8211; the keys are input to DOMRpcIdentifier and values form the invocation context, which in turn looks like this:&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-keyword&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;code-keyword&quot;&gt;class &lt;/span&gt;RpcServiceMethodContext &lt;span class=&quot;code-keyword&quot;&gt;implements&lt;/span&gt; Immutable {
    &lt;span class=&quot;code-keyword&quot;&gt;final&lt;/span&gt; QName inputQName; &lt;span class=&quot;code-comment&quot;&gt;// Note: shared between all MethodContexts in a ClassContext
&lt;/span&gt;    &lt;span class=&quot;code-keyword&quot;&gt;final&lt;/span&gt; BindingNormalizedNodeCodec inputCodec;
    &lt;span class=&quot;code-keyword&quot;&gt;final&lt;/span&gt; BindingNormalizedNodeCodec outputCodec;
    &lt;span class=&quot;code-keyword&quot;&gt;final&lt;/span&gt; RpcMethodInvoker methodInvoker;
}
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;now when an implementation is registered, we look up the RpcServiceClassContext and for each RpcServiceMethodContext we create a DOMRpcImplementation, which has a pointer to the MethodContext and the RpcService object being registered.&lt;/p&gt;

&lt;p&gt;During invocation we use the inputCodec/inputQName combo to create the DataObject representation of input and pass that to the methodInvoker. We then return a variation on LazyDOMRpcResultFuture, which actually holds a reference to outputCodec directly, not going through the codec/codecRegistry.&lt;/p&gt;

&lt;p&gt;Note that since the DOMRpcImplementations created are not multiplexing but rather each points to a single YANG RPC, we do not consult DOMRpcImplementation.invokeRpc()&apos;s first argument.&lt;/p&gt;</comment>
                            <comment id="67357" author="rovarga" created="Tue, 5 Nov 2019 10:47:50 +0000"  >&lt;p&gt;The problem with this decomposition, though, is that the resulting object would not be registered atomically &#8211; for that we will need an atomic&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;
DOMRpcProviderService.registerRpcImplementations(Map&amp;lt;DOMRpcIdentifier, DOMRpcImplementation&amp;gt;);&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;method and have that implemented.&lt;/p&gt;</comment>
                            <comment id="71532" author="rovarga" created="Tue, 4 Oct 2022 22:43:07 +0000"  >&lt;p&gt;I think we can address this cleanly by removing the Adapter, as we won&apos;t be needing it.&lt;/p&gt;</comment>
                            <comment id="71700" author="rovarga" created="Thu, 24 Nov 2022 20:45:16 +0000"  >&lt;p&gt;Actually, we can implement an efficient split by reusing the DOM and Binding infra existing for single-RPC invocations.&lt;/p&gt;</comment>
                    </comments>
                <issuelinks>
                            <issuelinktype id="10003">
                    <name>Relates</name>
                                                                <inwardlinks description="relates to">
                                        <issuelink>
            <issuekey id="36402">MDSAL-796</issuekey>
        </issuelink>
                            </inwardlinks>
                                    </issuelinktype>
                    </issuelinks>
                <attachments>
                    </attachments>
                <subtasks>
                    </subtasks>
                <customfields>
                                                                            <customfield id="customfield_11400" key="com.atlassian.jira.plugins.jira-development-integration-plugin:devsummary">
                        <customfieldname>Development</customfieldname>
                        <customfieldvalues>
                            
                        </customfieldvalues>
                    </customfield>
                                                                                                                        <customfield id="customfield_10208" key="com.atlassian.jira.plugin.system.customfieldtypes:textfield">
                        <customfieldname>External issue ID</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>3416</customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_10201" key="com.atlassian.jira.plugin.system.customfieldtypes:url">
                        <customfieldname>External issue URL</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue><![CDATA[https://bugs.opendaylight.org/show_bug.cgi?id=3416]]></customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                                            <customfield id="customfield_10206" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                        <customfieldname>Issue Type</customfieldname>
                        <customfieldvalues>
                                <customfieldvalue key="10305"><![CDATA[Improvement]]></customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                        <customfield id="customfield_10204" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                        <customfieldname>ODL SR Target Milestone</customfieldname>
                        <customfieldvalues>
                                <customfieldvalue key="10321"><![CDATA[Carbon]]></customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                                                                                                    <customfield id="customfield_10000" key="com.pyxis.greenhopper.jira:gh-lexo-rank">
                        <customfieldname>Rank</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>0|i02w87:</customfieldvalue>

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