@@ -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) { |
@@ -14,7 +14,6 @@ package org.eclipse.jgit.internal.storage.file; | |||
import java.io.EOFException; | |||
import java.io.File; | |||
import java.io.FileNotFoundException; | |||
import java.io.FileOutputStream; | |||
import java.io.FilterOutputStream; | |||
import java.io.IOException; | |||
@@ -116,7 +115,7 @@ class ObjectDirectoryInserter extends ObjectInserter { | |||
private ObjectId insertOneObject( | |||
File tmp, ObjectId id, boolean createDuplicate) | |||
throws IOException, ObjectWritingException { | |||
throws IOException { | |||
switch (db.insertUnpackedObject(tmp, id, createDuplicate)) { | |||
case INSERTED: | |||
case EXISTS_PACKED: | |||
@@ -163,18 +162,16 @@ class ObjectDirectoryInserter extends ObjectInserter { | |||
} | |||
} | |||
@SuppressWarnings("resource" /* java 7 */) | |||
private File toTemp(final SHA1 md, final int type, long len, | |||
final InputStream is) throws IOException, FileNotFoundException, | |||
Error { | |||
final InputStream is) throws IOException { | |||
boolean delete = true; | |||
File tmp = newTempFile(); | |||
try { | |||
FileOutputStream fOut = new FileOutputStream(tmp); | |||
try (FileOutputStream fOut = new FileOutputStream(tmp)) { | |||
try { | |||
OutputStream out = fOut; | |||
if (config.getFSyncObjectFiles()) | |||
if (config.getFSyncObjectFiles()) { | |||
out = Channels.newOutputStream(fOut.getChannel()); | |||
} | |||
DeflaterOutputStream cOut = compress(out); | |||
SHA1OutputStream dOut = new SHA1OutputStream(cOut, md); | |||
writeHeader(dOut, type, len); | |||
@@ -182,53 +179,54 @@ class ObjectDirectoryInserter extends ObjectInserter { | |||
final byte[] buf = buffer(); | |||
while (len > 0) { | |||
int n = is.read(buf, 0, (int) Math.min(len, buf.length)); | |||
if (n <= 0) | |||
if (n <= 0) { | |||
throw shortInput(len); | |||
} | |||
dOut.write(buf, 0, n); | |||
len -= n; | |||
} | |||
dOut.flush(); | |||
cOut.finish(); | |||
} finally { | |||
if (config.getFSyncObjectFiles()) | |||
if (config.getFSyncObjectFiles()) { | |||
fOut.getChannel().force(true); | |||
fOut.close(); | |||
} | |||
} | |||
delete = false; | |||
return tmp; | |||
} finally { | |||
if (delete) | |||
if (delete) { | |||
FileUtils.delete(tmp, FileUtils.RETRY); | |||
} | |||
} | |||
} | |||
@SuppressWarnings("resource" /* java 7 */) | |||
private File toTemp(final int type, final byte[] buf, final int pos, | |||
final int len) throws IOException, FileNotFoundException { | |||
final int len) throws IOException { | |||
boolean delete = true; | |||
File tmp = newTempFile(); | |||
try { | |||
FileOutputStream fOut = new FileOutputStream(tmp); | |||
try (FileOutputStream fOut = new FileOutputStream(tmp)) { | |||
try { | |||
OutputStream out = fOut; | |||
if (config.getFSyncObjectFiles()) | |||
if (config.getFSyncObjectFiles()) { | |||
out = Channels.newOutputStream(fOut.getChannel()); | |||
} | |||
DeflaterOutputStream cOut = compress(out); | |||
writeHeader(cOut, type, len); | |||
cOut.write(buf, pos, len); | |||
cOut.finish(); | |||
} finally { | |||
if (config.getFSyncObjectFiles()) | |||
if (config.getFSyncObjectFiles()) { | |||
fOut.getChannel().force(true); | |||
fOut.close(); | |||
} | |||
} | |||
delete = false; | |||
return tmp; | |||
} finally { | |||
if (delete) | |||
if (delete) { | |||
FileUtils.delete(tmp, FileUtils.RETRY); | |||
} | |||
} | |||
} | |||