[
https://issues.apache.org/jira/browse/IGNITE-28931?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Anton Vinogradov updated IGNITE-28931:
--------------------------------------
Fix Version/s: 2.19
> Remove the dead entry processor machinery from GridDhtAtomicUpdateRequest
> -------------------------------------------------------------------------
>
> Key: IGNITE-28931
> URL: https://issues.apache.org/jira/browse/IGNITE-28931
> Project: Ignite
> Issue Type: Task
> Reporter: Anton Vinogradov
> Priority: Major
> Fix For: 2.19
>
>
> GridDhtAtomicUpdateRequest still carries the forceTransformBackups flag and
> everything gated by it, but
> the flag has been false on every path since 2015. Both places that build the
> request pass the literal:
> GridDhtAtomicUpdateFuture:83-95 invokeArgs = null,
> forceTransformBackups = false
> GridDhtAtomicSingleUpdateFuture:99-111 invokeArgs = null,
> forceTransformBackups = false
> There is no third producer - `grep -rn "new GridDhtAtomicUpdateRequest"`
> returns exactly these two lines,
> and no test builds the request.
> GridDhtAtomicSingleUpdateRequest#forceTransformBackups returns the literal
> false as well, so every consumer of the flag is constant:
> GridDhtAtomicCache:3307 intercept = req.forceTransformBackups() && ...
> -> always false
> GridDhtAtomicCache:3357 /*check version*/ !req.forceTransformBackups()
> -> always true
> GridNearAtomicCache:322, :374
> -> same
> Confirmed on a live cluster: three nodes, PARTITIONED/ATOMIC with backups and
> a near cache and
> write-through, invokeAll and putAll driven from every node. All 36 recorded
> GridDhtAtomicUpdateRequest
> instances had forceTransformBackups == false, invokeArguments() == null, and
> a null entry processor at
> every index, near indexes included.
> What this costs today: four wire fields on every DHT backup request that is
> not the single-key variant -
> @Order(11) forceTransformBackups, @Order(12) entryProcessorsBytes, @Order(13)
> nearEntryProcessorsBytes,
> @Order(14) invokeArgsBytes. A boolean is one byte and a null collection is
> writeInt(-1), which is one byte
> in the varint encoding, so removing them saves exactly four bytes per request.
> The branch also holds a latent defect that shows it was never exercised: the
> eager
> `entryProcessorsBytes = new ArrayList<>()` in the constructor (:184) and in
> addNearWriteValue (:284) sit
> inside `if (forceTransformBackups)`, while marshal (:481, :484) and deploy
> (:513, :516) gate on `== null`.
> Had the flag ever been true, the processors would never have been marshalled
> and an empty list would have
> reached the backup. That gate arrived in 457a9ae4d3b (2016-01), ten months
> after the branch died in
> 3381630e7b1 (2015-03, ignite-629), which is why it never fired.
> Scope of the removal: the four wire fields and their logical counterparts,
> the two constructor parameters
> and the assert, the entryProc branches of addWriteValue and
> addNearWriteValue, marshal/unmarshal/deploy
> and the MarshallableMessage and DeployableMessage interfaces, the abstract
> accessors in
> GridDhtAtomicAbstractUpdateRequest together with the
> GridDhtAtomicSingleUpdateRequest overrides, and the
> constant consumers listed above folded to their constants.
> GridCacheMessage#marshallCollection and
> #unmarshalCollection are orphaned by this and can go too; the other helpers
> stay, they serve
> GridNearAtomicFullUpdateRequest.
> Note that the entryProc parameter of addWriteValue is not always null:
> GridDhtAtomicCache:2863-2864
> (updateWithBatch, more than one key, write-through, no DR) passes a real
> processor, and
> GridDhtAtomicUpdateRequest drops it silently at :205-211 because the computed
> value is what goes to the
> backup. The single-key request asserts this instead. So the parameter is
> removed because the request
> ignores it, not because callers never pass one.
> Removing wire fields changes the message layout, so nodes of mixed versions
> cannot read each other -
> worth calling out for rolling upgrades.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)