[GENIUS-280] Centralize node identifier parsing Created: 11/Oct/19  Updated: 22/Sep/20

Status: In Review
Project: genius
Component/s: mdsalutils
Affects Version/s: None
Fix Version/s: None

Type: Improvement Priority: Medium
Reporter: Robert Varga Assignee: Apurba Mukherjee
Resolution: Unresolved Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Issue Links:
Relates
relates to MDSAL-486 Add PhysAddress/MacAddress-to-byte[] ... Resolved

 Description   

There are currently 14 places which are splitting a String on ':' and do something with it – usually extracting DPN/DPID. All of this is done though String.split(), which is massively inefficient:

./itm/itm-impl/src/main/java/org/opendaylight/genius/itm/rpc/ItmManagerRpcService.java:                String[] nodeId = node.getId().getValue().split(":");
./itm/itm-impl/src/main/java/org/opendaylight/genius/itm/recovery/impl/ItmTepInstanceRecoveryHandler.java:        String[] params = entityId.split(":");
./interfacemanager/interfacemanager-impl/src/main/java/org/opendaylight/genius/interfacemanager/servicebindings/flowbased/listeners/FlowBasedServicesNodeStateListener.java:        final String[] node =  id.getId().getValue().split(":");
./interfacemanager/interfacemanager-impl/src/main/java/org/opendaylight/genius/interfacemanager/pmcounters/NodeConnectorStatsImpl.java:        String dpId = nodeId.getValue().split(":")[1];
./interfacemanager/interfacemanager-impl/src/main/java/org/opendaylight/genius/interfacemanager/pmcounters/NodeConnectorStatsImpl.java:            String dpId = nodeId.getValue().split(":")[1];
./fcapsapplication/fcapsapplication-impl/src/main/java/org/opendaylight/genius/fcapsapp/performancecounter/PacketInCounterHandler.java:        String[] nodeNo = id.split(":");
./fcapsapplication/fcapsapplication-impl/src/main/java/org/opendaylight/genius/fcapsapp/performancecounter/PacketInCounterHandler.java:            dpnId = dpnId.split(":")[1];
./fcapsapplication/fcapsapplication-impl/src/main/java/org/opendaylight/genius/fcapsapp/performancecounter/FlowNodeConnectorInventoryTranslatorImpl.java:        String[] switchId = node.split(":");
./networkutils/networkutils/src/main/java/org/opendaylight/genius/networkutils/impl/VniUtilsImpl.java:            String[] configureVniRangeSplit = configureVniRange.split(":");
./networkutils/networkutils/src/main/java/org/opendaylight/genius/networkutils/impl/RDUtilsImpl.java:        String[] configureRDSplit = NwConstants.RD_DEFAULT_LOW_VALUE.split(":");
./networkutils/networkutils/src/main/java/org/opendaylight/genius/networkutils/impl/RDUtilsImpl.java:            configureRDSplit = configuredRDStartValue.split(":");
./alivenessmonitor/alivenessmonitor-impl-protocols/src/main/java/org/opendaylight/genius/alivenessmonitor/protocols/internal/AbstractAlivenessProtocolHandler.java:        String[] addressPart = macAddress.split(":");
./ipv6util/api/src/main/java/org/opendaylight/genius/ipv6util/api/Ipv6Util.java:        String[] octets = target.split(":");
./mdsalutil/mdsalutil-impl/src/main/java/org/opendaylight/genius/mdsalutil/internal/MDSALManager.java:        String[] split = dpnString.split(":");

Provide an explicitly-documented utility which will perform a split-and-parse operation, in the most efficient manner possible and migrate all appropriate callsites to use it.



 Comments   
Comment by Robert Varga [ 11/Oct/19 ]

The splitter implementations should work on String.indexOf(':')  – note char! – and then issuing a String.subString(offset + 1), so that we do not instantiate unnecesary objects.

Comment by Apurba Mukherjee [ 22/Sep/20 ]

Pushed a patch for this. I have done a basic comparison testing. For a dummy string (openflow:12345678:37:compute:9876540:78:node:564789:21) String.split(":") takes 12 to 17 ms while the new API takes max 1 ms.

https://git.opendaylight.org/gerrit/c/genius/+/92429 

Generated at Wed Feb 07 20:00:21 UTC 2024 using Jira 8.20.10#820010-sha1:ace47f9899e9ee25d7157d59aa17ab06aee30d3d.