You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by ch...@apache.org on 2016/06/07 11:40:33 UTC
svn commit: r1747197 - in /jackrabbit/oak/trunk/oak-core/src:
main/java/org/apache/jackrabbit/oak/plugins/document/
test/java/org/apache/jackrabbit/oak/plugins/document/
Author: chetanm
Date: Tue Jun 7 11:40:33 2016
New Revision: 1747197
URL: http://svn.apache.org/viewvc?rev=1747197&view=rev
Log:
OAK-4428 - Optimize RevisionVector methods
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/Revision.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/RevisionVector.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/RevisionVectorTest.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/Revision.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/Revision.java?rev=1747197&r1=1747196&r2=1747197&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/Revision.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/Revision.java Tue Jun 7 11:40:33 2016
@@ -27,6 +27,9 @@ import static com.google.common.base.Pre
*/
public final class Revision implements CacheValue {
+ //Extra 2 for those cases where counter or clusterId is 2 digit
+ final static int REV_STRING_APPROX_SIZE = Revision.newRevision(0).toString().length() + 2;
+
static final int SHALLOW_MEMORY_USAGE = 32;
private static volatile long lastTimestamp;
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/RevisionVector.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/RevisionVector.java?rev=1747197&r1=1747196&r2=1747197&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/RevisionVector.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/RevisionVector.java Tue Jun 7 11:40:33 2016
@@ -27,11 +27,9 @@ import javax.annotation.Nonnull;
import com.google.common.collect.AbstractIterator;
import com.google.common.collect.Iterators;
-import com.google.common.collect.Lists;
import com.google.common.collect.PeekingIterator;
import com.google.common.collect.Sets;
import com.google.common.primitives.Ints;
-
import org.apache.jackrabbit.oak.cache.CacheValue;
import org.apache.jackrabbit.oak.plugins.document.util.Utils;
@@ -57,6 +55,9 @@ public final class RevisionVector implem
private final Revision[] revisions;
+ //lazily initialized
+ private int hash;
+
private RevisionVector(@Nonnull Revision[] revisions,
boolean checkUniqueClusterIds,
boolean sort) {
@@ -320,12 +321,16 @@ public final class RevisionVector implem
* @return a string representation of this revision vector.
*/
public String asString() {
- StringBuilder sb = new StringBuilder();
- String comma = "";
- for (Revision r : revisions) {
- sb.append(comma);
- comma = ",";
- r.toStringBuilder(sb);
+ int len = revisions.length;
+ if (len == 0) {
+ return "";
+ }
+ StringBuilder sb = new StringBuilder(len * Revision.REV_STRING_APPROX_SIZE + len - 1);
+ for (int i = 0; i < len; i++) {
+ if (i > 0) {
+ sb.append(',');
+ }
+ revisions[i].toStringBuilder(sb);
}
return sb.toString();
}
@@ -339,9 +344,10 @@ public final class RevisionVector implem
* @throws IllegalArgumentException if the string is malformed
*/
public static RevisionVector fromString(String s) {
- List<Revision> revisions = Lists.newArrayListWithCapacity(3);
- for (String str : s.split(",")) {
- revisions.add(Revision.fromString(str));
+ String[] list = s.split(",");
+ Revision[] revisions = new Revision[list.length];
+ for (int i = 0; i < list.length; i++) {
+ revisions[i] = Revision.fromString(list[i]);
}
return new RevisionVector(revisions);
}
@@ -446,17 +452,24 @@ public final class RevisionVector implem
}
@Override
- public boolean equals(Object obj) {
- if (obj instanceof RevisionVector) {
- RevisionVector other = (RevisionVector) obj;
- return Arrays.equals(revisions, other.revisions);
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
}
- return false;
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ RevisionVector other = (RevisionVector) o;
+ return Arrays.equals(revisions, other.revisions);
}
@Override
public int hashCode() {
- return Arrays.hashCode(revisions);
+ if (hash == 0){
+ hash = Arrays.hashCode(revisions);
+ }
+ return hash;
}
//-------------------------< internal >-------------------------------------
Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/RevisionVectorTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/RevisionVectorTest.java?rev=1747197&r1=1747196&r2=1747197&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/RevisionVectorTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/RevisionVectorTest.java Tue Jun 7 11:40:33 2016
@@ -321,6 +321,11 @@ public class RevisionVectorTest {
assertNotEquals(rv1, rv2);
rv2 = rv2.update(r12);
assertEquals(rv1, rv2);
+
+ //Check basic cases which are short circuited
+ assertEquals(rv1, rv1);
+ assertNotEquals(rv1, null);
+ assertNotEquals(rv1, new Object());
}
@Test
@@ -328,6 +333,9 @@ public class RevisionVectorTest {
RevisionVector rv1 = new RevisionVector();
RevisionVector rv2 = new RevisionVector();
assertEquals(rv1.hashCode(), rv2.hashCode());
+
+ //Check again once lazily initialized hash is initialized
+ assertEquals(rv1.hashCode(), rv2.hashCode());
Revision r11 = new Revision(1, 0, 1);
rv1 = rv1.update(r11);
rv2 = rv2.update(r11);
@@ -382,4 +390,16 @@ public class RevisionVectorTest {
rv = rv.update(r12);
assertEquals(new RevisionVector(br11, r12), rv.asBranchRevision(1));
}
+
+ @Test
+ public void fromString() throws Exception{
+ RevisionVector rv = new RevisionVector(
+ new Revision(1, 0, 1),
+ new Revision(2, 0, 2)
+ );
+
+ String rvstr = rv.asString();
+ RevisionVector rvFromStr = RevisionVector.fromString(rvstr);
+ assertEquals(rv, rvFromStr);
+ }
}