Skip to content

Commit

Permalink
ISPN-10813 File Stores should notify user of being segmented can use …
Browse files Browse the repository at this point in the history
…many file descriptors
  • Loading branch information
wburns authored and ryanemerson committed Oct 24, 2019
1 parent b442f1b commit 7a39b69
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 0 deletions.
@@ -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.
Expand All @@ -19,6 +23,8 @@
public class SingleFileStoreConfigurationBuilder
extends AbstractStoreConfigurationBuilder<SingleFileStoreConfiguration, SingleFileStoreConfigurationBuilder> implements ConfigurationBuilderInfo {

private static boolean NOTIFIED_SEGMENTED;

public SingleFileStoreConfigurationBuilder(PersistenceConfigurationBuilder builder) {
this(builder, SingleFileStoreConfiguration.attributeDefinitionSet());
}
Expand Down Expand Up @@ -85,6 +91,16 @@ public SingleFileStoreConfigurationBuilder fragmentationFactor(float fragmentati
return this;
}

@Override
public void validate() {
Attribute<Boolean> 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);
Expand Down
4 changes: 4 additions & 0 deletions core/src/main/java/org/infinispan/util/logging/Log.java
Expand Up @@ -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);
}
5 changes: 5 additions & 0 deletions documentation/src/main/asciidoc/topics/upgrading.adoc
Expand Up @@ -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.
Expand Down
@@ -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;

Expand All @@ -9,19 +10,22 @@

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;

/**
* @author Radim Vansa &lt;rvansa@redhat.com&gt;
*/
public class SoftIndexFileStoreConfigurationBuilder extends AbstractStoreConfigurationBuilder<SoftIndexFileStoreConfiguration, SoftIndexFileStoreConfigurationBuilder> 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();
Expand Down Expand Up @@ -170,6 +174,11 @@ public SoftIndexFileStoreConfigurationBuilder self() {

@Override
protected void validate(boolean skipClassChecks) {
Attribute<Boolean> 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();
Expand Down

0 comments on commit 7a39b69

Please sign in to comment.