You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by am...@apache.org on 2020/01/17 10:01:36 UTC

svn commit: r1872907 - in /jackrabbit/oak/branches/1.10: ./ oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/FSBackend.java oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/FSBackendIT.java

Author: amitj
Date: Fri Jan 17 10:01:36 2020
New Revision: 1872907

URL: http://svn.apache.org/viewvc?rev=1872907&view=rev
Log:
OAK-8780: Remove the synchronized block on the FSBackend

Merge r1872803, r1872856 from trunk

Added:
    jackrabbit/oak/branches/1.10/oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/FSBackendIT.java
      - copied, changed from r1872803, jackrabbit/oak/trunk/oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/FSBackendIT.java
Modified:
    jackrabbit/oak/branches/1.10/   (props changed)
    jackrabbit/oak/branches/1.10/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/FSBackend.java

Propchange: jackrabbit/oak/branches/1.10/
------------------------------------------------------------------------------
  Merged /jackrabbit/oak/trunk:r1872803,1872856

Modified: jackrabbit/oak/branches/1.10/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/FSBackend.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.10/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/FSBackend.java?rev=1872907&r1=1872906&r2=1872907&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.10/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/FSBackend.java (original)
+++ jackrabbit/oak/branches/1.10/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/FSBackend.java Fri Jan 17 10:01:36 2020
@@ -43,6 +43,7 @@ import org.apache.jackrabbit.core.data.D
 import org.apache.jackrabbit.core.data.LazyFileInputStream;
 import org.apache.jackrabbit.oak.spi.blob.AbstractDataRecord;
 import org.apache.jackrabbit.oak.spi.blob.AbstractSharedBackend;
+import org.apache.jackrabbit.util.TransientFileFactory;
 import org.jetbrains.annotations.NotNull;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -104,20 +105,38 @@ public class FSBackend extends AbstractS
 
     @Override
     public void write(DataIdentifier identifier, File file) throws DataStoreException {
+        TransientFileFactory fileFactory = TransientFileFactory.getInstance();
+        File tmpFile = null;
+
         File dest = getFile(identifier, fsPathDir);
-        synchronized (this) {
-            if (dest.exists()) {
-                long now = System.currentTimeMillis();
-                if (getLastModified(dest) < now + ACCESS_TIME_RESOLUTION) {
-                    setLastModified(dest, now + ACCESS_TIME_RESOLUTION);
+        if (dest.exists()) {
+            long now = System.currentTimeMillis();
+            if (getLastModified(dest) < now + ACCESS_TIME_RESOLUTION) {
+                setLastModified(dest, now + ACCESS_TIME_RESOLUTION);
+            }
+        } else {
+            try {
+                tmpFile = fileFactory.createTransientFile("fsbackend", null, fsPathDir);
+                FileUtils.copyFile(file, tmpFile);
+
+                File parent = dest.getParentFile();
+                parent.mkdirs();
+                synchronized (this) {
+                    if (tmpFile.renameTo(dest)) {
+                        // no longer need to delete the temporary file
+                        tmpFile = null;
+                    } else {
+                        throw new IOException(
+                                "Can not rename " + tmpFile.getAbsolutePath()
+                                + " to " + dest.getAbsolutePath()
+                                + " (media read only?)");
+                    }
                 }
-            } else {
-                try {
-                    FileUtils.copyFile(file, dest);
-                } catch (IOException ie) {
-                    LOG.error("failed to copy [{}] to [{}]", file.getAbsolutePath(),
-                        dest.getAbsolutePath());
-                    throw new DataStoreException("Not able to write file [" + identifier + "]", ie);
+            }  catch (IOException e) {
+                throw new DataStoreException("Could not add record", e);
+            } finally {
+                if (tmpFile != null) {
+                    tmpFile.delete();
                 }
             }
         }

Copied: jackrabbit/oak/branches/1.10/oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/FSBackendIT.java (from r1872803, jackrabbit/oak/trunk/oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/FSBackendIT.java)
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.10/oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/FSBackendIT.java?p2=jackrabbit/oak/branches/1.10/oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/FSBackendIT.java&p1=jackrabbit/oak/trunk/oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/FSBackendIT.java&r1=1872803&r2=1872907&rev=1872907&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/FSBackendIT.java (original)
+++ jackrabbit/oak/branches/1.10/oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/FSBackendIT.java Fri Jan 17 10:01:36 2020
@@ -45,6 +45,7 @@ import org.apache.jackrabbit.oak.commons
 import org.apache.jackrabbit.oak.commons.concurrent.ExecutorCloser;
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
@@ -226,11 +227,10 @@ public class FSBackendIT {
                 writeLatch.await();
                 backend.write(new DataIdentifier("0000ID" + seed), f);
                 LOG.info("Added file to backend");
-                return seed;
             } catch (Exception e) {
                 LOG.error("Error adding file to backend", e);
-                throw e;
             }
+            return seed;
         });
         futures.add(future);