public PinnableSegment<K, V> newInstance() { StorageEngine<? super K, ? super V> storageEngine = storageEngineFactory.newInstance(); try { return new EhcacheSegment<>(tableSource, storageEngine, tableSize, evictionAdvisor, evictionListener); } catch (RuntimeException e) { storageEngine.destroy(); throw e; } }
private EhcacheConcurrentOffHeapClockCache<K, OffHeapValueHolder<V>> createBackingMap(long size, Serializer<K> keySerializer, Serializer<V> valueSerializer, SwitchableEvictionAdvisor<K, OffHeapValueHolder<V>> evictionAdvisor) { HeuristicConfiguration config = new HeuristicConfiguration(size); PageSource source = new UpfrontAllocatingPageSource(getBufferSource(), config.getMaximumSize(), config.getMaximumChunkSize(), config.getMinimumChunkSize()); Portability<K> keyPortability = new SerializerPortability<>(keySerializer); Portability<OffHeapValueHolder<V>> elementPortability = new OffHeapValueHolderPortability<>(valueSerializer); Factory<OffHeapBufferStorageEngine<K, OffHeapValueHolder<V>>> storageEngineFactory = OffHeapBufferStorageEngine.createFactory(PointerSize.INT, source, config .getSegmentDataPageSize(), keyPortability, elementPortability, false, true); Factory<? extends PinnableSegment<K, OffHeapValueHolder<V>>> segmentFactory = new EhcacheSegmentFactory<>( source, storageEngineFactory, config.getInitialSegmentTableSize(), evictionAdvisor, mapEvictionListener); return new EhcacheConcurrentOffHeapClockCache<>(evictionAdvisor, segmentFactory, config.getConcurrency()); }
@Override public void freeMapping(long encoding, int hash, boolean removal) { keyStorageEngine.free(keyEncoding(encoding)); valueStorageEngine.free(valueEncoding(encoding)); }
@SuppressWarnings("unchecked") @Override public V readValue(long encoding) { return (V) valueStorageEngine.read(valueEncoding(encoding)); }
@Override public boolean equalsValue(Object value, long encoding) { return valueStorage.equals(value, SplitStorageEngine.valueEncoding(encoding)); }
@Override public Long writeMapping(K key, V value, int hash, int metadata) { Integer keyEncoding = keyStorageEngine.write(key, hash); if (keyEncoding == null) { return null; } Integer valueEncoding = valueStorageEngine.write(value, hash); if (valueEncoding == null) { keyStorageEngine.free(keyEncoding); return null; } return encoding(keyEncoding, valueEncoding); }
@SuppressWarnings("unchecked") @Override public K readKey(long encoding, int hashCode) { return (K) keyStorageEngine.read(keyEncoding(encoding)); }
@Override public void freeMapping(long encoding, int hash, boolean removal) { valueStorage.free(SplitStorageEngine.valueEncoding(encoding)); }
@Override public boolean moved(long from, long to) { return owner.updateEncoding(readKeyHash(to), from, to, ~0); }
@Override public boolean equalsKey(Object key, long encoding) { return keyStorageEngine.equals(key, keyEncoding(encoding)); }
Portability<String> keyPortability = new SerializerPortability<>(keySerializer); Portability<String> elementPortability = new SerializerPortability<>(valueSerializer); Factory<OffHeapBufferStorageEngine<String, String>> storageEngineFactory = OffHeapBufferStorageEngine.createFactory(PointerSize.INT, pageSource, configuration.getInitialSegmentTableSize(), keyPortability, elementPortability, false, true); SwitchableEvictionAdvisor<String, String> wrappedEvictionAdvisor = new SwitchableEvictionAdvisor<String, String>() {
@Override public void freeMapping(long encoding, int hash, boolean removal) { keyStorageEngine.free(keyEncoding(encoding)); valueStorageEngine.free(valueEncoding(encoding)); }
@SuppressWarnings("unchecked") @Override public V readValue(long encoding) { return (V) valueStorageEngine.read(valueEncoding(encoding)); }
@Override public boolean equalsValue(Object value, long encoding) { return valueStorageEngine.equals(value, valueEncoding(encoding)); }
@SuppressWarnings("unchecked") @Override public K readKey(long encoding, int hashCode) { return (K) keyStorageEngine.read(keyEncoding(encoding)); }
@Override public void freeMapping(long encoding, int hash, boolean removal) { valueStorage.free(SplitStorageEngine.valueEncoding(encoding)); }
@Override public boolean moved(long from, long to) { return owner.updateEncoding(readKeyHash(to), from, to, ~0); }
Portability<String> keyPortability = new SerializerPortability<>(keySerializer); Portability<String> elementPortability = new SerializerPortability<>(valueSerializer); Factory<OffHeapBufferStorageEngine<String, String>> storageEngineFactory = OffHeapBufferStorageEngine.createFactory(PointerSize.INT, pageSource, configuration.getInitialSegmentTableSize(), keyPortability, elementPortability, false, true); SwitchableEvictionAdvisor<String, String> wrappedEvictionAdvisor = new SwitchableEvictionAdvisor<String, String>() {
@Override public V readValue(long encoding) { return valueStorage.read(SplitStorageEngine.valueEncoding(encoding)); }
@Override public boolean equalsValue(Object value, long encoding) { return valueStorageEngine.equals(value, valueEncoding(encoding)); }