[ 
https://issues.apache.org/jira/browse/SOLR-2326?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13065390#comment-13065390
 ] 

Jeremy Custenborder commented on SOLR-2326:
-------------------------------------------

I'm running into the same issue. My slave server has no update handlers. 
Calling /solr/core/replication?command=indexversion on the master always 
returned 0.  I was looking at the code for the handler and found an interesting 
comment on line 125. It's currently configured to replicate after commit.

{quote}
This happens when replication is not configured to happen after startup and no 
commit/optimize
has happened yet.
{quote}

This got me thinking so I issued the following command against the master
{quote}
curl 'http://127.0.0.1:8080/solr/core/update' -H "Content-Type: text/xml" 
--data-binary '<optimize/>'
{quote}

The next call to /solr/core/replication?command=indexversion returned a valid 
version and replication to the slave started.

This makes me believe the problem is in this code block. 
{code}
   if (command.equals(CMD_INDEX_VERSION)) {
      IndexCommit commitPoint = indexCommitPoint;  // make a copy so it won't 
change
      if (commitPoint != null && replicationEnabled.get()) {
        //
        // There is a race condition here.  The commit point may be changed / 
deleted by the time
        // we get around to reserving it.  This is a very small window though, 
and should not result
        // in a catastrophic failure, but will result in the client getting an 
empty file list for
        // the CMD_GET_FILE_LIST command.
        //
        core.getDeletionPolicy().setReserveDuration(commitPoint.getVersion(), 
reserveCommitDuration);
        rsp.add(CMD_INDEX_VERSION, commitPoint.getVersion());
        rsp.add(GENERATION, commitPoint.getGeneration());
      } else {
        // This happens when replication is not configured to happen after 
startup and no commit/optimize
        // has happened yet.
        rsp.add(CMD_INDEX_VERSION, 0L);
        rsp.add(GENERATION, 0L);
      }
    }
{code}


It looks like there is a race condition resulting in indexCommitPoint being 
null. Look at the method postCommit() in getEventListener() method.

{code}
public void postCommit() {
        IndexCommit currentCommitPoint = 
core.getDeletionPolicy().getLatestCommit();

        if (getCommit) {
          // IndexCommit oldCommitPoint = indexCommitPoint;
          indexCommitPoint = currentCommitPoint;

          // We don't need to save commit points for replication, the 
SolrDeletionPolicy
          // always saves the last commit point (and the last optimized commit 
point, if needed)
          /***
          if (indexCommitPoint != null) {
            
core.getDeletionPolicy().saveCommitPoint(indexCommitPoint.getVersion());
          }
          if(oldCommitPoint != null){
            
core.getDeletionPolicy().releaseCommitPoint(oldCommitPoint.getVersion());
          }
          ***/
        }
        if (snapshoot) {
          try {
            SnapShooter snapShooter = new SnapShooter(core, null);
            snapShooter.createSnapAsync(currentCommitPoint, 
ReplicationHandler.this);
          } catch (Exception e) {
            LOG.error("Exception while snapshooting", e);
          }
        }
      }
{code}

Since indexCommitPoint is null until being loaded this causes a value of 0 to 
always be returned. 

If you call optimize like I did does your index start replicating? In my 
situation each core that returned 0/0 started replicating after I called 
optimize. 


> Replication command indexversion fails to return index version
> --------------------------------------------------------------
>
>                 Key: SOLR-2326
>                 URL: https://issues.apache.org/jira/browse/SOLR-2326
>             Project: Solr
>          Issue Type: Bug
>          Components: replication (java)
>         Environment: Branch 3x latest
>            Reporter: Eric Pugh
>            Assignee: Mark Miller
>             Fix For: 3.4, 4.0
>
>
> To test this, I took the /example/multicore/core0 solrconfig and added a 
> simple replication handler:
>   <requestHandler name="/replication" class="solr.ReplicationHandler" >
>       <lst name="master">
>         <str name="replicateAfter">commit</str>
>         <str name="replicateAfter">startup</str>
>         <str name="confFiles">schema.xml</str>
>       </lst>
>   </requestHandler>
> When I query the handler for details I get back the indexVersion that I 
> expect: 
> http://localhost:8983/solr/core0/replication?command=details&wt=json&indent=true
> But when I ask for just the indexVersion I get back a 0, which prevent the 
> slaves from pulling updates: 
> http://localhost:8983/solr/core0/replication?command=indexversion&wt=json&indent=true

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@lucene.apache.org
For additional commands, e-mail: dev-h...@lucene.apache.org

Reply via email to