package voldemort.rest;
import static org.jboss.netty.handler.codec.http.HttpHeaders.Names.CONTENT_LENGTH;
import static org.jboss.netty.handler.codec.http.HttpResponseStatus.CREATED;
import static org.jboss.netty.handler.codec.http.HttpVersion.HTTP_1_1;
import org.apache.log4j.Logger;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.handler.codec.http.DefaultHttpResponse;
import org.jboss.netty.handler.codec.http.HttpResponse;
import voldemort.store.stats.StoreStats;
import voldemort.store.stats.Tracked;
import voldemort.utils.ByteArray;
import voldemort.versioning.VectorClock;
public class PutResponseSender extends RestResponseSender {
private final VectorClock successfulPutVC;
private final static Logger logger = Logger.getLogger(PutResponseSender.class);
// Storing keyname storename for logging purposes
private ByteArray key;
private String storeName;
public PutResponseSender(MessageEvent messageEvent) {
this(messageEvent, null);
}
public PutResponseSender(MessageEvent messageEvent, VectorClock successfulPutVC) {
super(messageEvent);
this.successfulPutVC = successfulPutVC;
}
/**
* Constructor called by Coordinator worker thread
*
* @param messageEvent
* @param successfulPutVC
* @param storeName
* @param key
*/
public PutResponseSender(MessageEvent messageEvent,
VectorClock successfulPutVC,
String storeName,
ByteArray key) {
super(messageEvent);
this.successfulPutVC = successfulPutVC;
this.key = key;
this.storeName = storeName;
}
@Override
public void sendResponse(StoreStats performanceStats,
boolean isFromLocalZone,
long startTimeInMs) {
// Create the Response object
HttpResponse response = new DefaultHttpResponse(HTTP_1_1, CREATED);
// Set the right headers
response.setHeader(CONTENT_LENGTH, 0);
if(this.successfulPutVC != null) {
numVectorClockEntries += successfulPutVC.getVersionMap().size();
String serializedVC = RestUtils.getSerializedVectorClock(successfulPutVC);
response.setHeader(RestMessageHeaders.X_VOLD_VECTOR_CLOCK, serializedVC);
}
// Write the response to the Netty Channel
if(logger.isDebugEnabled()) {
String keyStr = RestUtils.getKeyHexString(key);
debugLog("PUT",
this.storeName,
keyStr,
startTimeInMs,
System.currentTimeMillis(),
numVectorClockEntries);
}
this.messageEvent.getChannel().write(response);
if(performanceStats != null && isFromLocalZone) {
recordStats(performanceStats, startTimeInMs, Tracked.PUT);
}
}
}