[ https://issues.apache.org/jira/browse/OAK-7389?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16426944#comment-16426944 ]
Amit Jain commented on OAK-7389: -------------------------------- [~catholicon] bq. FindOneAndUpdateOptions options = new FindOneAndUpdateOptions().upsert(true); // <- this change isn't required, but I don't think projecting _id is required Yes it's may not be required but might be good to have for performance to not have Mongo transport the whole document back but just the id. > Mongo/FileBlobStore does not update timestamp for already existing blobs > ------------------------------------------------------------------------ > > Key: OAK-7389 > URL: https://issues.apache.org/jira/browse/OAK-7389 > Project: Jackrabbit Oak > Issue Type: Bug > Components: blob > Affects Versions: 1.2.14, 1.4.20, 1.8.2, 1.6.11 > Reporter: Amit Jain > Assignee: Amit Jain > Priority: Critical > Fix For: 1.2.30 > > Attachments: OAK-7389-v1.patch, OAK-7389-v2.patch > > > MongoBlobStore uses uses the {{insert}} call and ignores any exceptions which > means any existing value won't be updated. > {code:java} > @Override > 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 > try { > getBlobCollection().insertOne(mongoBlob); > } catch (DuplicateKeyException e) { > // the same block was already stored before: ignore > } catch (MongoException e) { > if (e.getCode() == DUPLICATE_KEY_ERROR_CODE) { > // the same block was already stored before: ignore > } else { > throw new IOException(e.getMessage(), e); > } > } > } > {code} > FileBlobStore also returns if there's a file already existing without > updating the timestamp > {code:java} > @Override > protected synchronized void storeBlock(byte[] digest, int level, byte[] > data) throws IOException { > File f = getFile(digest, false); > if (f.exists()) { > return; > } > ......... > {code} > The above would cause data loss in DSGC if there are updates to the blob > blocks which are re-surrected (stored again at the time of DSGC) because the > timestamp would never have been modified. > > cc/ [~tmueller], [~mreutegg], [~chetanm], [~catholicon] -- This message was sent by Atlassian JIRA (v7.6.3#76005)