Ehcache - java.io.EOFException для постоянного кеша диска для операции removeAll - PullRequest
0 голосов
/ 11 марта 2019

Мы используем ehcache в нашем приложении весенней загрузки.Наша весенняя загрузочная версия 2.0.3.RELEASE и spring-boot-starter-cache 2.0.3.RELEASE использует ehcache 3.5.2.

Нашей мотивацией для использования ehcache было то, что оно совместимо с jsr107 и обеспечивает offheapsupport.

Ниже приведен наш весенний конфиг:

@Configuration
@ConditionalOnWebApplication
@EnableCaching
public class CacheConfig {
    @Autowired
    private ApplicationContext context;

    @Bean
    public JCacheManagerFactoryBean jCacheManagerFactoryBean() throws IOException {
        JCacheManagerFactoryBean jCacheManagerFactoryBean = new JCacheManagerFactoryBean();
        Resource resource = context.getResource("classpath:mts/ehcache.xml");
        jCacheManagerFactoryBean.setCacheManagerUri(resource.getURI());
        return jCacheManagerFactoryBean;
    }

    @Bean
    public JCacheCacheManager ehCacheCacheManager() throws IOException {
        Properties props = System.getProperties();
        props.setProperty(Caching.JAVAX_CACHE_CACHING_PROVIDER, "org.ehcache.jsr107.EhcacheCachingProvider");
        JCacheCacheManager jCacheCacheManager = new JCacheCacheManager();
        jCacheCacheManager.setCacheManager(jCacheManagerFactoryBean().getObject());
        jCacheCacheManager.setTransactionAware(true);
        return jCacheCacheManager;

    }

}

Проблема, с которой мы сталкиваемся в производственной среде, заключается в том, что для постоянного кеша с умеренно большими размерами у нас есть следующее java.io.EOFExceptionошибка в операции removeAll:

Error : RuntimeException: java.io.EOFException 
java.lang.RuntimeException: java.io.EOFException
        at org.terracotta.offheapstore.disk.storage.FileBackedStorageEngine$FileChunk.readKeyBuffer(FileBackedStorageEngine.java:541) ~[ehcache-3.5.2.jar!/:3.5.2 7941fa2573343b31ae56a12564404552c6d6eff0]
        at org.terracotta.offheapstore.disk.storage.FileBackedStorageEngine.readKeyBuffer(FileBackedStorageEngine.java:265) ~[ehcache-3.5.2.jar!/:3.5.2 7941fa2573343b31ae56a12564404552c6d6eff0]
        at org.terracotta.offheapstore.storage.PortabilityBasedStorageEngine.readKey(PortabilityBasedStorageEngine.java:119) ~[ehcache-3.5.2.jar!/:3.5.2 7941fa2573343b31ae56a12564404552c6d6eff0]
        at org.terracotta.offheapstore.OffHeapHashMap$DirectEntry.<init>(OffHeapHashMap.java:1540) ~[ehcache-3.5.2.jar!/:3.5.2 7941fa2573343b31ae56a12564404552c6d6eff0]
        at org.terracotta.offheapstore.OffHeapHashMap$EntryIterator.create(OffHeapHashMap.java:1518) ~[ehcache-3.5.2.jar!/:3.5.2 7941fa2573343b31ae56a12564404552c6d6eff0]
        at org.terracotta.offheapstore.OffHeapHashMap$EntryIterator.create(OffHeapHashMap.java:1511) ~[ehcache-3.5.2.jar!/:3.5.2 7941fa2573343b31ae56a12564404552c6d6eff0]
        at org.terracotta.offheapstore.OffHeapHashMap$HashIterator.next(OffHeapHashMap.java:1407) ~[ehcache-3.5.2.jar!/:3.5.2 7941fa2573343b31ae56a12564404552c6d6eff0]
        at org.terracotta.offheapstore.AbstractLockedOffHeapHashMap$LockedEntryIterator.next(AbstractLockedOffHeapHashMap.java:399) ~[ehcache-3.5.2.jar!/:3.5.2 7941fa2573343b31ae56a12564404552c6d6eff0]
        at org.terracotta.offheapstore.AbstractLockedOffHeapHashMap$LockedEntryIterator.next(AbstractLockedOffHeapHashMap.java:392) ~[ehcache-3.5.2.jar!/:3.5.2 7941fa2573343b31ae56a12564404552c6d6eff0]
        at org.terracotta.offheapstore.concurrent.AbstractConcurrentOffHeapMap$AggregateIterator.next(AbstractConcurrentOffHeapMap.java:553) ~[ehcache-3.5.2.jar!/:3.5.2 7941fa2573343b31ae56a12564404552c6d6eff0]
        at org.ehcache.impl.internal.store.offheap.AbstractOffHeapStore$1.next(AbstractOffHeapStore.java:499) ~[ehcache-3.5.2.jar!/:3.5.2 7941fa2573343b31ae56a12564404552c6d6eff0]
        at org.ehcache.impl.internal.store.offheap.AbstractOffHeapStore$1.next(AbstractOffHeapStore.java:489) ~[ehcache-3.5.2.jar!/:3.5.2 7941fa2573343b31ae56a12564404552c6d6eff0]
        at org.ehcache.core.EhcacheBase$Jsr107CacheBase.removeAll(EhcacheBase.java:708) ~[ehcache-3.5.2.jar!/:3.5.2 7941fa2573343b31ae56a12564404552c6d6eff0]
        at org.ehcache.jsr107.Eh107Cache.removeAll(Eh107Cache.java:304) ~[ehcache-3.5.2.jar!/:3.5.2 7941fa2573343b31ae56a12564404552c6d6eff0]
        at com.mycompany.myproject.services.cache.service.impl.CacheService.doClearCacheWithName(CacheService.java:56) ~[MyProjectServicesCache_classes.jar!/:?]  

В коде, вызывающем операцию removeAll, нет ничего особенного.Просто получает кеш с именем и вызывает очистку всех:

private void doClearCacheWithName(String cacheName) {
    Cache<Object, Object> cache = cacheManager.getCache(cacheName);
    if (cache == null) {
        throw new MyProjectException(String.format("Cache with name : %s does not exist!", cacheName));
    }
    logger.info(String.format("Clearing cache with name : %s", cacheName));
    cache.removeAll();
}

Вот производственный конфиг для нашего BigCache:

<cache alias="ourBigCache">
        <expiry>
            <ttl unit="seconds">21600</ttl> 
        </expiry>
        <resources>
            <heap unit="entries">1000</heap>
            <disk unit="MB">4096</disk>
        </resources>
    </cache>

Мы не смогли воспроизвести это ни локально, ни для тестовой среды.

Пожалуйста, обратите внимание, что этот кеш имеет очень большое использование (количество операций чтения очень велико в производстве), но я думаю, что это не должно иметь никакого значения.

Я не смог найти ни одной похожей проблемы.Есть некоторые очень старые проблемы с дисками, которые упоминаются, но они слишком старые и не похожи:

https://sourceforge.net/p/ehcache/discussion/322278/thread/e7a62df3/ http://forums.terracotta.org/forums/posts/list/2694.page

Любая помощь будет принята с благодарностью.

Привет

1 Ответ

1 голос
/ 11 марта 2019

Скопировано из моего ответа на ehcache-users:

Скорее всего, это просто еще один симптом https://github.com/ehcache/ehcache3/issues/2542, который был исправлен в 74239a93e14eb7477841fffa36c971ef9e930686

К сожалению, это исправление еще нигде не объединено. Если вы хотите поднять это, вы можете сократить свою собственную сборку мастера (что, вероятно, было бы неплохо проверить). В противном случае вам придется ждать первого точечного релиза в строке 3.7 (временная шкала неизвестна на данный момент).

Chris

...