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 re...@apache.org on 2019/10/24 06:25:13 UTC

svn commit: r1868846 - in /jackrabbit/oak/branches/1.4: ./ oak-jcr/ oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/ReadWriteVersionManager.java

Author: reschke
Date: Thu Oct 24 06:25:13 2019
New Revision: 1868846

URL: http://svn.apache.org/viewvc?rev=1868846&view=rev
Log:
OAK-7512: RestoreTest.testRestoreNameJcr2 occasionally failing caused by versions sharing timestamps (merged r1833347 into 1.4)

Modified:
    jackrabbit/oak/branches/1.4/   (props changed)
    jackrabbit/oak/branches/1.4/oak-jcr/   (props changed)
    jackrabbit/oak/branches/1.4/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/ReadWriteVersionManager.java

Propchange: jackrabbit/oak/branches/1.4/
------------------------------------------------------------------------------
  Merged /jackrabbit/oak/trunk:r1833347

Propchange: jackrabbit/oak/branches/1.4/oak-jcr/
------------------------------------------------------------------------------
  Merged /jackrabbit/oak/trunk/oak-jcr:r1833347

Modified: jackrabbit/oak/branches/1.4/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/ReadWriteVersionManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.4/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/ReadWriteVersionManager.java?rev=1868846&r1=1868845&r2=1868846&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.4/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/ReadWriteVersionManager.java (original)
+++ jackrabbit/oak/branches/1.4/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/ReadWriteVersionManager.java Thu Oct 24 06:25:13 2019
@@ -34,6 +34,7 @@ import org.apache.jackrabbit.oak.namepat
 import org.apache.jackrabbit.oak.plugins.nodetype.ReadOnlyNodeTypeManager;
 import org.apache.jackrabbit.oak.plugins.version.ReadOnlyVersionManager;
 import org.apache.jackrabbit.oak.util.TreeUtil;
+import org.apache.jackrabbit.oak.stats.Clock;
 import org.apache.jackrabbit.util.ISO8601;
 
 import static com.google.common.base.Preconditions.checkArgument;
@@ -52,6 +53,8 @@ public class ReadWriteVersionManager ext
 
     private final VersionStorage versionStorage;
 
+    private final Clock clock = Clock.ACCURATE;
+
     public ReadWriteVersionManager(@Nonnull SessionDelegate sessionDelegate) {
         this.sessionDelegate = sessionDelegate;
         this.versionStorage = new VersionStorage(sessionDelegate.getRoot());
@@ -118,12 +121,15 @@ public class ReadWriteVersionManager ext
             Tree baseVersion = getExistingBaseVersion(versionable);
             versionable.setProperty(JCR_ISCHECKEDOUT, Boolean.FALSE, Type.BOOLEAN);
             PropertyState created = baseVersion.getProperty(JCR_CREATED);
-            if (created != null) {
-                long c = ISO8601.parse(created.getValue(Type.DATE)).getTimeInMillis();
-                while (System.currentTimeMillis() == c) {
-                    // busy-wait for System.currentTimeMillis to change
-                    // so that the new version has a distinct timestamp
-                }
+            long c = created == null ? 0 : ISO8601.parse(created.getValue(Type.DATE)).getTimeInMillis();
+            try {
+                long last = Math.max(c,  clock.getTimeIncreasing());
+                // wait for clock to change so that the new version has a distinct
+                // timestamp from the last checkin performed by this VersionManager
+                // see https://issues.apache.org/jira/browse/OAK-7512
+                clock.waitUntil(last);
+            } catch (InterruptedException e) {
+                throw new RepositoryException(e);
             }
             try {
                 sessionDelegate.commit();