Author: frm
Date: Tue Jan 16 12:46:44 2018
New Revision: 1821240

URL: http://svn.apache.org/viewvc?rev=1821240&view=rev
Log:
OAK-7158 - Prevent users from changing the number of retained generations

The number of retained generations should not be set to a value different than
two. Doing otherwiswe could cause data loss due to the way cleanup works. To
prevent misconfigurations, the OSGi and the MBean interfaces prevent users from
setting the number of retained generations. If users try to change the number
of retained generations, a warning message is printed and the number of
retained generations is kept unchanged.

Modified:
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreService.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/compaction/SegmentGCOptions.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/compaction/SegmentRevisionGCMBean.java

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreService.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreService.java?rev=1821240&r1=1821239&r2=1821240&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreService.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreService.java
 Tue Jan 16 12:46:44 2018
@@ -26,7 +26,6 @@ import static org.apache.jackrabbit.oak.
 import static org.apache.jackrabbit.oak.commons.PropertiesUtil.toLong;
 import static 
org.apache.jackrabbit.oak.osgi.OsgiUtil.lookupConfigurationThenFramework;
 import static 
org.apache.jackrabbit.oak.plugins.blob.datastore.SharedDataStoreUtils.isShared;
-import static 
org.apache.jackrabbit.oak.spi.cluster.ClusterRepositoryInfo.getOrCreateId;
 import static 
org.apache.jackrabbit.oak.segment.CachingSegmentReader.DEFAULT_STRING_CACHE_MB;
 import static 
org.apache.jackrabbit.oak.segment.CachingSegmentReader.DEFAULT_TEMPLATE_CACHE_MB;
 import static 
org.apache.jackrabbit.oak.segment.SegmentCache.DEFAULT_SEGMENT_CACHE_MB;
@@ -69,6 +68,7 @@ import static org.apache.jackrabbit.oak.
 import static 
org.apache.jackrabbit.oak.segment.file.FileStoreBuilder.DEFAULT_MAX_FILE_SIZE;
 import static 
org.apache.jackrabbit.oak.segment.file.FileStoreBuilder.fileStoreBuilder;
 import static 
org.apache.jackrabbit.oak.spi.blob.osgi.SplitBlobStoreService.ONLY_STANDALONE_TARGET;
+import static 
org.apache.jackrabbit.oak.spi.cluster.ClusterRepositoryInfo.getOrCreateId;
 
 import java.io.ByteArrayInputStream;
 import java.io.Closeable;
@@ -81,6 +81,8 @@ import java.util.concurrent.TimeUnit;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
+import com.google.common.base.Supplier;
+import com.google.common.io.Closer;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.ConfigurationPolicy;
@@ -97,7 +99,6 @@ import org.apache.jackrabbit.oak.api.jmx
 import org.apache.jackrabbit.oak.api.jmx.FileStoreBackupRestoreMBean;
 import org.apache.jackrabbit.oak.backup.impl.FileStoreBackupRestoreImpl;
 import org.apache.jackrabbit.oak.cache.CacheStats;
-import org.apache.jackrabbit.oak.spi.commit.ObserverTracker;
 import org.apache.jackrabbit.oak.osgi.OsgiWhiteboard;
 import org.apache.jackrabbit.oak.plugins.blob.BlobGC;
 import org.apache.jackrabbit.oak.plugins.blob.BlobGCMBean;
@@ -107,7 +108,6 @@ import org.apache.jackrabbit.oak.plugins
 import org.apache.jackrabbit.oak.plugins.blob.SharedDataStore;
 import org.apache.jackrabbit.oak.plugins.blob.datastore.BlobIdTracker;
 import 
org.apache.jackrabbit.oak.plugins.blob.datastore.SharedDataStoreUtils.SharedStoreRecordType;
-import org.apache.jackrabbit.oak.spi.cluster.ClusterRepositoryInfo;
 import org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions;
 import org.apache.jackrabbit.oak.segment.compaction.SegmentRevisionGC;
 import org.apache.jackrabbit.oak.segment.compaction.SegmentRevisionGCMBean;
@@ -119,6 +119,9 @@ import org.apache.jackrabbit.oak.segment
 import org.apache.jackrabbit.oak.segment.file.MetricsIOMonitor;
 import org.apache.jackrabbit.oak.spi.blob.BlobStore;
 import org.apache.jackrabbit.oak.spi.blob.GarbageCollectableBlobStore;
+import org.apache.jackrabbit.oak.spi.cluster.ClusterRepositoryInfo;
+import org.apache.jackrabbit.oak.spi.commit.ObserverTracker;
+import org.apache.jackrabbit.oak.spi.descriptors.GenericDescriptors;
 import org.apache.jackrabbit.oak.spi.gc.GCMonitor;
 import org.apache.jackrabbit.oak.spi.gc.GCMonitorTracker;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
@@ -131,15 +134,11 @@ import org.apache.jackrabbit.oak.spi.whi
 import org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardUtils;
 import org.apache.jackrabbit.oak.stats.Clock;
 import org.apache.jackrabbit.oak.stats.StatisticsProvider;
-import org.apache.jackrabbit.oak.spi.descriptors.GenericDescriptors;
 import org.osgi.framework.Constants;
 import org.osgi.service.component.ComponentContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Supplier;
-import com.google.common.io.Closer;
-
 /**
  * An OSGi wrapper for the segment node store.
  */
@@ -277,8 +276,9 @@ public class SegmentNodeStoreService {
             intValue = RETAINED_GENERATIONS_DEFAULT,
             label = "Compaction retained generations",
             description = "Number of segment generations to retain during 
garbage collection. " +
-                    "Must be set to at least 2. " +
-                    "Default value is '" + RETAINED_GENERATIONS_DEFAULT + "'."
+                "The number of generations defaults to " + 
RETAINED_GENERATIONS_DEFAULT + " and " +
+                "can't be changed. This configuration option is considered 
deprecated " +
+                "and will be removed in the future."
     )
     public static final String RETAINED_GENERATIONS = 
"compaction.retainedGenerations";
 
@@ -432,6 +432,14 @@ public class SegmentNodeStoreService {
                     + "Please use 'compaction.sizeDeltaEstimation' instead and 
"
                     + "'compaction.disableEstimation' to disable estimation.");
         }
+        if (configuration.getRetainedGenerations() != 
RETAINED_GENERATIONS_DEFAULT) {
+            log.warn(
+                "The number of retained generations defaults to {} and can't 
be " +
+                    "changed. This configuration option is considered 
deprecated " +
+                    "and will be removed in the future.",
+                RETAINED_GENERATIONS_DEFAULT
+            );
+        }
         SegmentGCOptions gcOptions = new 
SegmentGCOptions(configuration.getPauseCompaction(), 
configuration.getRetryCount(), configuration.getForceCompactionTimeout())
                 .setRetainedGenerations(configuration.getRetainedGenerations())
                 
.setGcSizeDeltaEstimation(configuration.getSizeDeltaEstimation())

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/compaction/SegmentGCOptions.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/compaction/SegmentGCOptions.java?rev=1821240&r1=1821239&r2=1821240&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/compaction/SegmentGCOptions.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/compaction/SegmentGCOptions.java
 Tue Jan 16 12:46:44 2018
@@ -19,8 +19,6 @@
 
 package org.apache.jackrabbit.oak.segment.compaction;
 
-import static com.google.common.base.Preconditions.checkArgument;
-
 import javax.annotation.Nonnull;
 
 /**
@@ -196,7 +194,6 @@ public class SegmentGCOptions {
 
     /**
      * Number of segment generations to retain.
-     * @see #setRetainedGenerations(int)
      * @return  number of gc generations.
      */
     public int getRetainedGenerations() {
@@ -213,8 +210,6 @@ public class SegmentGCOptions {
      * @throws IllegalArgumentException if {@code retainGenerations < 2}
      */
     public SegmentGCOptions setRetainedGenerations(int retainedGenerations) {
-        checkArgument(retainedGenerations > 1,
-                "RetainedGenerations must not be below 2. Got %s", 
retainedGenerations);
         this.retainedGenerations = retainedGenerations;
         return this;
     }

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/compaction/SegmentRevisionGCMBean.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/compaction/SegmentRevisionGCMBean.java?rev=1821240&r1=1821239&r2=1821240&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/compaction/SegmentRevisionGCMBean.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/compaction/SegmentRevisionGCMBean.java
 Tue Jan 16 12:46:44 2018
@@ -20,19 +20,24 @@
 package org.apache.jackrabbit.oak.segment.compaction;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static 
org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions.RETAINED_GENERATIONS_DEFAULT;
 
 import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
 
 import org.apache.jackrabbit.oak.commons.jmx.AnnotatedStandardMBean;
+import org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions.GCType;
 import org.apache.jackrabbit.oak.segment.file.FileStore;
 import org.apache.jackrabbit.oak.segment.file.FileStoreGCMonitor;
-import org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions.GCType;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class SegmentRevisionGCMBean
         extends AnnotatedStandardMBean
         implements SegmentRevisionGC {
 
+    private static final Logger log = 
LoggerFactory.getLogger(SegmentRevisionGCMBean.class);
+
     @Nonnull
     private final FileStore fileStore;
 
@@ -91,7 +96,14 @@ public class SegmentRevisionGCMBean
 
     @Override
     public void setRetainedGenerations(int retainedGenerations) {
-        gcOptions.setRetainedGenerations(retainedGenerations);
+        if (retainedGenerations != RETAINED_GENERATIONS_DEFAULT) {
+            log.warn(
+                "The number of retained generations defaults to {} and can't 
be " +
+                    "changed. This configuration option is considered 
deprecated " +
+                    "and will be removed in the future.",
+                RETAINED_GENERATIONS_DEFAULT
+            );
+        }
     }
 
     @Override


Reply via email to