Author: reschke
Date: Fri Jan 31 15:20:08 2020
New Revision: 1873421

URL: http://svn.apache.org/viewvc?rev=1873421&view=rev
Log:
OAK-8780 - Remove the synchronized block on the FSBackend (merged r1872803 and 
1872856 into 1.22)

Added:
    
jackrabbit/oak/branches/1.22/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.22/   (props changed)
    
jackrabbit/oak/branches/1.22/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/FSBackend.java

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

Modified: 
jackrabbit/oak/branches/1.22/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.22/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/FSBackend.java?rev=1873421&r1=1873420&r2=1873421&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.22/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/FSBackend.java
 (original)
+++ 
jackrabbit/oak/branches/1.22/oak-blob-plugins/src/main/java/org/apache/jackrabbit/oak/plugins/blob/datastore/FSBackend.java
 Fri Jan 31 15:20:08 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.22/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.22/oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/FSBackendIT.java?p2=jackrabbit/oak/branches/1.22/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=1873421&rev=1873421&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.22/oak-blob-plugins/src/test/java/org/apache/jackrabbit/oak/plugins/blob/datastore/FSBackendIT.java
 Fri Jan 31 15:20:08 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);
 


Reply via email to