javaxmlehcacheterracotta

InvalidServerSideConfigurationException when creating cache using XML


I'm new with terracotta. I want to create a clustered server cache but found some difficulties with configuration files.

Here is my tc-config-terracotta.xml file (with which I launch terracotta server)

<?xml version="1.0" encoding="UTF-8"?>
<tc-config xmlns="http://www.terracotta.org/config"
    xmlns:ohr="http://www.terracotta.org/config/offheap-resource">

    <servers>
        <server host="localhost" name="clustered">
            <logs>/path/log/terracotta/server-logs</logs>
        </server>
    </servers>
    <plugins>
        <config>
            <ohr:offheap-resources>
                <ohr:resource name="primary-server-resource" unit="MB">128
                </ohr:resource>
                <ohr:resource name="secondary-server-resource" unit="MB">96
                </ohr:resource>
            </ohr:offheap-resources>
        </config>
    </plugins>
</tc-config>

I used the ehcache-clustered-3.3.1-kit to launch the server.

$myPrompt/some/dir/with/ehcache/clustered/server/bin>./start-tc-server.sh -f /path/to/conf/tc-config-terracotta.xml

No problem for the server to start

2017-06-01 11:29:14,052 INFO - New logging session started.
2017-06-01 11:29:14,066 INFO - Terracotta 5.2.2, as of 2017-03-29 at 15:26:20 PDT (Revision 397a456cfe4b8188dfe8b017a5c14346f79c2fcf from UNKNOWN)
2017-06-01 11:29:14,067 INFO - PID is 6114
2017-06-01 11:29:14,697 INFO - Successfully loaded base configuration from file at '/path/to/conf/tc-config-terracotta.xml'.
2017-06-01 11:29:14,757 INFO - Available Max Runtime Memory: 1822MB
2017-06-01 11:29:14,836 INFO - Log file: '/path/log/terracotta/server-logs/terracotta-server.log'.
2017-06-01 11:29:15,112 INFO - Becoming State[ ACTIVE-COORDINATOR ]
2017-06-01 11:29:15,129 INFO - Terracotta Server instance has started up as ACTIVE node on 0:0:0:0:0:0:0:0:9510 successfully, and is now ready for work.

Here is the ehcache-terracotta.xml configuration file

<ehcache:config xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
    xmlns:terracotta='http://www.ehcache.org/v3/clustered' 
    xmlns:ehcache='http://www.ehcache.org/v3'
    xsi:schemaLocation="http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.3.xsd
    http://www.ehcache.org/v3/clustered http://www.ehcache.org/schema/ehcache-clustered-ext-3.3.xsd">

    <ehcache:service>
        <terracotta:cluster>
            <terracotta:connection url="terracotta://localhost:9510/clustered" />
            <terracotta:server-side-config
                auto-create="true">
                <terracotta:default-resource from="primary-server-resource" />
            </terracotta:server-side-config>
        </terracotta:cluster>
    </ehcache:service>

    <ehcache:cache alias="myTest">
        <ehcache:key-type>java.lang.String</ehcache:key-type>
        <ehcache:value-type>java.lang.String</ehcache:value-type>
        <ehcache:resources>
            <terracotta:clustered-dedicated unit="MB">10
            </terracotta:clustered-dedicated>
        </ehcache:resources>
        <terracotta:clustered-store consistency="strong" />
    </ehcache:cache>
</ehcache:config>

I have a class to test the conf:

import java.net.URL;

import org.ehcache.Cache;
import org.ehcache.CacheManager;
import org.ehcache.config.Configuration;
import org.ehcache.config.builders.CacheManagerBuilder;
import org.ehcache.xml.XmlConfiguration;

public class TestTerracottaCacheManager
{

   private static TestTerracottaCacheManager cacheManager = null;

   private CacheManager cm;

   private Cache<Object, Object> cache;

   private static final String DEFAULT_CACHE_NAME = "myTest";

   private String cacheName;

   public static TestTerracottaCacheManager getInstance()
   {
      if (cacheManager == null)
      {
         cacheManager = new TestTerracottaCacheManager();
      }
      return cacheManager;
   }

   private TestTerracottaCacheManager()
   {
      // 1. Create a cache manager
      final URL url =
         TestTerracottaCacheManager.class.getResource("/ehcache-terracotta.xml");
      System.out.println(url);
      Configuration xmlConfig = new XmlConfiguration(url);
      cm = CacheManagerBuilder.newCacheManager(xmlConfig);
      cm.init();
      intializeCache();
   }

   private void intializeCache()
   {
      // 2. Get a cache called "cache1", declared in ehcache.xml
      cache = cm.getCache(cacheName == null ? DEFAULT_CACHE_NAME : cacheName,
            Object.class, Object.class);
      if (cache == null)
      {
         throw new NullPointerException();
      }
   }

   public void put(Object key, Object value)
   {
      cache.put(key, value);
   }

   public Object get(String key)
   {
      // 5. Print out the element
      Object ele = cache.get(key);
      return ele;
   }

   public boolean isKeyInCache(Object key)
   {
      return cache.containsKey(key);
   }

   public void closeCache()
   {
      // 7. shut down the cache manager
      cm.close();
   }

   public static void main(String[] args)
   {
      TestTerracottaCacheManager testCache = TestTerracottaCacheManager.getInstance();
      testCache.put("titi", "1");
      System.out.println(testCache.get("titi"));
      testCache.closeCache();
   }

   public String getCacheName()
   {
      return cacheName;
   }

   public void setCacheName(String cacheName)
   {
      this.cacheName = cacheName;
   }
}

I've got an exception. Here it's the stack trace:

14:18:38.978 [main] ERROR org.ehcache.core.EhcacheManager - Initialize failed.
Exception in thread "main" org.ehcache.StateTransitionException: Unable to validate cluster tier manager for id clustered
    at org.ehcache.core.StatusTransitioner$Transition.failed(StatusTransitioner.java:235)
    at org.ehcache.core.EhcacheManager.init(EhcacheManager.java:587)
    at fr.test.cache.TestTerracottaCacheManager.<init>(TestTerracottaCacheManager.java:41)
    at fr.test.cache.TestTerracottaCacheManager.getInstance(TestTerracottaCacheManager.java:28)
    at fr.test.cache.TestTerracottaCacheManager.main(TestTerracottaCacheManager.java:81)
Caused by: org.ehcache.clustered.client.internal.ClusterTierManagerValidationException: Unable to validate cluster tier manager for id clusteredENS
    at org.ehcache.clustered.client.internal.ClusterTierManagerClientEntityFactory.retrieve(ClusterTierManagerClientEntityFactory.java:196)
    at org.ehcache.clustered.client.internal.service.DefaultClusteringService.autoCreateEntity(DefaultClusteringService.java:215)
    at org.ehcache.clustered.client.internal.service.DefaultClusteringService.start(DefaultClusteringService.java:148)
    at org.ehcache.core.internal.service.ServiceLocator.startAllServices(ServiceLocator.java:118)
    at org.ehcache.core.EhcacheManager.init(EhcacheManager.java:559)
    ... 3 more
Caused by: org.ehcache.clustered.common.internal.exceptions.InvalidServerSideConfigurationException: Default resource not aligned. Client: primary-server-resource Server: null
    at org.ehcache.clustered.common.internal.exceptions.InvalidServerSideConfigurationException.withClientStackTrace(InvalidServerSideConfigurationException.java:43)
    at org.ehcache.clustered.common.internal.exceptions.InvalidServerSideConfigurationException.withClientStackTrace(InvalidServerSideConfigurationException.java:22)
    at org.ehcache.clustered.common.internal.messages.ResponseCodec.decode(ResponseCodec.java:197)
    at org.ehcache.clustered.common.internal.messages.EhcacheCodec.decodeResponse(EhcacheCodec.java:110)
    at org.ehcache.clustered.common.internal.messages.EhcacheCodec.decodeResponse(EhcacheCodec.java:37)
    at com.tc.object.EntityClientEndpointImpl$InvocationBuilderImpl$1.getWithTimeout(EntityClientEndpointImpl.java:193)
    at com.tc.object.EntityClientEndpointImpl$InvocationBuilderImpl$1.getWithTimeout(EntityClientEndpointImpl.java:175)
    at org.ehcache.clustered.client.internal.SimpleClusterTierManagerClientEntity.waitFor(SimpleClusterTierManagerClientEntity.java:184)
    at org.ehcache.clustered.client.internal.SimpleClusterTierManagerClientEntity.invokeInternal(SimpleClusterTierManagerClientEntity.java:148)
    at org.ehcache.clustered.client.internal.SimpleClusterTierManagerClientEntity.validate(SimpleClusterTierManagerClientEntity.java:120)
    at org.ehcache.clustered.client.internal.ClusterTierManagerClientEntityFactory.retrieve(ClusterTierManagerClientEntityFactory.java:190)
    ... 7 more
Caused by: org.ehcache.clustered.common.internal.exceptions.InvalidServerSideConfigurationException: Default resource not aligned. Client: primary-server-resource Server: null
    at org.ehcache.clustered.server.EhcacheStateServiceImpl.checkConfigurationCompatibility(EhcacheStateServiceImpl.java:207)
    at org.ehcache.clustered.server.EhcacheStateServiceImpl.validate(EhcacheStateServiceImpl.java:194)
    at org.ehcache.clustered.server.ClusterTierManagerActiveEntity.validate(ClusterTierManagerActiveEntity.java:253)
    at org.ehcache.clustered.server.ClusterTierManagerActiveEntity.invokeLifeCycleOperation(ClusterTierManagerActiveEntity.java:203)
    at org.ehcache.clustered.server.ClusterTierManagerActiveEntity.invoke(ClusterTierManagerActiveEntity.java:147)
    at org.ehcache.clustered.server.ClusterTierManagerActiveEntity.invoke(ClusterTierManagerActiveEntity.java:57)
    at com.tc.objectserver.entity.ManagedEntityImpl.performAction(ManagedEntityImpl.java:741)
    at com.tc.objectserver.entity.ManagedEntityImpl.invoke(ManagedEntityImpl.java:488)
    at com.tc.objectserver.entity.ManagedEntityImpl.lambda$processInvokeRequest$2(ManagedEntityImpl.java:319)
    at com.tc.objectserver.entity.ManagedEntityImpl$SchedulingRunnable.run(ManagedEntityImpl.java:1048)
    at com.tc.objectserver.entity.RequestProcessor$EntityRequest.invoke(RequestProcessor.java:170)
    at com.tc.objectserver.entity.RequestProcessor$EntityRequest.run(RequestProcessor.java:161)
    at com.tc.objectserver.entity.RequestProcessorHandler.handleEvent(RequestProcessorHandler.java:27)
    at com.tc.objectserver.entity.RequestProcessorHandler.handleEvent(RequestProcessorHandler.java:23)
    at com.tc.async.impl.StageQueueImpl$HandledContext.runWithHandler(StageQueueImpl.java:502)
    at com.tc.async.impl.StageImpl$WorkerThread.run(StageImpl.java:192)

I think it's a problem in the XML files, but I'm not sure. Someone can help please?

Thanks


Solution

  • What the exception tells you is that the configuration of the clustered bits of your cache manager and cache differ between what the cluster knows and what the client ask.

    The most likely explanation is that you ran your client code once with a different config, realised there was an issue or just wanted to change something. And then tried to run the client without destroying the cahche manager on the cluster or restarting the server.

    You simply need to restart your server, to lose all clustered state since you want a different setup.