[CARBONDATA-4288][CARBONDATA-4289] Fix various issues with Index Server caching mecha...
authorVikram Ahuja <vikramahuja8803@gmail.com>
Fri, 17 Sep 2021 07:24:01 +0000 (12:54 +0530)
committerkunal642 <kunalkapoor642@gmail.com>
Mon, 20 Sep 2021 10:46:37 +0000 (16:16 +0530)
commitce860d0431f41e0594cee848149cdc344f728dd3
tree4c6284666181386c924920bac76bdafe052ea4a7
parent22342f847d7db515e5f8c17525522085f49bd2a5
[CARBONDATA-4288][CARBONDATA-4289] Fix various issues with Index Server caching mechanism.

Why is this PR needed?
There are 2 issues in the Index Server flow:
In case when there is a main table with a SI table with prepriming disabled and index serve
enabled, new load to main table and SI table put the cache for the main table in the index
server. Cache is also getting again when a select query is fired. This issue happens because
during load to SI table, getSplits is called on the main table segment which is in Insert In
Progress state. Index server considers this segment as a legacy segment because it's index
size = 0 and does not put it's entry in the tableToExecutor mapping. In the getsplits method
isRefreshneeded is false the first time getSplits is called. During the select query, in
getSplits method isRefreshNeeded is true and the previous loaded entry is removed from the
driver but since there is no entry for that table in tableToExecutor mapping, the previous
cache value becomes dead cache and always stays in the index server. The newly loaded cache
is loaded to a new executor and 2 copies of cache for the same segment is being mantained.
Concurrent select queries to the index server shows wrong cache values in the Index server.

What changes were proposed in this PR?
The following changes are proposed to the index server code:
Removing cache object from the index server in case the segment is INSERT IN PROGRESS and
in the case of legacy segment adding the value in tabeToExecutor mappping so that the cache
is also removed from the executor side.
Concurrent queries were able adding duplicate cache values to other executors. Changed logic
of assign executors method so that concurrent queries are not able to add cache for same segment
in other executors

This closes #4219
integration/spark/src/main/scala/org/apache/carbondata/indexserver/DistributedPruneRDD.scala
integration/spark/src/main/scala/org/apache/carbondata/indexserver/DistributedRDDUtils.scala
integration/spark/src/test/scala/org/apache/indexserver/DistributedRDDUtilsTest.scala