- Added a manual renaming of files in case the java.io.File's renameTo(File)

call fails.  It has been reported that this happens on Windows JVMs.
Contributed by: Matt Tucker


git-svn-id: https://svn.apache.org/repos/asf/lucene/java/trunk@149951 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Otis Gospodnetic 2003-03-01 17:38:24 +00:00
parent b328dc9403
commit 88408e014b
1 changed files with 52 additions and 6 deletions

View File

@ -3,8 +3,8 @@ package org.apache.lucene.store;
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001 The Apache Software Foundation. All rights
* reserved.
* Copyright (c) 2001, 2002, 2003 The Apache Software Foundation. All
* rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@ -57,6 +57,8 @@ package org.apache.lucene.store;
import java.io.IOException;
import java.io.File;
import java.io.RandomAccessFile;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Hashtable;
import org.apache.lucene.util.Constants;
@ -69,19 +71,22 @@ import org.apache.lucene.util.Constants;
* @see Directory
* @author Doug Cutting
*/
public final class FSDirectory extends Directory {
/** This cache of directories ensures that there is a unique Directory
* instance per path, so that synchronization on the Directory can be used to
* synchronize access between readers and writers.
*
* This should be a WeakHashMap, so that entries can be GC'd, but that would
* require Java 1.2. Instead we use refcounts... */
* require Java 1.2. Instead we use refcounts...
*/
private static final Hashtable DIRECTORIES = new Hashtable();
private static final boolean DISABLE_LOCKS =
Boolean.getBoolean("disableLuceneLocks") || Constants.JAVA_1_1;
/** A buffer optionally used in renameTo method */
private byte[] buffer = null;
/** Returns the directory instance for the named location.
*
* <p>Directories are cached, so that, for a given canonical path, the same
@ -207,8 +212,49 @@ public final class FSDirectory extends Directory {
if (!nu.delete())
throw new IOException("couldn't delete " + to);
if (!old.renameTo(nu))
throw new IOException("couldn't rename " + from + " to " + to);
// Rename the old file to the new one. Unfortunately, the renameTo()
// method does not work reliably under some JVMs. Therefore, if the
// rename fails, we manually rename by copying the old file to the new one
if (!old.renameTo(nu)) {
java.io.InputStream in = null;
java.io.OutputStream out = null;
try {
in = new FileInputStream(old);
out = new FileOutputStream(nu);
// see if the buffer needs to be initialized. Initialization is
// only done on-demand since many VM's will never run into the renameTo
// bug and hence shouldn't waste 1K of mem for no reason.
if (buffer == null) {
buffer = new byte[1024];
}
int len;
while ((len = in.read(buffer)) >= 0) {
out.write(buffer, 0, len);
}
// delete the old file.
old.delete();
}
catch (IOException ioe) {
throw new IOException("couldn't rename " + from + " to " + to);
}
finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
// what can we do?
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
// what can we do?
}
}
}
}
}
/** Creates a new, empty file in the directory with the given name.