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 da...@apache.org on 2023/06/22 08:50:01 UTC

[jackrabbit-oak] branch OAK-10199 updated (404a2f9844 -> 07548dddfb)

This is an automated email from the ASF dual-hosted git repository.

daim pushed a change to branch OAK-10199
in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git


    from 404a2f9844 OAK-10199 : fixed logic to include previously garbage collected documents if updated recently
     new 9ba789dd1c OAK-10304: log registration of invalid namespace names (#1000)
     new 07548dddfb OAK-10199 : added test case to continue with GC even if there is crash

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../plugins/name/ReadWriteNamespaceRegistry.java   | 16 ++++++++
 .../name/ReadWriteNamespaceRegistryTest.java       | 48 +++++++++++++++++-----
 .../document/VersionGarbageCollectorIT.java        | 27 +++++++-----
 3 files changed, 70 insertions(+), 21 deletions(-)


[jackrabbit-oak] 02/02: OAK-10199 : added test case to continue with GC even if there is crash

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

daim pushed a commit to branch OAK-10199
in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git

commit 07548dddfbf4094f45f798eed13d4eb8018850c9
Author: Rishabh Kumar <di...@adobe.com>
AuthorDate: Thu Jun 22 14:19:31 2023 +0530

    OAK-10199 : added test case to continue with GC even if there is crash
---
 .../document/VersionGarbageCollectorIT.java        | 27 +++++++++++++---------
 1 file changed, 16 insertions(+), 11 deletions(-)

diff --git a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollectorIT.java b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollectorIT.java
index e0de0c0617..031176ca33 100644
--- a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollectorIT.java
+++ b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/VersionGarbageCollectorIT.java
@@ -84,7 +84,6 @@ import org.apache.jackrabbit.oak.stats.Clock;
 import org.jetbrains.annotations.NotNull;
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -92,7 +91,7 @@ import org.junit.runners.Parameterized;
 @RunWith(Parameterized.class)
 public class VersionGarbageCollectorIT {
 
-    private DocumentStoreFixture fixture;
+    private final DocumentStoreFixture fixture;
 
     private Clock clock;
 
@@ -145,6 +144,7 @@ public class VersionGarbageCollectorIT {
         if (store != null) {
             store.dispose();
         }
+        ClusterNodeInfo.resetClockToDefault();
         Revision.resetClockToDefault();
         execService.shutdown();
         execService.awaitTermination(1, MINUTES);
@@ -456,15 +456,19 @@ public class VersionGarbageCollectorIT {
 
     // Test when properties are not collected in one GC cycle
     @Test
-    @Ignore
     public void testGCDeletedProps_4() throws Exception {
-        documentMKBuilder = new DocumentMK.Builder().clock(clock)
-                .setLeaseCheckMode(LeaseCheckMode.DISABLED)
-                .setDocumentStore(new FailingDocumentStore(fixture.createDocumentStore(), 42)).setAsyncDelay(0);
-        store = documentMKBuilder.getNodeStore();
+        final FailingDocumentStore fds = new FailingDocumentStore(fixture.createDocumentStore(), 42) {
+            @Override
+            public void dispose() {}
+        };
+        store = new DocumentMK.Builder().clock(clock).setLeaseCheckMode(LeaseCheckMode.DISABLED)
+                .setDocumentStore(fds).setAsyncDelay(0).getNodeStore();
+
         assertTrue(store.getDocumentStore() instanceof FailingDocumentStore);
+
         MongoTestUtils.setReadPreference(store, ReadPreference.primary());
         gc = store.getVersionGarbageCollector();
+
         //1. Create nodes with properties
         NodeBuilder b1 = store.getRoot().builder();
         // Add property to node & save
@@ -489,25 +493,26 @@ public class VersionGarbageCollectorIT {
         //3. Check that deleted property does get collected again
         // increment the clock again by more than 2 hours + delta
         clock.waitUntil(clock.getTime() + HOURS.toMillis(maxAge*2) + delta);
-        gc.setOptions(gc.getOptions().withMaxIterations(1));
 
-        ((FailingDocumentStore) store.getDocumentStore()).fail().after(0).eternally();
+        fds.fail().after(0).eternally();
         try {
             store.dispose();
             fail("dispose() must fail with an exception");
         } catch (DocumentStoreException e) {
             // expected
         }
-        ((FailingDocumentStore) store.getDocumentStore()).fail().never();
+        fds.fail().never();
 
         // create new store
         store = new DocumentMK.Builder().clock(clock).setLeaseCheckMode(LeaseCheckMode.DISABLED)
-                .setDocumentStore(new FailingDocumentStore(fixture.createDocumentStore(1), 42)).setAsyncDelay(0)
+                .setDocumentStore(fds).setAsyncDelay(0)
                 .getNodeStore();
         assertTrue(store.getDocumentStore() instanceof FailingDocumentStore);
         MongoTestUtils.setReadPreference(store, ReadPreference.primary());
         gc = store.getVersionGarbageCollector();
         store.runBackgroundOperations();
+        // enable the detailed gc flag
+        writeField(gc, "detailedGCEnabled", true, true);
 
         //4. Check that deleted property does get collected again
         // increment the clock again by more than 2 hours + delta


[jackrabbit-oak] 01/02: OAK-10304: log registration of invalid namespace names (#1000)

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

daim pushed a commit to branch OAK-10199
in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git

commit 9ba789dd1c998609c1318380dec328567897c29d
Author: Julian Reschke <re...@apache.org>
AuthorDate: Thu Jun 22 09:26:03 2023 +0200

    OAK-10304: log registration of invalid namespace names (#1000)
    
    * OAK-10304: work in progress
    
    * OAK-10304: work in progress
    
    * OAK-10304: add the log check
    
    * OAK-10304: improve imports, make utility method static
---
 .../plugins/name/ReadWriteNamespaceRegistry.java   | 16 ++++++++
 .../name/ReadWriteNamespaceRegistryTest.java       | 48 +++++++++++++++++-----
 2 files changed, 54 insertions(+), 10 deletions(-)

diff --git a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/name/ReadWriteNamespaceRegistry.java b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/name/ReadWriteNamespaceRegistry.java
index 186b10356c..adea1bbad6 100644
--- a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/name/ReadWriteNamespaceRegistry.java
+++ b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/name/ReadWriteNamespaceRegistry.java
@@ -25,6 +25,9 @@ import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Root;
 import org.apache.jackrabbit.oak.api.Tree;
+import org.apache.jackrabbit.oak.spi.namespace.NamespaceConstants;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 
 /**
@@ -33,6 +36,8 @@ import org.apache.jackrabbit.oak.api.Tree;
 public abstract class ReadWriteNamespaceRegistry
         extends ReadOnlyNamespaceRegistry {
 
+    private static final Logger LOG = LoggerFactory.getLogger(ReadWriteNamespaceRegistry.class);
+
     public ReadWriteNamespaceRegistry(Root root) {
         super(root);
     }
@@ -63,6 +68,17 @@ public abstract class ReadWriteNamespaceRegistry
     @Override
     public void registerNamespace(String prefix, String uri)
             throws RepositoryException {
+
+        // sanity check for legal namespace names (excluding the "internal"
+        // namespace, see OAK-74)
+        if (!NamespaceConstants.NAMESPACE_REP.equals(uri)) {
+            if (!uri.contains(":")) {
+                LOG.error("Registering invalid namespace name '" + uri + "' for prefix '" + prefix
+                        + "', please see https://developer.adobe.com/experience-manager/reference-materials/spec/jcr/2.0/3_Repository_Model.html#3.2.1%20Namespaces",
+                        new Exception("call stack"));
+            }
+        }
+
         if (prefix.isEmpty() && uri.isEmpty()) {
             return; // the default empty namespace is always registered
         } else if (prefix.isEmpty() || uri.isEmpty()) {
diff --git a/oak-it/src/test/java/org/apache/jackrabbit/oak/plugins/name/ReadWriteNamespaceRegistryTest.java b/oak-it/src/test/java/org/apache/jackrabbit/oak/plugins/name/ReadWriteNamespaceRegistryTest.java
index 9764a12c09..b8195be804 100644
--- a/oak-it/src/test/java/org/apache/jackrabbit/oak/plugins/name/ReadWriteNamespaceRegistryTest.java
+++ b/oak-it/src/test/java/org/apache/jackrabbit/oak/plugins/name/ReadWriteNamespaceRegistryTest.java
@@ -21,6 +21,8 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
+import java.util.List;
+
 import javax.jcr.NamespaceException;
 import javax.jcr.NamespaceRegistry;
 
@@ -29,9 +31,11 @@ import org.apache.jackrabbit.oak.Oak;
 import org.apache.jackrabbit.oak.OakBaseTest;
 import org.apache.jackrabbit.oak.api.ContentSession;
 import org.apache.jackrabbit.oak.api.Root;
+import org.apache.jackrabbit.oak.commons.junit.LogCustomizer;
 import org.apache.jackrabbit.oak.fixture.NodeStoreFixture;
 import org.apache.jackrabbit.oak.spi.security.OpenSecurityProvider;
 import org.junit.Test;
+import org.slf4j.event.Level;
 
 public class ReadWriteNamespaceRegistryTest extends OakBaseTest {
 
@@ -50,16 +54,7 @@ public class ReadWriteNamespaceRegistryTest extends OakBaseTest {
     public void testMappings() throws Exception {
         final ContentSession session = createContentSession();
         final Root root = session.getLatestRoot();
-        NamespaceRegistry r = new ReadWriteNamespaceRegistry(root) {
-            @Override
-            protected Root getWriteRoot() {
-                return session.getLatestRoot();
-            }
-            @Override
-            protected void refresh() {
-                root.refresh();
-            }
-        };
+        NamespaceRegistry r = getNamespaceRegistry(session, root);
 
         assertEquals("", r.getURI(""));
         assertEquals("http://www.jcp.org/jcr/1.0", r.getURI("jcr"));
@@ -90,4 +85,37 @@ public class ReadWriteNamespaceRegistryTest extends OakBaseTest {
             // expected
         }
     }
+
+    @Test
+    public void testInvalidNamespace() throws Exception {
+        final ContentSession session = createContentSession();
+        final Root root = session.getLatestRoot();
+        NamespaceRegistry r = getNamespaceRegistry(session, root);
+
+        LogCustomizer customLogs = LogCustomizer.forLogger("org.apache.jackrabbit.oak.plugins.name.ReadWriteNamespaceRegistry").enable(Level.ERROR).create();
+        try {
+            customLogs.starting();
+            r.registerNamespace("foo", "example.com");
+            r.unregisterNamespace("foo");
+            List<String> myLogs = customLogs.getLogs();
+            assertEquals(1, myLogs.size());
+            assertTrue(myLogs.get(0).contains("Registering invalid namespace name 'example.com' for prefix 'foo', please see"));
+        }
+        finally {
+            customLogs.finished();
+        }
+    }
+
+    private static NamespaceRegistry getNamespaceRegistry(ContentSession session, Root root) {
+        return new ReadWriteNamespaceRegistry(root) {
+            @Override
+            protected Root getWriteRoot() {
+                return session.getLatestRoot();
+            }
+            @Override
+            protected void refresh() {
+                root.refresh();
+            }
+        };
+    }
 }