package edu.berkeley.lipstick.backend;
import edu.berkeley.lipstick.config.Config;
import edu.berkeley.lipstick.localstore.ILocalStore;
import edu.berkeley.lipstick.storage.IStorage;
import edu.berkeley.lipstick.util.*;
import edu.berkeley.lipstick.util.serializer.IDWSerializer;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
public class AsynchronousResolver implements Runnable {
VersionApplier applier;
IStorage storage;
ConcurrentHashMap<String, String> keysToCheck = new ConcurrentHashMap<String, String>();
IDWSerializer serializer;
boolean closed = false;
final long maxKeysToCheck;
public AsynchronousResolver(ILocalStore localstore,
IStorage storage,
IDWSerializer serializer) throws Exception {
applier = new VersionApplier(localstore, storage, this);
this.storage = storage;
this.serializer = serializer;
maxKeysToCheck = Config.getMaxKeysToCheck();
}
public void close() {
closed = true;
}
public void addKeyToCheck(String key) {
if(keysToCheck.size() < maxKeysToCheck)
keysToCheck.put(key, "");
}
public boolean checkSingleKey(DataWrapper wrapper, int numEDCSreads) throws Exception {
if(applier.checkSingleKey(wrapper, numEDCSreads))
return true;
applier.addToCheck(wrapper);
return false;
}
public void run() {
while(true) {
if(closed)
break;
try {
Thread.sleep(Config.getAsyncSleepLength());
for(String key : keysToCheck.keySet()) {
byte[] ret = storage.get(key);
if(ret != null) {
applier.addToCheck(serializer.fromByteArray(key, ret));
}
}
keysToCheck.clear();
applier.applyAllPossible();
}
catch(Exception e) {
if(closed)
break;
System.out.println(e.getClass());
System.out.println(e.getCause());
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}
}