예제 #1
0
        private void UpdateWatcher(ResponsePutRecords response)
        {
            Int32 successCount = response.Records.Count - response.FailedRecordCount;

            _watcher.CompletePut(successCount);
            _watcher.UpdateKinesisShard(response);
        }
예제 #2
0
        // <성공, 실패> 로 분할.
        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));
        }
예제 #3
0
        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);
                    }
                }
            }
        }