private async Task SetResult(List<BrokerRouteSendBatch> sendTasks)
{
foreach (var sendTask in sendTasks)
{
try
{
//all ready done don't need to await but it none blocking syntext
var batchResult = await sendTask.Task.ConfigureAwait(false);
var numberOfMessage = sendTask.MessagesSent.Count;
for (int i = 0; i < numberOfMessage; i++)
{
bool isAckLevel0 = sendTask.AckLevel == 0;
if (isAckLevel0)
{
var responce = new ProduceResponse()
{
Error = (short)ErrorResponseCode.NoError,
PartitionId = sendTask.Route.PartitionId,
Topic = sendTask.Route.Topic,
Offset = -1
};
sendTask.MessagesSent[i].Tcs.SetResult(responce);
}
else
{
var response = new ProduceResponse()
{
Error = batchResult.Error,
PartitionId = batchResult.PartitionId,
Topic = batchResult.Topic,
Offset = batchResult.Offset + i
};
sendTask.MessagesSent[i].Tcs.SetResult(response);
}
}
}
catch (Exception ex)
{
BrokerRouter.Log.ErrorFormat("failed to send batch Topic[{0}] ackLevel[{1}] partition[{2}] EndPoint[{3}] Exception[{4}] stacktrace[{5}]", sendTask.Route.Topic, sendTask.AckLevel, sendTask.Route.PartitionId, sendTask.Route.Connection.Endpoint, ex.Message, ex.StackTrace);
sendTask.MessagesSent.ForEach((x) => x.Tcs.TrySetException(ex));
}
}
}