import io.netty.util.Timeout;
import java.math.BigInteger;
-import java.util.Map;
import org.opendaylight.controller.md.sal.binding.api.ReadTransaction;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
Xid getNextXid();
/**
- * @return readonly map of outstanding requests
+ * @param xid key
+ * @return request by xid
*/
- Map<Long, RequestContext> getRequests();
+ RequestContext lookupRequest(Xid xid);
+
+ /**
+ * @return number of outstanding requests in map
+ */
+ int getNumberOfOutstandingRequests();
/**
* Method writes request context into request context map. This method
*/
void hookRequestCtx(Xid xid, RequestContext requestFutureContext);
+ /**
+ * Method removes request context from request context map.
+ *
+ * @param xid
+ */
+ RequestContext unhookRequestCtx(Xid xid);
+
/**
* Method that attaches anyMessageTypeListener to connection adapters as message listener.
*
@Override
public void run(final Timeout timeout) throws Exception {
// check outstanding requests first
- if (! deviceCtx.getRequests().isEmpty()) {
+ if (deviceCtx.getNumberOfOutstandingRequests() > 0) {
BarrierInput barrierInput = makeBarrier();
LOG.trace("sending out barrier [{}]", barrierInput.getXid());
final Future<RpcResult<BarrierOutput>> future = deviceCtx.getPrimaryConnectionContext()
}
@Override
- public Map<Long, RequestContext> getRequests() {
- return requests;
+ public RequestContext lookupRequest(Xid xid) {
+ return requests.get(xid.getValue());
+ }
+
+ @Override
+ public int getNumberOfOutstandingRequests() {
+ return requests.size();
}
@Override
public void hookRequestCtx(final Xid xid, final RequestContext requestFutureContext) {
- // TODO Auto-generated method stub
requests.put(xid.getValue(), requestFutureContext);
}
+ @Override
+ public RequestContext unhookRequestCtx(Xid xid) {
+ return requests.remove(xid.getValue());
+ }
+
@Override
public void attachOpenflowMessageListener(final OpenflowMessageListenerFacade openflowMessageListenerFacade) {
this.openflowMessageListenerFacade = openflowMessageListenerFacade;
@Override
public void processReply(final OfHeader ofHeader) {
- final RequestContext requestContext = getRequests().get(ofHeader.getXid());
+ final RequestContext requestContext = requests.get(ofHeader.getXid());
if (null != requestContext) {
final SettableFuture replyFuture = requestContext.getFuture();
- getRequests().remove(ofHeader.getXid());
+ requests.remove(ofHeader.getXid());
RpcResult<OfHeader> rpcResult;
if (ofHeader instanceof Error) {
final Error error = (Error) ofHeader;
@Override
public void processReply(final Xid xid, final List<MultipartReply> ofHeaderList) {
- final RequestContext requestContext = getRequests().get(xid.getValue());
+ final RequestContext requestContext = requests.get(xid.getValue());
if (null != requestContext) {
final SettableFuture replyFuture = requestContext.getFuture();
- getRequests().remove(xid.getValue());
+ requests.remove(xid.getValue());
final RpcResult<List<MultipartReply>> rpcResult = RpcResultBuilder
.<List<MultipartReply>>success()
.withResult(ofHeaderList)
LOG.trace("Processing exception for xid : {}", xid.getValue());
- final RequestContext requestContext = getRequests().get(xid.getValue());
+ final RequestContext requestContext = requests.get(xid.getValue());
if (null != requestContext) {
final SettableFuture replyFuture = requestContext.getFuture();
- getRequests().remove(xid.getValue());
+ requests.remove(xid.getValue());
final RpcResult<List<OfHeader>> rpcResult = RpcResultBuilder
.<List<OfHeader>>failed()
.withError(RpcError.ErrorType.APPLICATION, String.format("Message processing failed : %s", deviceDataException.getError()), deviceDataException)
deviceContext.getMessageSpy().spyMessage(requestContext, MessageSpy.STATISTIC_GROUP.FROM_SWITCH_PUBLISHED_FAILURE);
// remove current request from request cache in deviceContext
- deviceContext.getRequests().remove(requestContext.getXid().getValue());
+ deviceContext.unhookRequestCtx(requestContext.getXid());
// handle requestContext failure
StringBuilder rpcErrors = new StringBuilder();
if (null != fRpcResult.getErrors() && fRpcResult.getErrors().size() > 0) {
if (!voidRpcResult.isSuccessful()) {
// remove current request from request cache in deviceContext
messageSpy.spyMessage(flowModInput, MessageSpy.STATISTIC_GROUP.FROM_SWITCH_PUBLISHED_FAILURE);
- deviceContext.getRequests().remove(requestContext.getXid().getValue());
+ deviceContext.unhookRequestCtx(requestContext.getXid());
// handle requestContext failure
StringBuilder rpcErrors = new StringBuilder();
if (null != voidRpcResult.getErrors() && voidRpcResult.getErrors().size() > 0) {
final GetAsyncOutput asyncOutput = createAsyncOutput(xid);
LOG.info("Hooking RequestContext");
deviceContext.hookRequestCtx(xid, requestContext);
- Assert.assertEquals(requestContext, deviceContext.getRequests().get(xid.getValue()));
+ Assert.assertEquals(requestContext, deviceContext.lookupRequest(xid));
Assert.assertFalse(requestContext.getFuture().isDone());
LOG.info("Sending reply from device");
LOG.error("Test failed when checking RequestContext.future", e);
fail("fail");
}
- Assert.assertTrue(deviceContext.getRequests().isEmpty());
+ Assert.assertTrue(deviceContext.getNumberOfOutstandingRequests() == 0);
}
private static Error createError(final Xid xid) {
public void testProcessReplyError() {
LOG.info("Hooking RequestContext");
deviceContext.hookRequestCtx(xid, requestContext);
- Assert.assertEquals(requestContext, deviceContext.getRequests().get(xid.getValue()));
+ Assert.assertEquals(requestContext, deviceContext.lookupRequest(xid));
Assert.assertFalse(requestContext.getFuture().isDone());
LOG.info("Sending error reply from device");
LOG.error("Test failed when checking RequestContext.future", e);
fail("fail");
}
- Assert.assertTrue(deviceContext.getRequests().isEmpty());
+ Assert.assertTrue(deviceContext.getNumberOfOutstandingRequests() == 0);
}
@Test
public void testProcessReplyList() {
LOG.info("Hooking RequestContext");
deviceContext.hookRequestCtx(xidMulti, requestContextMultiReply);
- Assert.assertEquals(requestContextMultiReply, deviceContext.getRequests().get(xidMulti.getValue()));
+ Assert.assertEquals(requestContextMultiReply, deviceContext.lookupRequest(xidMulti));
Assert.assertFalse(requestContextMultiReply.getFuture().isDone());
LOG.info("Sending reply from device");
LOG.error("Test failed when checking RequestContext.future", e);
fail("fail");
}
- Assert.assertTrue(deviceContext.getRequests().isEmpty());
+ Assert.assertTrue(deviceContext.getNumberOfOutstandingRequests() == 0);
}
private static List<MultipartReply> createMultipartReplyList(final Xid xid) {
public void testProcessException() {
LOG.info("Hooking RequestContext");
deviceContext.hookRequestCtx(xid, requestContext);
- Assert.assertEquals(requestContext, deviceContext.getRequests().get(xid.getValue()));
+ Assert.assertEquals(requestContext, deviceContext.lookupRequest(xid));
Assert.assertFalse(requestContext.getFuture().isDone());
LOG.error("Test failed when checking RequestContext.future", e);
fail("fail");
}
- Assert.assertTrue(deviceContext.getRequests().isEmpty());
+ Assert.assertTrue(deviceContext.getNumberOfOutstandingRequests() == 0);
}
}