package org.apache.cassandra.net;
import java.util.concurrent.TimeUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.cassandra.tracing.Tracing;
public class ResponseVerbHandler implements IVerbHandler
{
private static final Logger logger = LoggerFactory.getLogger( ResponseVerbHandler.class );
public void doVerb(MessageIn message, int id)
{
long latency = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - MessagingService.instance().getRegisteredCallbackAge(id));
CallbackInfo callbackInfo = MessagingService.instance().removeRegisteredCallback(id);
if (callbackInfo == null)
{
String msg = "Callback already removed for {} (from {})";
logger.trace(msg, id, message.from);
Tracing.trace(msg, id, message.from);
return;
}
Tracing.trace("Processing response from {}", message.from);
IAsyncCallback cb = callbackInfo.callback;
if (message.isFailureResponse())
{
((IAsyncCallbackWithFailure) cb).onFailure(message.from, message.getFailureReason());
}
else
{
MessagingService.instance().maybeAddLatency(cb, message.from, latency);
cb.response(message);
}
if (callbackInfo.callback.supportsBackPressure())
{
MessagingService.instance().updateBackPressureOnReceive(message.from, cb, false);
}
}
}