Boyi Dai created SOLR-18562:
-------------------------------

             Summary: Fixing a time routed alias's date math start can remove 
another alias from aliases.json
                 Key: SOLR-18562
                 URL: https://issues.apache.org/jira/browse/SOLR-18562
             Project: Solr
          Issue Type: Bug
          Components: SolrCloud
            Reporter: Boyi Dai


When a time routed alias is created with date math in router.start (e.g. 
NOW/DAY), the first document routed through it fixes the start to an instant 
(SOLR-13760). TimeRoutedAlias.validateRouteValue() takes a snapshot of the 
node's cached aliases, adds the new router.start to the alias's properties, and 
then writes it asynchronously with 
AliasesManager.applyModificationAndExportToZk().

The modification function ignores the current aliases it is passed and returns 
the snapshot instead:

{code:java}
Aliases aliases = zkStateReader.getAliases();
...
core.runAsync(
    () ->
        zkStateReader.aliasesManager.applyModificationAndExportToZk(
            (a) -> aliases.cloneWithCollectionAliasProperties(aliasName, 
props)));
{code}

applyModificationAndExportToZk() writes with the znode version of the current 
aliases and, on a BadVersionException, refreshes and calls the function again. 
Since the function always returns the old snapshot, the retry writes the old 
collection aliases over the new version. Any alias created (or alias property 
changed) after the snapshot was taken is silently removed from aliases.json. 
Every other caller of applyModificationAndExportToZk builds on its argument.

This was found through code analysis.

*Steps to reproduce:*
# Create a time routed alias A with router.start=NOW/DAY.
# Create another alias B before the node that will receive A's first document 
has seen it (or before the asynchronous write runs).
# Send the first document for A to that node.
# Result: router.start is fixed, but B is gone from aliases.json. Requests to B 
fail, and refreshing doesn't bring it back since the alias is lost in ZooKeeper.

*Expected:* only A's router.start changes; other aliases are untouched.

*Proposed fix:* apply the change to the aliases passed to the modification 
function, and only set router.start instead of copying all of A's properties 
from the snapshot. I have a patch with a test and will open a PR.



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to