public Subscription CompletePublish(
bool requeue,
AsyncPublishOperation operation,
object calldata)
{
// Utils.Trace("PUBLISH: #{0} Completing", operation.RequestHandle, requeue);
QueuedRequest request = (QueuedRequest)calldata;
// check if need to requeue.
lock (m_lock)
{
if (requeue)
{
request.Subscription = null;
request.Error = StatusCodes.Good;
m_queuedRequests.AddFirst(request);
return null;
}
}
// must reassign subscription on error.
if (ServiceResult.IsBad(request.Error))
{
// Utils.Trace("PUBLISH: #{0} Reassigned ERROR({1})", operation.RequestHandle, request.Error);
if (request.Subscription != null)
{
lock (m_lock)
{
request.Subscription.Publishing = false;
AssignSubscriptionToRequest(request.Subscription);
}
}
// TraceState("REQUEST #{0} PUBLISH ERROR ({1})", clientHandle, error.StatusCode);
throw new ServiceResultException(request.Error);
}
// must be shuting down if this is null but no error.
if (request.Subscription == null)
{
throw new ServiceResultException(StatusCodes.BadNoSubscription);
}
// return whatever was assigned.
return request.Subscription.Subscription;
}