Uploaded image for project: 'Solr'
  1. Solr
  2. SOLR-12413

Solr ignores aliases.json from ZooKeeper at startup

    XMLWordPrintableJSON

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Minor
    • Resolution: Fixed
    • Affects Version/s: 7.2.1
    • Fix Version/s: 7.5
    • Component/s: SolrCloud
    • Labels:
      None
    • Environment:

      A SolrCloud cluster with ZooKeeper (one node is enough to reproduce).

      Solr 7.2.1.

      ZooKeeper 3.4.6.

      Description

      Since upgrading to 7.2.1, we ran into an issue where Solr ignores aliases.json file stored in ZooKeeper.

       

      Steps to reproduce the problem:

      1. SolrCloud cluster is down
      2. Direct update of aliases.json file in ZooKeeper with Solr ZkCLI without using Collections API :
        • java ... org.apache.solr.cloud.ZkCLI -zkhost ... -cmd clear /aliases.json
        • java ... org.apache.solr.cloud.ZkCLI -zkhost ... -cmd put /aliases.json "new content"
      3. SolrCloud cluster is started => aliases.json not taken into account

       

      Analysis: 

      Digging a bit in the code, what is actually causing the issue is that, when starting, Solr now checks for the metadata of the aliases.json file and if the version metadata from ZooKeeper is lower or equal to local version, it keeps the local version.

      When it starts, Solr has a local version of 0 for the aliases but ZooKeeper also has a version of 0 of the file because we just recreated it. So Solr ignores ZooKeeper configuration and never has a chance to load aliases.

       

      Relevant parts of Solr code are:

      /**
      * Update the internal aliases reference with a new one, provided that its ZK version has increased.
      *
      * @param newAliases the potentially newer version of Aliases
      */
      private boolean setIfNewer(Aliases newAliases) {
        synchronized (this) {
          int cmp = Integer.compare(aliases.getZNodeVersion(), newAliases.getZNodeVersion());
          if (cmp < 0) {
            LOG.debug("Aliases: cmp={}, new definition is: {}", cmp, newAliases);
            aliases = newAliases;
            this.notifyAll();
            return true;
          } else {
            LOG.debug("Aliases: cmp={}, not overwriting ZK version.", cmp);
            assert cmp != 0 || Arrays.equals(aliases.toJSON(), newAliases.toJSON()) : aliases + " != " + newAliases;
          return false;
          }
        }
      }
      /**
      * An empty, minimal Aliases primarily used to support the non-cloud solr use cases. Not normally useful
      * in cloud situations where the version of the node needs to be tracked even if all aliases are removed.
      * A version of 0 is provided rather than -1 to minimize the possibility that if this is used in a cloud
      * instance data is written without version checking.
      */
      public static final Aliases EMPTY = new Aliases(Collections.emptyMap(), Collections.emptyMap(), 0);

       

      Note that a workaround is to force ZooKeeper to always have a version greater than 0 for aliases.json file (for instance by not clearing the file and just overwriting it again and again).

        Attachments

        1. SOLR-12413.patch
          4 kB
          David Wayne Smiley
        2. SOLR-12413-nocommit.patch
          9 kB
          David Wayne Smiley

          Activity

            People

            • Assignee:
              dsmiley David Wayne Smiley
              Reporter:
              gjourdan Gaël Jourdan
            • Votes:
              0 Vote for this issue
              Watchers:
              5 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved:

                Time Tracking

                Estimated:
                Original Estimate - Not Specified
                Not Specified
                Remaining:
                Remaining Estimate - 0h
                0h
                Logged:
                Time Spent - 0.5h
                0.5h