[
https://issues.apache.org/jira/browse/IGNITE-2604?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Denis Magda updated IGNITE-2604:
--------------------------------
Description:
Presently {{CacheContinuousQueryBatchAck}} is sent to every node of the cluster
including client nodes but in fact it has to be sent to backup nodes only. The
reason is that the list of the backups is retrieved with
{{ctx.discovery().cacheNodes(topVer)}} method which returns all the nodes where
at least one cache is registered.
Refer to {{CacheContinuousQueryHandler.sendBackupAcknowledge}} method body
{noformat}
for (AffinityTopologyVersion topVer : t.get2())
nodes.addAll(ctx.discovery().cacheNodes(topVer));
{noformat}
The list has to be formed by remote nodes that contain only a particular cache
{noformat}
for (AffinityTopologyVersion topVer : t.get2())
nodes.addAll(ctx.discovery().remoteCacheNodes(cctx.name(), topVer));
{noformat}
and finally the ack has to be sent only if a node is not a client node
{noformat}
for (ClusterNode node : nodes) {
if (!node.isClient()) {
try {
cctx.io().send(node, msg,
GridIoPolicy.SYSTEM_POOL);
{noformat}
Next, in my understanding there is no need to register
CacheContinuousQueryBatchAck handler on the client side. Presently it's
registered in {{CacheContinuousQueryManager.start0}} method.
Finally, since currently the ack is sent to clients as well the following
warning floods logs in some unclear cases
{noformat}
20160208 12:56:30.301 WARN [sys-#7%null%]
org.apache.ignite.internal.processors.cache.GridCacheIoManager [] - Received
message without registered handler (will ignore)
[msg=CacheContinuousQueryBatchAck
[routineId=df328a9f-6a63-40f7-8a1b-923cfadb6337, updateCntrs={193=1455,
898=1434, 581=307, 584=159, 75=376, 331=233, 652=434, 13=420, 910=923, 143=249,
147=619, 150=1185, 598=338, 728=1168, 90=598, 346=1169, 283=214, 934=388,
615=310, 807=140, 1002=1132, 555=344, 365=215, 941=342, 946=515, 1015=635,
56=614, 378=1130, 827=720, 956=5675}],
nodeId=d78ac9e5-60dd-4fa9-a8eb-7c5c36e189af, locTopVer=AffinityTopologyVersion
[topVer=248, minorTopVer=1], msgTopVer=AffinityTopologyVersion [topVer=-1,
minorTopVer=0], cacheDesc=DynamicCacheDescriptor
[deploymentId=b8776e0c251-eb7db0e0-c35f-4a05-af44-5295c4cfdc01, locCfg=false,
staticCfg=true, started=true, cacheType=USER, template=false,
pluginMgr=GridCacheManagerAdapter [starting=false], updatesAllowed=true,
startTopVer=null, rcvdOnDiscovery=true, cacheName=GETS_ORDER_MAP]]
{noformat}
was:
Presently {{CacheContinuousQueryBatchAck}} is sent to every node of the cluster
including client nodes but in fact it has to be sent to backup nodes only. The
reason is that the list of the backups is retrieved with
{{ctx.discovery().cacheNodes(topVer)}} method which returns all the nodes where
at least one cache is registered.
Refer to {{CacheContinuousQueryHandler.sendBackupAcknowledge}} method body
{noformat}
for (AffinityTopologyVersion topVer : t.get2())
nodes.addAll(ctx.discovery().cacheNodes(topVer));
{noforma}
The list has to be formed by remote nodes that contain only a particular cache
{noformat}
for (AffinityTopologyVersion topVer : t.get2())
nodes.addAll(ctx.discovery().remoteCacheNodes(cctx.name(), topVer));
{noformat}
and finally the ack has to be sent only if a node is not a client node
{noformat}
for (ClusterNode node : nodes) {
if (!node.isClient()) {
try {
cctx.io().send(node, msg,
GridIoPolicy.SYSTEM_POOL);
{noformat}
Next, in my understanding there is no need to register
CacheContinuousQueryBatchAck handler on the client side. Presently it's
registered in {{CacheContinuousQueryManager.start0}} method.
Finally, since currently the ack is sent to clients as well the following
warning floods logs in some unclear cases
{noformat}
20160208 12:56:30.301 WARN [sys-#7%null%]
org.apache.ignite.internal.processors.cache.GridCacheIoManager [] - Received
message without registered handler (will ignore)
[msg=CacheContinuousQueryBatchAck
[routineId=df328a9f-6a63-40f7-8a1b-923cfadb6337, updateCntrs={193=1455,
898=1434, 581=307, 584=159, 75=376, 331=233, 652=434, 13=420, 910=923, 143=249,
147=619, 150=1185, 598=338, 728=1168, 90=598, 346=1169, 283=214, 934=388,
615=310, 807=140, 1002=1132, 555=344, 365=215, 941=342, 946=515, 1015=635,
56=614, 378=1130, 827=720, 956=5675}],
nodeId=d78ac9e5-60dd-4fa9-a8eb-7c5c36e189af, locTopVer=AffinityTopologyVersion
[topVer=248, minorTopVer=1], msgTopVer=AffinityTopologyVersion [topVer=-1,
minorTopVer=0], cacheDesc=DynamicCacheDescriptor
[deploymentId=b8776e0c251-eb7db0e0-c35f-4a05-af44-5295c4cfdc01, locCfg=false,
staticCfg=true, started=true, cacheType=USER, template=false,
pluginMgr=GridCacheManagerAdapter [starting=false], updatesAllowed=true,
startTopVer=null, rcvdOnDiscovery=true, cacheName=GETS_ORDER_MAP]]
{noformat}
> CacheContinuousQueryBatchAck is sent to nodes that doesn't hold cache data
> --------------------------------------------------------------------------
>
> Key: IGNITE-2604
> URL: https://issues.apache.org/jira/browse/IGNITE-2604
> Project: Ignite
> Issue Type: Bug
> Components: cache
> Affects Versions: 1.5.0.final
> Reporter: Denis Magda
> Assignee: Nikolay Tikhonov
> Fix For: 1.6
>
>
> Presently {{CacheContinuousQueryBatchAck}} is sent to every node of the
> cluster including client nodes but in fact it has to be sent to backup nodes
> only. The reason is that the list of the backups is retrieved with
> {{ctx.discovery().cacheNodes(topVer)}} method which returns all the nodes
> where at least one cache is registered.
> Refer to {{CacheContinuousQueryHandler.sendBackupAcknowledge}} method body
> {noformat}
> for (AffinityTopologyVersion topVer : t.get2())
> nodes.addAll(ctx.discovery().cacheNodes(topVer));
> {noformat}
> The list has to be formed by remote nodes that contain only a particular cache
> {noformat}
> for (AffinityTopologyVersion topVer : t.get2())
> nodes.addAll(ctx.discovery().remoteCacheNodes(cctx.name(), topVer));
> {noformat}
> and finally the ack has to be sent only if a node is not a client node
> {noformat}
> for (ClusterNode node : nodes) {
> if (!node.isClient()) {
> try {
> cctx.io().send(node, msg,
> GridIoPolicy.SYSTEM_POOL);
> {noformat}
> Next, in my understanding there is no need to register
> CacheContinuousQueryBatchAck handler on the client side. Presently it's
> registered in {{CacheContinuousQueryManager.start0}} method.
> Finally, since currently the ack is sent to clients as well the following
> warning floods logs in some unclear cases
> {noformat}
> 20160208 12:56:30.301 WARN [sys-#7%null%]
> org.apache.ignite.internal.processors.cache.GridCacheIoManager [] - Received
> message without registered handler (will ignore)
> [msg=CacheContinuousQueryBatchAck
> [routineId=df328a9f-6a63-40f7-8a1b-923cfadb6337, updateCntrs={193=1455,
> 898=1434, 581=307, 584=159, 75=376, 331=233, 652=434, 13=420, 910=923,
> 143=249, 147=619, 150=1185, 598=338, 728=1168, 90=598, 346=1169, 283=214,
> 934=388, 615=310, 807=140, 1002=1132, 555=344, 365=215, 941=342, 946=515,
> 1015=635, 56=614, 378=1130, 827=720, 956=5675}],
> nodeId=d78ac9e5-60dd-4fa9-a8eb-7c5c36e189af,
> locTopVer=AffinityTopologyVersion [topVer=248, minorTopVer=1],
> msgTopVer=AffinityTopologyVersion [topVer=-1, minorTopVer=0],
> cacheDesc=DynamicCacheDescriptor
> [deploymentId=b8776e0c251-eb7db0e0-c35f-4a05-af44-5295c4cfdc01, locCfg=false,
> staticCfg=true, started=true, cacheType=USER, template=false,
> pluginMgr=GridCacheManagerAdapter [starting=false], updatesAllowed=true,
> startTopVer=null, rcvdOnDiscovery=true, cacheName=GETS_ORDER_MAP]]
> {noformat}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)