private void UpdateWatcher(ResponsePutRecords response) { Int32 successCount = response.Records.Count - response.FailedRecordCount; _watcher.CompletePut(successCount); _watcher.UpdateKinesisShard(response); }
// <성공, 실패> 로 분할. private Tuple <PutLog, PutLog> SplitSuccessAndFailPutLog(ResponsePutRecords response, PutContext putContext) { // 모두 성공한 경우. if (response.FailedRecordCount <= 0) { return(new Tuple <PutLog, PutLog>(putContext.PutLog, null)); } // 모두 실패한 경우. if (response.Records.Count == response.FailedRecordCount) { return(new Tuple <PutLog, PutLog>(null, putContext.PutLog)); } Int32 totalCount = response.Records.Count; Int32 successCount = totalCount - response.FailedRecordCount; Int32 failCount = response.FailedRecordCount; var successRawLogs = new List <ILog>(successCount); var successEncodedLogs = new List <Byte[]>(successCount); Int32 successTotalEncodedLogByte = 0; var failRawLogs = new List <ILog>(failCount); var failEncodedLogs = new List <Byte[]>(failCount); Int32 failTotalEncodedLogByte = 0; for (Int32 i = 0; i < totalCount; ++i) { ILog rawLogs = putContext.PutLog.RawLogs[i]; Byte[] encodedLog = putContext.PutLog.EncodedLogs[i]; // 중요: Kinesis의 응답이 보낸 순서와 일치한다(Kinesis가 보낸 순서와 응답을 맞춰서 준다). Record record = response.Records[i]; if (String.IsNullOrEmpty(record.ErrorCode)) { successRawLogs.Add(rawLogs); successEncodedLogs.Add(encodedLog); successTotalEncodedLogByte += encodedLog.Length; } else { failRawLogs.Add(rawLogs); failEncodedLogs.Add(encodedLog); failTotalEncodedLogByte += encodedLog.Length; } } var successPutLog = new PutLog(successRawLogs.ToArray(), successEncodedLogs.ToArray(), successTotalEncodedLogByte); var failPutLog = new PutLog(failRawLogs.ToArray(), failEncodedLogs.ToArray(), failTotalEncodedLogByte); return(new Tuple <PutLog, PutLog>(successPutLog, failPutLog)); }
internal void UpdateKinesisShard(ResponsePutRecords responsePutRecords) { lock (_lock) { foreach (Record record in responsePutRecords.Records) { if (String.IsNullOrEmpty(record.ErrorCode) == false) { continue; } // 실패하면 ShardId가 null일 수 있다. if (String.IsNullOrEmpty(record.ShardId) == false) { KinesisShardToCount.AddOrUpdate(record.ShardId, 1, (key, oldValue) => oldValue + 1); } } } }