|
|
|
@ -19,8 +19,8 @@ import java.io.File;
|
|
|
|
|
import java.io.FileInputStream; |
|
|
|
|
import java.io.FileNotFoundException; |
|
|
|
|
import java.io.IOException; |
|
|
|
|
import java.nio.file.AtomicMoveNotSupportedException; |
|
|
|
|
import java.nio.file.Files; |
|
|
|
|
import java.nio.file.NoSuchFileException; |
|
|
|
|
import java.nio.file.StandardCopyOption; |
|
|
|
|
import java.text.MessageFormat; |
|
|
|
|
import java.util.ArrayList; |
|
|
|
@ -685,47 +685,46 @@ public class ObjectDirectory extends FileObjectDatabase {
|
|
|
|
|
FileUtils.delete(tmp, FileUtils.RETRY); |
|
|
|
|
return InsertLooseObjectResult.EXISTS_LOOSE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
Files.move(FileUtils.toPath(tmp), FileUtils.toPath(dst), |
|
|
|
|
StandardCopyOption.ATOMIC_MOVE); |
|
|
|
|
dst.setReadOnly(); |
|
|
|
|
unpackedObjectCache.add(id); |
|
|
|
|
return InsertLooseObjectResult.INSERTED; |
|
|
|
|
} catch (AtomicMoveNotSupportedException e) { |
|
|
|
|
LOG.error(e.getMessage(), e); |
|
|
|
|
return tryMove(tmp, dst, id); |
|
|
|
|
} catch (NoSuchFileException e) { |
|
|
|
|
// It's possible the directory doesn't exist yet as the object
|
|
|
|
|
// directories are always lazily created. Note that we try the
|
|
|
|
|
// rename/move first as the directory likely does exist.
|
|
|
|
|
//
|
|
|
|
|
// Create the directory.
|
|
|
|
|
//
|
|
|
|
|
FileUtils.mkdir(dst.getParentFile(), true); |
|
|
|
|
} catch (IOException e) { |
|
|
|
|
// ignore
|
|
|
|
|
// Any other IO error is considered a failure.
|
|
|
|
|
//
|
|
|
|
|
LOG.error(e.getMessage(), e); |
|
|
|
|
FileUtils.delete(tmp, FileUtils.RETRY); |
|
|
|
|
return InsertLooseObjectResult.FAILURE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Maybe the directory doesn't exist yet as the object
|
|
|
|
|
// directories are always lazily created. Note that we
|
|
|
|
|
// try the rename first as the directory likely does exist.
|
|
|
|
|
//
|
|
|
|
|
FileUtils.mkdir(dst.getParentFile(), true); |
|
|
|
|
try { |
|
|
|
|
Files.move(FileUtils.toPath(tmp), FileUtils.toPath(dst), |
|
|
|
|
StandardCopyOption.ATOMIC_MOVE); |
|
|
|
|
dst.setReadOnly(); |
|
|
|
|
unpackedObjectCache.add(id); |
|
|
|
|
return InsertLooseObjectResult.INSERTED; |
|
|
|
|
} catch (AtomicMoveNotSupportedException e) { |
|
|
|
|
LOG.error(e.getMessage(), e); |
|
|
|
|
return tryMove(tmp, dst, id); |
|
|
|
|
} catch (IOException e) { |
|
|
|
|
LOG.debug(e.getMessage(), e); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!createDuplicate && has(id)) { |
|
|
|
|
// The object failed to be renamed into its proper location and
|
|
|
|
|
// it doesn't exist in the repository either. We really don't
|
|
|
|
|
// know what went wrong, so fail.
|
|
|
|
|
//
|
|
|
|
|
LOG.error(e.getMessage(), e); |
|
|
|
|
FileUtils.delete(tmp, FileUtils.RETRY); |
|
|
|
|
return InsertLooseObjectResult.EXISTS_PACKED; |
|
|
|
|
return InsertLooseObjectResult.FAILURE; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// The object failed to be renamed into its proper
|
|
|
|
|
// location and it doesn't exist in the repository
|
|
|
|
|
// either. We really don't know what went wrong, so
|
|
|
|
|
// fail.
|
|
|
|
|
//
|
|
|
|
|
FileUtils.delete(tmp, FileUtils.RETRY); |
|
|
|
|
return InsertLooseObjectResult.FAILURE; |
|
|
|
|
private InsertLooseObjectResult tryMove(File tmp, File dst, |
|
|
|
|
ObjectId id) |
|
|
|
|
throws IOException { |
|
|
|
|
Files.move(FileUtils.toPath(tmp), FileUtils.toPath(dst), |
|
|
|
|
StandardCopyOption.ATOMIC_MOVE); |
|
|
|
|
dst.setReadOnly(); |
|
|
|
|
unpackedObjectCache.add(id); |
|
|
|
|
return InsertLooseObjectResult.INSERTED; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
boolean searchPacksAgain(PackList old) { |
|
|
|
|