package voldemort.rest;
import java.util.Set;
import org.apache.log4j.Logger;
import org.jboss.netty.channel.MessageEvent;
import voldemort.store.stats.StoreStats;
import voldemort.store.stats.Tracked;
import voldemort.utils.ByteArray;
public abstract class RestResponseSender {
protected MessageEvent messageEvent;
protected static final long NS_PER_MS = 1000000;
protected static final long INVALID_START_TIME_IN_MS = -1;
private final static Logger logger = Logger.getLogger(RestResponseSender.class);
// Adding a counter to watch the vector clock size - sum of num of
// entries in each clock
protected int numVectorClockEntries = 0;
public RestResponseSender(MessageEvent messageEvent) {
this.messageEvent = messageEvent;
}
public void sendResponse() throws Exception {
sendResponse(null, false, INVALID_START_TIME_IN_MS);
}
public abstract void sendResponse(StoreStats performanceStats,
boolean isFromLocalZone,
long startTimeInMs) throws Exception;
public void recordStats(StoreStats performanceStats, long startTimeInMs, Tracked operation) {
long duration = System.currentTimeMillis() - startTimeInMs;
performanceStats.recordTime(operation, duration * NS_PER_MS);
}
protected void debugLog(String operationType,
String storeName,
String keyStr,
Long originTimeInMS,
Long responseTimeStampInMS,
int totalVectorClockEntries) {
long durationInMs = responseTimeStampInMS - originTimeInMS;
logger.debug("Received a response from Fat Client for Operation Type: " + operationType
+ " For key(s): " + keyStr + " , Store: " + storeName
+ " , Origin time of request(in ms): " + originTimeInMS
+ " , Response received at time(in ms): " + responseTimeStampInMS
+ " , Num vector clock entries: " + totalVectorClockEntries
+ " , duration from RESTClient to CoordinatorRestResponseSender(in ms): "
+ durationInMs);
}
protected String getKeysHexString(Set<ByteArray> keys) {
return RestUtils.getKeysHexString(keys.iterator());
}
}