public async Task ProcessEvents_OneDocument_WithFailures_RetriesElasticClientCallUntilSuccess() { // Fail the BulkAsync call 100 times with BadGateway, then succeed with OK. const int failureCount = 100; int callCount = 0; _client.OnBulkAsync().Returns(() => ElasticsearchResponseExtensions.GetBulkResponse(++callCount <= failureCount ? HttpStatusCode.BadGateway : HttpStatusCode.OK)); await _processor.OpenAsync(_partition); await _processor.ProcessEventsAsync(_partition, new[] { MockEventData.CreateSerilogEventData("{}") }); await _processor.CloseAsync(_partition, CloseReason.Shutdown); _client.VerifyBulkAsyncCalled(Times.Exactly(failureCount + 1)); Assert.Equal(0, _processor.LastBatchFailedDocuments); Assert.Equal(0, _processor.LastBatchAbandonedDocuments); }
private ElasticsearchResponse <BulkResponse> HandleBulkRequest(string content) { if (string.IsNullOrWhiteSpace(content)) { return(ElasticsearchResponseExtensions.ParseException()); } var lines = content.Split('\n'); IndexCommand current = null; dynamic responseBuilder = ElasticsearchResponseExtensions.GetBulkResponseBuilder(); var itemsToIndex = new Dictionary <string, Dictionary <string, Dictionary <string, string> > >(); foreach (var line in lines) { if (current == null) { if (string.IsNullOrWhiteSpace(line)) { continue; } // Validate the action metadata line. current = IndexCommand.Parse(line); if (current == null) { return(ElasticsearchResponseExtensions.JsonParseException()); } if (current.index == null) { return(ElasticsearchResponseExtensions.MalformedActionException()); } if (string.IsNullOrWhiteSpace(current.index._index)) { return(ElasticsearchResponseExtensions.ActionIndexMissingException()); } if (string.IsNullOrWhiteSpace(current.index._type)) { return(ElasticsearchResponseExtensions.ActionTypeMissingException()); } } else { if (string.IsNullOrWhiteSpace(line)) { ElasticsearchResponseExtensions.AddEmptyItem(responseBuilder, current.index._index, current.index._type, current.index._id); } else if (!IsValidJson(line)) { ElasticsearchResponseExtensions.AddInvalidJsonItem(responseBuilder, current.index._index, current.index._type, current.index._id); } else { ElasticsearchResponseExtensions.AddBulkItem(responseBuilder, current.index._index, current.index._type, current.index._id); TrackItemToIndex(itemsToIndex, current.index._index, current.index._type, current.index._id, line); } current = null; } } if (responseBuilder.items.Count == 0) { return(ElasticsearchResponseExtensions.ParseException()); } IndexItems(itemsToIndex); return(ElasticsearchResponseExtensions.GetBulkResponse(HttpStatusCode.OK, responseBuilder)); }
public static IReturnsResult <IElasticLowLevelClient> Returns(this ISetup <IElasticLowLevelClient, Task <ElasticsearchResponse <BulkResponse> > > setup, HttpStatusCode statusCode) { var response = ElasticsearchResponseExtensions.GetBulkResponse(statusCode); return(setup.Returns(response)); }