/*
* Copyright (c) 2014-2015 Spotify AB
*
* 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 com.spotify.folsom;
import com.google.common.base.Throwables;
import com.thimbleware.jmemcached.Cache;
import com.thimbleware.jmemcached.CacheElement;
import com.thimbleware.jmemcached.CacheImpl;
import com.thimbleware.jmemcached.Key;
import com.thimbleware.jmemcached.LocalCacheElement;
import com.thimbleware.jmemcached.MemCacheDaemon;
import com.thimbleware.jmemcached.storage.hash.ConcurrentLinkedHashMap;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
public class EmbeddedServer {
private final MemCacheDaemon<? extends CacheElement> daemon;
private final int port;
public EmbeddedServer(boolean binary) {
this(binary, defaultCache());
}
public <E extends CacheElement> EmbeddedServer(final boolean binary, final Cache<E> cache) {
MemCacheDaemon<E> daemon = new MemCacheDaemon<>();
daemon.setCache(cache);
daemon.setBinary(binary);
daemon.setVerbose(false);
port = findFreePort();
daemon.setAddr(new InetSocketAddress(this.port));
daemon.start();
this.daemon = daemon;
}
private static CacheImpl defaultCache() {
final int maxItems = 1492;
final int maxBytes = 1024 * 1000;
final ConcurrentLinkedHashMap<Key, LocalCacheElement> storage = ConcurrentLinkedHashMap.create(
ConcurrentLinkedHashMap.EvictionPolicy.FIFO, maxItems, maxBytes);
return new CacheImpl(storage);
}
public static int findFreePort() {
try (ServerSocket tmpSocket = new ServerSocket(0)) {
return tmpSocket.getLocalPort();
} catch (IOException e) {
throw Throwables.propagate(e);
}
}
public void stop() {
daemon.stop();
}
public int getPort() {
return port;
}
public void flush() {
daemon.getCache().flush_all();
}
public Cache getCache() {
return daemon.getCache();
}
}