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);
}
}