From 7a39b69b5c50c111ce46145859b6880c8daf5842 Mon Sep 17 00:00:00 2001 From: William Burns Date: Wed, 23 Oct 2019 17:14:17 -0400 Subject: [PATCH] ISPN-10813 File Stores should notify user of being segmented can use many file descriptors --- .../SingleFileStoreConfigurationBuilder.java | 16 ++++++++++++++++ .../java/org/infinispan/util/logging/Log.java | 4 ++++ .../src/main/asciidoc/topics/upgrading.adoc | 5 +++++ .../SoftIndexFileStoreConfigurationBuilder.java | 9 +++++++++ 4 files changed, 34 insertions(+) diff --git a/core/src/main/java/org/infinispan/configuration/cache/SingleFileStoreConfigurationBuilder.java b/core/src/main/java/org/infinispan/configuration/cache/SingleFileStoreConfigurationBuilder.java index d62a44dcc7b3..150f14831a72 100644 --- a/core/src/main/java/org/infinispan/configuration/cache/SingleFileStoreConfigurationBuilder.java +++ b/core/src/main/java/org/infinispan/configuration/cache/SingleFileStoreConfigurationBuilder.java @@ -1,14 +1,18 @@ package org.infinispan.configuration.cache; +import static org.infinispan.configuration.cache.AbstractStoreConfiguration.SEGMENTED; import static org.infinispan.configuration.cache.SingleFileStoreConfiguration.FRAGMENTATION_FACTOR; import static org.infinispan.configuration.cache.SingleFileStoreConfiguration.LOCATION; import static org.infinispan.configuration.cache.SingleFileStoreConfiguration.MAX_ENTRIES; import org.infinispan.commons.configuration.Builder; import org.infinispan.commons.configuration.ConfigurationBuilderInfo; +import org.infinispan.commons.configuration.attributes.Attribute; import org.infinispan.commons.configuration.attributes.AttributeSet; import org.infinispan.commons.configuration.elements.ElementDefinition; import org.infinispan.configuration.global.GlobalConfiguration; +import org.infinispan.persistence.file.SingleFileStore; +import org.infinispan.util.logging.Log; /** * Single file cache store configuration builder. @@ -19,6 +23,8 @@ public class SingleFileStoreConfigurationBuilder extends AbstractStoreConfigurationBuilder implements ConfigurationBuilderInfo { + private static boolean NOTIFIED_SEGMENTED; + public SingleFileStoreConfigurationBuilder(PersistenceConfigurationBuilder builder) { this(builder, SingleFileStoreConfiguration.attributeDefinitionSet()); } @@ -85,6 +91,16 @@ public SingleFileStoreConfigurationBuilder fragmentationFactor(float fragmentati return this; } + @Override + public void validate() { + Attribute segmentedAttribute = attributes.attribute(SEGMENTED); + if ((!segmentedAttribute.isModified() || segmentedAttribute.get()) && !NOTIFIED_SEGMENTED) { + NOTIFIED_SEGMENTED = true; + Log.CONFIG.segmentedStoreUsesManyFileDescriptors(SingleFileStore.class.getSimpleName()); + } + super.validate(); + } + @Override public void validate(GlobalConfiguration globalConfig) { super.validate(globalConfig); diff --git a/core/src/main/java/org/infinispan/util/logging/Log.java b/core/src/main/java/org/infinispan/util/logging/Log.java index 61402d13615a..521f778f0ddb 100644 --- a/core/src/main/java/org/infinispan/util/logging/Log.java +++ b/core/src/main/java/org/infinispan/util/logging/Log.java @@ -1915,4 +1915,8 @@ CacheConfigurationException offHeapMemoryEvictionSizeNotLargeEnoughForAddresses( @Message(value = "Invalid cache loader configuration for '%s'. This implementation does not support being segmented!", id = 563) CacheConfigurationException storeDoesNotSupportBeingSegmented(String name); + + @LogMessage(level = WARN) + @Message(value = "Configured store '%s' is segmented and may use a large number of file descriptors", id = 564) + void segmentedStoreUsesManyFileDescriptors(String storeName); } diff --git a/documentation/src/main/asciidoc/topics/upgrading.adoc b/documentation/src/main/asciidoc/topics/upgrading.adoc index 23ca27e5636a..a137649645ee 100644 --- a/documentation/src/main/asciidoc/topics/upgrading.adoc +++ b/documentation/src/main/asciidoc/topics/upgrading.adoc @@ -42,6 +42,11 @@ being segmented, which will result in a configuration exception being thrown at position is to use segmented stores when possible to increase cache wide performance and reduce memory requirements for various operations including state transfer. +The file based stores (SingleFileStore and SoftIndexFileStore) both support being segmented, but their +current implementation requires opening file descriptors based on how many segments there are. This may +cause issues in some configurations and users should be aware. Infinispan will print a single WARN message +when such a configuration is found. + == Hot Rod 3.0 Older versions of the Hot Rod protocol treated expiration values greater than the number of milliseconds in 30 days as Unix time. Starting with Hot Rod 3.0 this adjustment no longer happens and expiration is taken literally. diff --git a/persistence/soft-index/src/main/java/org/infinispan/persistence/sifs/configuration/SoftIndexFileStoreConfigurationBuilder.java b/persistence/soft-index/src/main/java/org/infinispan/persistence/sifs/configuration/SoftIndexFileStoreConfigurationBuilder.java index 760f18ddf602..60153087535f 100644 --- a/persistence/soft-index/src/main/java/org/infinispan/persistence/sifs/configuration/SoftIndexFileStoreConfigurationBuilder.java +++ b/persistence/soft-index/src/main/java/org/infinispan/persistence/sifs/configuration/SoftIndexFileStoreConfigurationBuilder.java @@ -1,5 +1,6 @@ package org.infinispan.persistence.sifs.configuration; +import static org.infinispan.configuration.cache.AbstractStoreConfiguration.SEGMENTED; import static org.infinispan.persistence.sifs.configuration.SoftIndexFileStoreConfiguration.COMPACTION_THRESHOLD; import static org.infinispan.persistence.sifs.configuration.SoftIndexFileStoreConfiguration.OPEN_FILES_LIMIT; @@ -9,12 +10,14 @@ import org.infinispan.commons.configuration.Builder; import org.infinispan.commons.configuration.ConfigurationBuilderInfo; +import org.infinispan.commons.configuration.attributes.Attribute; import org.infinispan.commons.configuration.attributes.AttributeSet; import org.infinispan.commons.configuration.elements.ElementDefinition; import org.infinispan.configuration.cache.AbstractStoreConfigurationBuilder; import org.infinispan.configuration.cache.PersistenceConfigurationBuilder; import org.infinispan.configuration.global.GlobalStateConfiguration; import org.infinispan.persistence.sifs.Log; +import org.infinispan.persistence.sifs.SoftIndexFileStore; import org.infinispan.util.logging.LogFactory; /** @@ -22,6 +25,7 @@ */ public class SoftIndexFileStoreConfigurationBuilder extends AbstractStoreConfigurationBuilder implements ConfigurationBuilderInfo { private static final Log log = LogFactory.getLog(SoftIndexFileStoreConfigurationBuilder.class, Log.class); + private static boolean NOTIFIED_SEGMENTED; private final IndexConfigurationBuilder index = new IndexConfigurationBuilder(); private final DataConfigurationBuilder data = new DataConfigurationBuilder(); @@ -170,6 +174,11 @@ public SoftIndexFileStoreConfigurationBuilder self() { @Override protected void validate(boolean skipClassChecks) { + Attribute segmentedAttribute = attributes.attribute(SEGMENTED); + if ((!segmentedAttribute.isModified() || segmentedAttribute.get()) && !NOTIFIED_SEGMENTED) { + NOTIFIED_SEGMENTED = true; + org.infinispan.util.logging.Log.CONFIG.segmentedStoreUsesManyFileDescriptors(SoftIndexFileStore.class.getSimpleName()); + } super.validate(skipClassChecks); index.validate(); double compactionThreshold = attributes.attribute(COMPACTION_THRESHOLD).get();