James thanks .

If this is true the place to fix this is in
ReplicationHandler#getFileList(). patch is attached.


On Wed, Dec 24, 2008 at 4:04 PM, James Grant <james.gr...@semantico.com> wrote:
> I had the same problem. It turned out that the list of files from the master
> included duplicates. When the slave completes the download and tries to move
> the files into the index it comes across a file that does not exist because
> it has already been moved so it backs out the whole operation.
>
> My solution for now was to patch the copyindexFiles method of
> org.apache.solr.handler.SnapPuller so that it normalises the list before
> moving the files. This isn't the best solution since it will still download
> the file twice but it was the easiest and smallest change to make. The patch
> is below
>
> Regards
>
> James
>
> --- src/java/org/apache/solr/handler/SnapPuller.java    (revision 727347)
> +++ src/java/org/apache/solr/handler/SnapPuller.java    (working copy)
> @@ -470,7 +470,7 @@
>   */
>  private boolean copyIndexFiles(File snapDir, File indexDir) {
>    String segmentsFile = null;
> -    List<String> copiedfiles = new ArrayList<String>();
> +    Set<String> filesToCopy = new HashSet<String>();
>    for (Map<String, Object> f : filesDownloaded) {
>      String fname = (String) f.get(NAME);
>      // the segments file must be copied last
> @@ -482,6 +482,10 @@
>        segmentsFile = fname;
>        continue;
>      }
> +      filesToCopy.add(fname);
> +    }
> +    List<String> copiedfiles = new ArrayList<String>();
> +    for (String fname: filesToCopy) {
>      if (!copyAFile(snapDir, indexDir, fname, copiedfiles)) return false;
>      copiedfiles.add(fname);
>    }
>
>
> Jaco wrote:
>>
>> Hello,
>>
>> While testing out the new replication features, I'm running into some
>> strange problem. On the slave, I keep getting an error like this after all
>> files have been copied from the master to the temporary index.xxxxxxxxx
>> directory:
>>
>> SEVERE: Unable to move index file from:
>> D:\Data\solr\Slave\data\index.20081224110855\_21e.tvx to:
>> D:\Data\Solr\Slave\data\index\_21e.tvx
>>
>> The replication then stops, index remains in original state, so the
>> updates
>> are not available at the slave.
>>
>> This is my replication config at the master:
>>
>>    <requestHandler name="/replication" class="solr.ReplicationHandler" >
>>        <lst name="master">
>>            <!--Replicate on 'optimize' it can also be  'commit' -->
>>            <str name="replicateAfter">commit</str>
>>            <str name="confFiles">schema.xml</str>
>>        </lst>
>>    </requestHandler>
>>
>> This is the replication config at the slave:
>>
>>    <requestHandler name="/replication" class="solr.ReplicationHandler" >
>>        <lst name="slave">
>>            <str name="masterUrl">
>> http://hostnamemaster:8080/solr/Master/replication</str>
>>            <str name="pollInterval">00:10:00</str>
>>            <str name="zip">true</str>
>>        </lst>
>>    </requestHandler>
>>
>> I'm running a Solr nightly build of 21.12.2008 in Tomcat 6 on Windows
>> 2003.
>> Initially I thought there was some problem with disk space, but this is
>> not
>> the case. Replication did run fine for intial version of index, but after
>> that at some point it didn't work anymore. Any ideas what could be wrong
>> here?
>>
>> Thanks very much in advance, bye,
>>
>> Jaco.
>>
>>
>
>



-- 
--Noble Paul
Index: src/java/org/apache/solr/handler/ReplicationHandler.java
===================================================================
--- src/java/org/apache/solr/handler/ReplicationHandler.java	(revision 729282)
+++ src/java/org/apache/solr/handler/ReplicationHandler.java	(working copy)
@@ -268,7 +268,7 @@
     List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
     try {
       //get all the files in the commit
-      Collection<String> files = commit.getFileNames();
+      Collection<String> files = new HashSet<String>(commit.getFileNames());
       for (String fileName : files) {
         File file = new File(core.getIndexDir(), fileName);
         Map<String, Object> fileMeta = getFileInfo(file);

Reply via email to