/*
* Copyright Terracotta, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.ehcache.clustered.server;
import org.ehcache.clustered.common.internal.ServerStoreConfiguration;
import org.ehcache.clustered.common.internal.store.Chain;
import org.ehcache.clustered.server.offheap.OffHeapServerStore;
import org.ehcache.clustered.server.state.ResourcePageSource;
import org.terracotta.offheapstore.paging.PageSource;
import com.tc.classloader.CommonComponent;
import java.nio.ByteBuffer;
import java.util.AbstractList;
import java.util.List;
import java.util.Set;
@CommonComponent
public class ServerStoreImpl implements ServerSideServerStore {
private final ServerStoreConfiguration storeConfiguration;
private final ResourcePageSource pageSource;
private final OffHeapServerStore store;
public ServerStoreImpl(ServerStoreConfiguration storeConfiguration, ResourcePageSource pageSource, KeySegmentMapper mapper) {
this.storeConfiguration = storeConfiguration;
this.pageSource = pageSource;
this.store = new OffHeapServerStore(pageSource, mapper);
}
public void setEvictionListener(ServerStoreEvictionListener listener) {
store.setEvictionListener(listener);
}
/**
* Gets the {@link PageSource} providing storage for this {@code ServerStore}.
*
* @return the {@code PageSource} used by this {@code ServerStore}
*/
public PageSource getPageSource() {
return pageSource;
}
public ServerStoreConfiguration getStoreConfiguration() {
return storeConfiguration;
}
@Override
public Chain get(long key) {
return store.get(key);
}
@Override
public void append(long key, ByteBuffer payLoad) {
store.append(key, payLoad);
}
@Override
public Chain getAndAppend(long key, ByteBuffer payLoad) {
return store.getAndAppend(key, payLoad);
}
@Override
public void replaceAtHead(long key, Chain expect, Chain update) {
store.replaceAtHead(key, expect, update);
}
public void put(long key, Chain chain) {
store.put(key, chain);
}
@Override
public void clear() {
store.clear();
}
public void close() {
store.close();
}
@Override
public List<Set<Long>> getSegmentKeySets() {
return new AbstractList<Set<Long>>() {
@Override
public Set<Long> get(int index) {
return store.getSegments().get(index).keySet();
}
@Override
public int size() {
return store.getSegments().size();
}
};
}
// stats
@Override
public long getSize() {
return store.getSize();
}
@Override
public long getTableCapacity() {
return store.getTableCapacity();
}
@Override
public long getUsedSlotCount() {
return store.getUsedSlotCount();
}
@Override
public long getRemovedSlotCount() {
return store.getRemovedSlotCount();
}
@Override
public long getAllocatedMemory() {
return store.getAllocatedMemory();
}
@Override
public long getOccupiedMemory() {
return store.getOccupiedMemory();
}
@Override
public long getVitalMemory() {
return store.getVitalMemory();
}
@Override
public long getDataAllocatedMemory() {
return store.getDataAllocatedMemory();
}
@Override
public long getDataOccupiedMemory() {
return store.getDataOccupiedMemory();
}
@Override
public long getDataVitalMemory() {
return store.getDataVitalMemory();
}
@Override
public long getDataSize() {
return store.getDataSize();
}
@Override
public int getReprobeLength() {
//TODO
//MapInternals Interface may need to change to implement this function correctly.
//Currently MapInternals Interface contains function: int getReprobeLength();
//however OffHeapServerStore.reprobeLength() returns a long
//Thus there could be data loss
throw new UnsupportedOperationException("Not supported yet.");
}
}