You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by dp...@apache.org on 2012/03/06 11:47:05 UTC
svn commit: r1297414 - in /jackrabbit/sandbox/microkernel/src:
main/java/org/apache/jackrabbit/mk/model/
main/java/org/apache/jackrabbit/mk/store/
main/java/org/apache/jackrabbit/mk/store/pm/
test/java/org/apache/jackrabbit/mk/store/
Author: dpfister
Date: Tue Mar 6 10:47:05 2012
New Revision: 1297414
URL: http://svn.apache.org/viewvc?rev=1297414&view=rev
Log:
Use a counter-based commit id
Modified:
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/Commit.java
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/MutableCommit.java
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/DefaultRevisionStore.java
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/IdFactory.java
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/RevisionStore.java
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/pm/BDbPersistenceManager.java
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/pm/FSPersistenceManager.java
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/pm/H2PersistenceManager.java
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/pm/InMemPersistenceManager.java
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/pm/MongoPersistenceManager.java
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/pm/PersistenceManager.java
jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/store/CopyHeadRevisionTest.java
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/Commit.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/Commit.java?rev=1297414&r1=1297413&r2=1297414&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/Commit.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/Commit.java Tue Mar 6 10:47:05 2012
@@ -22,7 +22,7 @@ import org.apache.jackrabbit.mk.store.Bi
*
*/
public interface Commit {
-
+
String getRootNodeId();
public String getParentId();
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/MutableCommit.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/MutableCommit.java?rev=1297414&r1=1297413&r2=1297414&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/MutableCommit.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/model/MutableCommit.java Tue Mar 6 10:47:05 2012
@@ -21,6 +21,11 @@ package org.apache.jackrabbit.mk.model;
*/
public class MutableCommit extends AbstractCommit {
+ /**
+ * Commit id.
+ */
+ private String id;
+
public MutableCommit() {
}
@@ -29,11 +34,12 @@ public class MutableCommit extends Abstr
*
* @param other other commit
*/
- public MutableCommit(Commit other) {
+ public MutableCommit(StoredCommit other) {
setParentId(other.getParentId());
setRootNodeId(other.getRootNodeId());
setCommitTS(other.getCommitTS());
setMsg(other.getMsg());
+ this.id = other.getId();
}
public void setParentId(String parentId) {
@@ -51,4 +57,13 @@ public class MutableCommit extends Abstr
public void setMsg(String msg) {
this.msg = msg;
}
+
+ /**
+ * Return the commit id.
+ *
+ * @return commit id
+ */
+ public String getId() {
+ return id;
+ }
}
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/DefaultRevisionStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/DefaultRevisionStore.java?rev=1297414&r1=1297413&r2=1297414&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/DefaultRevisionStore.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/DefaultRevisionStore.java Tue Mar 6 10:47:05 2012
@@ -19,7 +19,6 @@ package org.apache.jackrabbit.mk.store;
import org.apache.jackrabbit.mk.blobs.BlobStore;
import org.apache.jackrabbit.mk.blobs.FileBlobStore;
import org.apache.jackrabbit.mk.model.ChildNodeEntriesMap;
-import org.apache.jackrabbit.mk.model.Commit;
import org.apache.jackrabbit.mk.model.MutableCommit;
import org.apache.jackrabbit.mk.model.Node;
import org.apache.jackrabbit.mk.model.MutableNode;
@@ -28,6 +27,7 @@ import org.apache.jackrabbit.mk.model.St
import org.apache.jackrabbit.mk.store.pm.H2PersistenceManager;
import org.apache.jackrabbit.mk.store.pm.PersistenceManager;
import org.apache.jackrabbit.mk.util.SimpleLRUCache;
+import org.apache.jackrabbit.mk.util.StringUtils;
import java.io.File;
import java.io.InputStream;
@@ -47,6 +47,7 @@ public class DefaultRevisionStore implem
private boolean initialized;
private String headId;
+ private long headCounter;
private final ReentrantReadWriteLock headLock = new ReentrantReadWriteLock();
private PersistenceManager pm;
private BlobStore blobStore;
@@ -79,12 +80,17 @@ public class DefaultRevisionStore implem
headId = pm.readHead();
if (headId == null || headId.length() == 0) {
// assume virgin repository
+ byte[] rawHeadId = longToBytes(++headCounter);
+ headId = StringUtils.convertBytesToHex(rawHeadId);
+
String rootNodeId = pm.writeNode(new MutableNode(this));
MutableCommit initialCommit = new MutableCommit();
initialCommit.setCommitTS(System.currentTimeMillis());
initialCommit.setRootNodeId(rootNodeId);
- headId = pm.writeCommit(initialCommit);
+ pm.writeCommit(rawHeadId, initialCommit);
pm.writeHead(headId);
+ } else {
+ headCounter = Long.parseLong(headId, 16);
}
initialized = true;
@@ -113,6 +119,22 @@ public class DefaultRevisionStore implem
String val = System.getProperty(CACHE_SIZE);
return (val != null) ? Integer.parseInt(val) : DEFAULT_CACHE_SIZE;
}
+
+ /**
+ * Convert a long value into a fixed-size byte array of size 16.
+ *
+ * @param value value
+ * @return byte array
+ */
+ static byte[] longToBytes(long value) {
+ byte[] result = new byte[16];
+
+ for (int i = result.length - 1; i >= 0 && value != 0; i--) {
+ result[i] = (byte) (value & 0xff);
+ value >>>= 8;
+ }
+ return result;
+ }
//--------------------------------------------------------< RevisionStore >
@@ -156,7 +178,7 @@ public class DefaultRevisionStore implem
return id;
}
- public String putCommit(Commit commit) throws Exception {
+ public String putCommit(MutableCommit commit) throws Exception {
verifyInitialized();
PersistHook callback = null;
@@ -165,7 +187,16 @@ public class DefaultRevisionStore implem
callback.prePersist(this);
}
- String id = pm.writeCommit(commit);
+ String id = commit.getId();
+ byte[] rawId;
+
+ if (id == null) {
+ rawId = longToBytes(++headCounter);
+ id = StringUtils.convertBytesToHex(rawId);
+ } else {
+ rawId = StringUtils.convertHexToBytes(id);
+ }
+ pm.writeCommit(rawId, commit);
if (callback != null) {
callback.postPersist(this);
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/IdFactory.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/IdFactory.java?rev=1297414&r1=1297413&r2=1297414&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/IdFactory.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/IdFactory.java Tue Mar 6 10:47:05 2012
@@ -18,10 +18,8 @@ package org.apache.jackrabbit.mk.store;
import java.security.MessageDigest;
-import org.apache.jackrabbit.mk.util.AscendingClock;
-
/**
- * Create new commit and internal content object ids based on serialized data.
+ * Create new internal content object ids based on serialized data.
*/
public abstract class IdFactory {
@@ -41,16 +39,6 @@ public abstract class IdFactory {
}
/**
- * Create a new id for some commit.
- *
- * @param serialized serialized data
- * @return raw revision id as byte array
- * @throws Exception if an error occurs
- */
- public abstract byte[] createCommitId(byte[] serialized)
- throws Exception;
-
- /**
* Return a digest for some data.
*
* @param data data
@@ -61,55 +49,12 @@ public abstract class IdFactory {
}
/**
- * Convert a long value into a fixed-size byte array of size 16.
- *
- * @param value value
- * @return byte array
- */
- static byte[] longToBytes(long value) {
- byte[] result = new byte[16];
-
- for (int i = result.length - 1; i >= 0 && value != 0; i--) {
- result[i] = (byte) (value & 0xff);
- value >>>= 8;
- }
- return result;
- }
-
- /**
* Return the default factory that will create node and revision ids based
* on their content.
*
* @return factory
*/
public static IdFactory getDigestFactory() {
- return new IdFactory() {
- @Override
- public byte[] createCommitId(byte[] serialized)
- throws Exception {
-
- return digest(serialized);
- }
- };
- }
-
- /**
- * Return a factory that will create node ids based on their content, while
- * returning strictly ascending revision ids based on the current system time.
- *
- * @return factory
- */
- public static IdFactory getAscendingClockFactory() {
- return new IdFactory() {
-
- private final AscendingClock clock = new AscendingClock(System.currentTimeMillis());
-
- @Override
- public byte[] createCommitId(byte[] serialized)
- throws Exception {
-
- return longToBytes(clock.time());
- }
- };
+ return new IdFactory() {};
}
}
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/RevisionStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/RevisionStore.java?rev=1297414&r1=1297413&r2=1297414&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/RevisionStore.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/RevisionStore.java Tue Mar 6 10:47:05 2012
@@ -17,7 +17,7 @@
package org.apache.jackrabbit.mk.store;
import org.apache.jackrabbit.mk.model.ChildNodeEntriesMap;
-import org.apache.jackrabbit.mk.model.Commit;
+import org.apache.jackrabbit.mk.model.MutableCommit;
import org.apache.jackrabbit.mk.model.Node;
import java.io.InputStream;
@@ -28,7 +28,7 @@ import java.io.InputStream;
public interface RevisionStore extends RevisionProvider {
String /*id*/ putNode(Node node) throws Exception;
- String /*id*/ putCommit(Commit commit) throws Exception;
+ String /*id*/ putCommit(MutableCommit commit) throws Exception;
String /*id*/ putCNEMap(ChildNodeEntriesMap map) throws Exception;
void setHeadCommitId(String commitId) throws Exception;
void lockHead();
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/pm/BDbPersistenceManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/pm/BDbPersistenceManager.java?rev=1297414&r1=1297413&r2=1297414&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/pm/BDbPersistenceManager.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/pm/BDbPersistenceManager.java Tue Mar 6 10:47:05 2012
@@ -151,12 +151,11 @@ public class BDbPersistenceManager imple
}
}
- public String writeCommit(Commit commit) throws Exception {
+ public void writeCommit(byte[] rawId, Commit commit) throws Exception {
ByteArrayOutputStream out = new ByteArrayOutputStream();
commit.serialize(new BinaryBinding(out));
byte[] bytes = out.toByteArray();
- byte[] rawId = idFactory.createCommitId(bytes);
- return persist(bytes, rawId);
+ persist(bytes, rawId);
}
public ChildNodeEntriesMap readCNEMap(String id) throws NotFoundException, Exception {
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/pm/FSPersistenceManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/pm/FSPersistenceManager.java?rev=1297414&r1=1297413&r2=1297414&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/pm/FSPersistenceManager.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/pm/FSPersistenceManager.java Tue Mar 6 10:47:05 2012
@@ -112,12 +112,11 @@ public class FSPersistenceManager implem
}
}
- public String writeCommit(Commit commit) throws Exception {
+ public void writeCommit(byte[] rawId, Commit commit) throws Exception {
ByteArrayOutputStream out = new ByteArrayOutputStream();
commit.serialize(new BinaryBinding(out));
byte[] bytes = out.toByteArray();
- byte[] rawId = idFactory.createCommitId(bytes);
- return writeFile(bytes, rawId);
+ writeFile(bytes, rawId);
}
public ChildNodeEntriesMap readCNEMap(String id) throws NotFoundException, Exception {
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/pm/H2PersistenceManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/pm/H2PersistenceManager.java?rev=1297414&r1=1297413&r2=1297414&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/pm/H2PersistenceManager.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/pm/H2PersistenceManager.java Tue Mar 6 10:47:05 2012
@@ -178,12 +178,10 @@ public class H2PersistenceManager implem
}
}
- public String writeCommit(Commit commit) throws Exception {
+ public void writeCommit(byte[] rawId, Commit commit) throws Exception {
ByteArrayOutputStream out = new ByteArrayOutputStream();
commit.serialize(new BinaryBinding(out));
byte[] bytes = out.toByteArray();
- byte[] rawId = idFactory.createCommitId(bytes);
- String id = StringUtils.convertBytesToHex(rawId);
Connection con = cp.getConnection();
try {
@@ -201,7 +199,6 @@ public class H2PersistenceManager implem
} finally {
con.close();
}
- return id;
}
public ChildNodeEntriesMap readCNEMap(String id) throws NotFoundException, Exception {
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/pm/InMemPersistenceManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/pm/InMemPersistenceManager.java?rev=1297414&r1=1297413&r2=1297414&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/pm/InMemPersistenceManager.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/pm/InMemPersistenceManager.java Tue Mar 6 10:47:05 2012
@@ -97,17 +97,15 @@ public class InMemPersistenceManager imp
}
}
- public String writeCommit(Commit commit) throws Exception {
+ public void writeCommit(byte[] rawId, Commit commit) throws Exception {
ByteArrayOutputStream out = new ByteArrayOutputStream();
commit.serialize(new BinaryBinding(out));
byte[] bytes = out.toByteArray();
- String id = StringUtils.convertBytesToHex(idFactory.createCommitId(bytes));
+ String id = StringUtils.convertBytesToHex(rawId);
if (!commits.containsKey(id)) {
commits.put(id, StoredCommit.deserialize(id, new BinaryBinding(new ByteArrayInputStream(bytes))));
}
-
- return id;
}
public ChildNodeEntriesMap readCNEMap(String id) throws NotFoundException, Exception {
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/pm/MongoPersistenceManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/pm/MongoPersistenceManager.java?rev=1297414&r1=1297413&r2=1297414&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/pm/MongoPersistenceManager.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/pm/MongoPersistenceManager.java Tue Mar 6 10:47:05 2012
@@ -186,16 +186,15 @@ public class MongoPersistenceManager imp
}
}
- public String writeCommit(Commit commit) throws Exception {
+ public void writeCommit(byte[] rawId, Commit commit) throws Exception {
ByteArrayOutputStream out = new ByteArrayOutputStream();
commit.serialize(new BinaryBinding(out));
byte[] bytes = out.toByteArray();
- byte[] key = idFactory.createCommitId(bytes);
- String id = StringUtils.convertBytesToHex(key);
+ String id = StringUtils.convertBytesToHex(rawId);
BasicDBObject commitObject;
if (BINARY_FORMAT) {
- commitObject = new BasicDBObject(ID_FIELD, key).append(DATA_FIELD, bytes);
+ commitObject = new BasicDBObject(ID_FIELD, rawId).append(DATA_FIELD, bytes);
} else {
commitObject = new BasicDBObject(ID_FIELD, id);
commit.serialize(new DBObjectBinding(commitObject));
@@ -205,8 +204,6 @@ public class MongoPersistenceManager imp
} catch (MongoException.DuplicateKey ignore) {
// fall through
}
-
- return id;
}
public ChildNodeEntriesMap readCNEMap(String id) throws NotFoundException, Exception {
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/pm/PersistenceManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/pm/PersistenceManager.java?rev=1297414&r1=1297413&r2=1297414&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/pm/PersistenceManager.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/pm/PersistenceManager.java Tue Mar 6 10:47:05 2012
@@ -52,5 +52,5 @@ public interface PersistenceManager {
StoredCommit readCommit(String id) throws NotFoundException, Exception;
- String writeCommit(Commit commit) throws Exception;
+ void writeCommit(byte[] rawId, Commit commit) throws Exception;
}
Modified: jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/store/CopyHeadRevisionTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/store/CopyHeadRevisionTest.java?rev=1297414&r1=1297413&r2=1297414&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/store/CopyHeadRevisionTest.java (original)
+++ jackrabbit/sandbox/microkernel/src/test/java/org/apache/jackrabbit/mk/store/CopyHeadRevisionTest.java Tue Mar 6 10:47:05 2012
@@ -25,10 +25,10 @@ import org.apache.jackrabbit.mk.fs.FileU
import org.apache.jackrabbit.mk.json.fast.Jsop;
import org.apache.jackrabbit.mk.json.fast.JsopArray;
import org.apache.jackrabbit.mk.model.ChildNode;
-import org.apache.jackrabbit.mk.model.Commit;
import org.apache.jackrabbit.mk.model.MutableCommit;
import org.apache.jackrabbit.mk.model.MutableNode;
import org.apache.jackrabbit.mk.model.Node;
+import org.apache.jackrabbit.mk.model.StoredCommit;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
@@ -38,12 +38,6 @@ import org.junit.Test;
* Use-case: start off a new revision store that contains just the head revision
* and its nodes.
*
- * TODO: when copying a head revision, including commit and nodes, to a new
- * store, the revision id will be different, which might be confusing
- * for an MK client. Cause for this is the digest computation of all
- * fields in a commit object, including the parent commit, which is
- * obviously different.
- *
* TODO: if copying starts at some point in time and ends some time later, copy
* all revisions that are accessed in the meantime to the new store.
* This must be done in a way that ensures the integrity of the parental
@@ -78,8 +72,8 @@ public class CopyHeadRevisionTest {
MicroKernelImpl mkTo = new MicroKernelImpl(new Repository(rsTo));
- // TODO: assert both old and new MK have same head revision
- // Assert.assertEquals(mkFrom.getHeadRevision(), mkTo.getHeadRevision());
+ // Assert both old and new MK have same head revision
+ Assert.assertEquals(mkFrom.getHeadRevision(), mkTo.getHeadRevision());
// Assert both old and new MK have same contents
Assert.assertEquals(
@@ -102,7 +96,7 @@ public class CopyHeadRevisionTest {
private void copyHeadRevision(RevisionProvider from, RevisionStore to)
throws Exception {
- Commit commitFrom = from.getHeadCommit();
+ StoredCommit commitFrom = from.getHeadCommit();
Node nodeFrom = from.getNode(commitFrom.getRootNodeId());
copy(nodeFrom, to);