Author: amitj
Date: Wed Aug 29 08:29:42 2018
New Revision: 1839552

URL: http://svn.apache.org/viewvc?rev=1839552&view=rev
Log:
OAK-7389: Mongo/FileBlobStore does not update timestamp for already existing 
blobs  

Merge r1828502 from trunk

Modified:
    jackrabbit/oak/branches/1.8/   (props changed)
    
jackrabbit/oak/branches/1.8/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/FileBlobStore.java
    
jackrabbit/oak/branches/1.8/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/MemoryBlobStore.java
    
jackrabbit/oak/branches/1.8/oak-blob/src/test/java/org/apache/jackrabbit/oak/spi/blob/AbstractBlobStoreTest.java
    
jackrabbit/oak/branches/1.8/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoBlobStore.java

Propchange: jackrabbit/oak/branches/1.8/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Aug 29 08:29:42 2018
@@ -1,3 +1,3 @@
 /jackrabbit/oak/branches/1.0:1665962
-/jackrabbit/oak/trunk:1820660-1820661,1820729,1820734,1820859,1820861,1820878,1820888,1820947,1821027,1821130,1821140-1821141,1821178,1821237,1821240,1821249,1821258,1821325,1821358,1821361-1821362,1821370,1821375,1821393,1821477,1821487,1821516,1821617,1821663,1821665,1821668,1821681,1821847,1821975-1821983,1822121,1822201,1822207,1822527,1822723,1822808,1822850,1822934,1823135,1823163,1823169,1823172,1823655,1823669,1824196,1824198,1824253,1824255,1824896,1824962,1825065,1825362,1825381,1825442,1825448,1825466,1825470-1825471,1825475,1825523,1825525,1825561,1825619-1825621,1825651,1825654,1825992,1826079,1826090,1826096,1826216,1826237,1826338,1826516,1826532,1826551,1826560,1826638,1826640,1826730,1826932,1826957,1827423,1827472,1827486,1827977,1828349,1828439,1828529,1828948,1829527,1829534,1829546,1829569,1829587,1829665,1829854,1829864,1829978,1829985,1829987,1829998,1830019,1830048,1830160,1830171,1830197,1830209,1830239,1830347,1830748,1831157-1831158,1831163,1831190,1831374
 
,1831560,1832258,1832376,1832379,1832535,1833308,1833347,1833833,1834610,1834648-1834649,1834681,1834823,1834857-1834858,1835060,1835518,1835642,1835780,1835819,1836487,1836493,1837475,1837657,1837998,1838076,1838637,1839549
+/jackrabbit/oak/trunk:1820660-1820661,1820729,1820734,1820859,1820861,1820878,1820888,1820947,1821027,1821130,1821140-1821141,1821178,1821237,1821240,1821249,1821258,1821325,1821358,1821361-1821362,1821370,1821375,1821393,1821477,1821487,1821516,1821617,1821663,1821665,1821668,1821681,1821847,1821975-1821983,1822121,1822201,1822207,1822527,1822723,1822808,1822850,1822934,1823135,1823163,1823169,1823172,1823655,1823669,1824196,1824198,1824253,1824255,1824896,1824962,1825065,1825362,1825381,1825442,1825448,1825466,1825470-1825471,1825475,1825523,1825525,1825561,1825619-1825621,1825651,1825654,1825992,1826079,1826090,1826096,1826216,1826237,1826338,1826516,1826532,1826551,1826560,1826638,1826640,1826730,1826932,1826957,1827423,1827472,1827486,1827977,1828349,1828439,1828502,1828529,1828948,1829527,1829534,1829546,1829569,1829587,1829665,1829854,1829864,1829978,1829985,1829987,1829998,1830019,1830048,1830160,1830171,1830197,1830209,1830239,1830347,1830748,1831157-1831158,1831163,1831190
 
,1831374,1831560,1832258,1832376,1832379,1832535,1833308,1833347,1833833,1834610,1834648-1834649,1834681,1834823,1834857-1834858,1835060,1835518,1835642,1835780,1835819,1836487,1836493,1837475,1837657,1837998,1838076,1838637,1839549
 /jackrabbit/trunk:1345480

Modified: 
jackrabbit/oak/branches/1.8/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/FileBlobStore.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.8/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/FileBlobStore.java?rev=1839552&r1=1839551&r2=1839552&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.8/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/FileBlobStore.java
 (original)
+++ 
jackrabbit/oak/branches/1.8/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/FileBlobStore.java
 Wed Aug 29 08:29:42 2018
@@ -109,6 +109,7 @@ public class FileBlobStore extends Abstr
     protected synchronized void storeBlock(byte[] digest, int level, byte[] 
data) throws IOException {
         File f = getFile(digest, false);
         if (f.exists()) {
+            FileUtils.touch(f);
             return;
         }
         File parent = f.getParentFile();

Modified: 
jackrabbit/oak/branches/1.8/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/MemoryBlobStore.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.8/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/MemoryBlobStore.java?rev=1839552&r1=1839551&r2=1839552&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.8/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/MemoryBlobStore.java
 (original)
+++ 
jackrabbit/oak/branches/1.8/oak-blob/src/main/java/org/apache/jackrabbit/oak/spi/blob/MemoryBlobStore.java
 Wed Aug 29 08:29:42 2018
@@ -33,6 +33,7 @@ public class MemoryBlobStore extends Abs
 
     private HashMap<BlockId, byte[]> map = new HashMap<BlockId, byte[]>();
     private HashMap<BlockId, byte[]> old = new HashMap<BlockId, byte[]>();
+    private HashMap<BlockId, Long> timestamps = new HashMap<BlockId, Long>();
     private boolean mark;
 
     @Override
@@ -46,7 +47,9 @@ public class MemoryBlobStore extends Abs
 
     @Override
     protected synchronized void storeBlock(byte[] digest, int level, byte[] 
data) {
-        map.put(new BlockId(digest, 0), data);
+        BlockId id =  new BlockId(digest, 0);
+        map.put(id, data);
+        timestamps.put(id, System.currentTimeMillis());
     }
 
     @Override
@@ -90,8 +93,11 @@ public class MemoryBlobStore extends Abs
         for (String chunkId : chunkIds) {
             BlockId id = new BlockId(StringUtils.convertHexToBytes(chunkId), 
0);
             if (map.containsKey(id)) {
-                map.remove(id);
-                count++;
+                if (maxLastModifiedTime == 0 || (maxLastModifiedTime > 0 && 
maxLastModifiedTime > timestamps.get(id))) {
+                    map.remove(id);
+                    timestamps.remove(id);
+                    count++;
+                }
             } else if (old.containsKey(id)) {
                 old.remove(id);
                 count++;

Modified: 
jackrabbit/oak/branches/1.8/oak-blob/src/test/java/org/apache/jackrabbit/oak/spi/blob/AbstractBlobStoreTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.8/oak-blob/src/test/java/org/apache/jackrabbit/oak/spi/blob/AbstractBlobStoreTest.java?rev=1839552&r1=1839551&r2=1839552&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.8/oak-blob/src/test/java/org/apache/jackrabbit/oak/spi/blob/AbstractBlobStoreTest.java
 (original)
+++ 
jackrabbit/oak/branches/1.8/oak-blob/src/test/java/org/apache/jackrabbit/oak/spi/blob/AbstractBlobStoreTest.java
 Wed Aug 29 08:29:42 2018
@@ -446,6 +446,28 @@ public abstract class AbstractBlobStoreT
     }
 
     @Test
+    public void deleteUpdatedBlob() throws Exception {
+        String id = store.writeBlob(randomStream(0, getArtifactSize()));
+        Thread.sleep(100);
+
+        long beforeUpdateTime = System.currentTimeMillis();
+
+        Thread.sleep(1000);
+
+        // Should update the timestamp
+        String id2 = store.writeBlob(randomStream(0, getArtifactSize()));
+        assertEquals(id, id2);
+
+        Set<String> chunks = Sets.newHashSet();
+        Iterator<String> iter = store.resolveChunks(id.toString());
+        while (iter.hasNext()) {
+            chunks.add(iter.next());
+        }
+        long count = store.countDeleteChunks(Lists.newArrayList(chunks), 
beforeUpdateTime);
+        assertEquals("Deleted updated blobs", 0, count);
+    }
+
+    @Test
     public void uploadCallback() throws Exception {
         assumeTrue(supportsStatsCollection());
         TestCollector collector = new TestCollector();

Modified: 
jackrabbit/oak/branches/1.8/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoBlobStore.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.8/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoBlobStore.java?rev=1839552&r1=1839551&r2=1839552&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.8/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoBlobStore.java
 (original)
+++ 
jackrabbit/oak/branches/1.8/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoBlobStore.java
 Wed Aug 29 08:29:42 2018
@@ -21,6 +21,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 
+import com.mongodb.MongoException;
 import org.apache.jackrabbit.oak.commons.StringUtils;
 import org.apache.jackrabbit.oak.plugins.blob.CachingBlobStore;
 import org.slf4j.Logger;
@@ -33,7 +34,6 @@ import com.mongodb.DB;
 import com.mongodb.DBCollection;
 import com.mongodb.DBCursor;
 import com.mongodb.DBObject;
-import com.mongodb.DuplicateKeyException;
 import com.mongodb.QueryBuilder;
 import com.mongodb.ReadPreference;
 import com.mongodb.WriteResult;
@@ -78,18 +78,29 @@ public class MongoBlobStore extends Cach
     protected void storeBlock(byte[] digest, int level, byte[] data) throws 
IOException {
         String id = StringUtils.convertBytesToHex(digest);
         cache.put(id, data);
-        // Check if it already exists?
-        MongoBlob mongoBlob = new MongoBlob();
-        mongoBlob.setId(id);
-        mongoBlob.setData(data);
-        mongoBlob.setLevel(level);
-        mongoBlob.setLastMod(System.currentTimeMillis());
-        // TODO check the return value
-        // TODO verify insert is fast if the entry already exists
+
+        // Create the mongo blob object
+        BasicDBObject mongoBlob = new BasicDBObject(MongoBlob.KEY_ID, id);
+        mongoBlob.append(MongoBlob.KEY_DATA, data);
+        mongoBlob.append(MongoBlob.KEY_LEVEL, level);
+
+        // If update only the lastMod needs to be modified
+        BasicDBObject updateBlob =new BasicDBObject(MongoBlob.KEY_LAST_MOD, 
System.currentTimeMillis());
+
+        BasicDBObject upsert = new BasicDBObject();
+        upsert.append("$setOnInsert", mongoBlob)
+            .append("$set", updateBlob);
+
         try {
-            getBlobCollection().insert(mongoBlob);
-        } catch (DuplicateKeyException e) {
-            // the same block was already stored before: ignore
+            DBObject query = getBlobQuery(id, -1);
+            WriteResult update = getBlobCollection().update(query, upsert, 
true, false);
+            if (update != null && update.isUpdateOfExisting()) {
+                LOG.trace("Block with id [{}] updated", id);
+            } else {
+                LOG.trace("Block with id [{}] created", id);
+            }
+        } catch (MongoException e) {
+            throw new IOException(e.getMessage(), e);
         }
     }
 


Reply via email to