Exemple #1
0
        public void SyncGroupResponse()
        {
            var response1 = new SyncGroupResponse {
                MemberAssignment = new SyncGroupMemberAssignment {
                    PartitionAssignments = new[] {
                        new SyncGroupPartitionAssignment {
                            Topic      = Guid.NewGuid().ToString(),
                            Partitions = new [] {
                                Guid.NewGuid().GetHashCode(),
                Guid.NewGuid().GetHashCode()
                            }
                        }
                    },
                    Version  = (Int16)Guid.NewGuid().GetHashCode(),
                    UserData = new Byte[] { 1, 2, 3 }
                }
            };

            Stream binary1 = new MemoryStream();

            response1.Serialize(binary1);

            binary1.Seek(0L, SeekOrigin.Begin);
            var response2 = new SyncGroupResponse();

            response2.Deserialize(binary1);

            var compareLogic = new CompareLogic();
            var result       = compareLogic.Compare(response1, response2);

            Assert.True(result.AreEqual);

            Stream binary2 = new MemoryStream();

            response2.Serialize(binary2);
            Assert.Equal(binary1.Length, binary2.Length);

            using (var stream1 = new MemoryStream())
                using (var stream2 = new MemoryStream()) {
                    binary1.Seek(0L, SeekOrigin.Begin);
                    binary1.CopyTo(stream1);

                    binary2.Seek(0L, SeekOrigin.Begin);
                    binary2.CopyTo(stream2);

                    Assert.Equal(stream1.Length, stream2.Length);
                    stream1.Seek(0L, SeekOrigin.Begin);
                    var bytes1 = stream1.ToArray();

                    stream2.Seek(0L, SeekOrigin.Begin);
                    var bytes2 = stream2.ToArray();
                    Assert.Equal(bytes1.Length, bytes2.Length);

                    for (int i = 0; i < bytes1.Length; i++)
                    {
                        Assert.Equal(bytes1[i], bytes2[i]);
                    }
                }
        }
Exemple #2
0
        public void SyncGroupResponse(
            [Values(
                 ErrorResponseCode.None,
                 ErrorResponseCode.OffsetMetadataTooLarge
                 )] ErrorResponseCode errorCode)
        {
            var bytes = new byte[1000];

            _randomizer.NextBytes(bytes);
            var response = new SyncGroupResponse(errorCode, new ByteMember(bytes));

            response.AssertCanEncodeDecodeResponse(0);
        }
        public void SyncGroupResponse(
            [Values(
                 ErrorCode.NONE,
                 ErrorCode.OFFSET_METADATA_TOO_LARGE
                 )] ErrorCode errorCode)
        {
            var bytes = new byte[1000];

            _randomizer.NextBytes(bytes);
            var response = new SyncGroupResponse(errorCode, new ByteTypeAssignment(new ArraySegment <byte>(bytes)));

            response.AssertCanEncodeDecodeResponse(0, new ByteMembershipEncoder("protocolType"));
        }
Exemple #4
0
        private SyncGroupResponse TryJoinAndSyncGroup(Int32 retryCount, Int32 retryTimtout)
        {
            if (Topics == null || Topics.Length == 0)
            {
                throw new ArgumentOutOfRangeException("Topics");
            }

            SyncGroupResponse resp = null;
            var retryUsed          = 0;

            while (resp == null && ++retryUsed < retryCount)
            {
                OnStateChange(CoordinatorState.Joining);
                var joinGroupResponse = JoinGroup(_groupId, _memberId, Topics);
                joinGroupResponse.TryThrowFirstErrorOccured();

                OnStateChange(CoordinatorState.AwaitingSync);
                _generationId = joinGroupResponse.GenerationId;
                _memberId     = joinGroupResponse.MemberId;
                _members      = joinGroupResponse.Members;

                var isLeader = _memberId != joinGroupResponse.LeaderId;
                if (isLeader)
                {
                    Trace.TraceInformation("{0:HH:mm:ss.fff} [{1:d2}] #3 Join group '{2}', waiting for assingments as follower",
                                           DateTime.Now, Thread.CurrentThread.ManagedThreadId, _groupId);
                    resp = SyncGroup(_groupId, _memberId, _generationId);
                }
                else
                {
                    Trace.TraceInformation("{0:HH:mm:ss.fff} [{1:d2}] #3 Join group '{2}', assigning topic and partitions as leader",
                                           DateTime.Now, Thread.CurrentThread.ManagedThreadId, _groupId);
                    var assignments = AssigningTopicPartitions(joinGroupResponse.Members).ToArray();
                    resp = SyncGroup(_groupId, _memberId, _generationId, assignments);
                }
                if (resp.ErrorCode == ErrorCode.RebalanceInProgressCode)
                {
                    resp = null;
                    Thread.Sleep(retryTimtout);
                }
            }
            if (resp == null)
            {
                throw new ProtocolException(ErrorCode.RebalanceInProgressCode);
            }
            return(resp);
        }
Exemple #5
0
        public void SyncConsumerGroupResponse(
            [Values(
                 ErrorResponseCode.None,
                 ErrorResponseCode.OffsetMetadataTooLarge
                 )] ErrorResponseCode errorCode,
            [Values(1, 10)] int memberCount)
        {
            var encoder = new ConsumerEncoder();
            var topics  = new List <TopicPartition>();

            for (var t = 0; t < memberCount; t++)
            {
                topics.Add(new TopicPartition("topic foo" + t, t));
            }
            var assignment = new ConsumerMemberAssignment(0, topics);
            var response   = new SyncGroupResponse(errorCode, assignment);

            response.AssertCanEncodeDecodeResponse(0, encoder);
        }
        public void SyncConsumerGroupResponse(
            [Values(
                 ErrorCode.NONE,
                 ErrorCode.OFFSET_METADATA_TOO_LARGE
                 )] ErrorCode errorCode,
            [Values(1, 10)] int memberCount)
        {
            var encoder = new ConsumerEncoder();
            var topics  = new List <TopicPartition>();

            for (var t = 0; t < memberCount; t++)
            {
                topics.Add(new TopicPartition("topic foo" + t, t));
            }
            var userData = new byte[memberCount * 100];

            _randomizer.NextBytes(userData);
            var assignment = new ConsumerMemberAssignment(topics, new ArraySegment <byte>(userData), 0);
            var response   = new SyncGroupResponse(errorCode, assignment);

            response.AssertCanEncodeDecodeResponse(0, encoder);
        }
Exemple #7
0
        private static bool TryEncodeResponse(IKafkaWriter writer, IRequestContext context, SyncGroupResponse response)
        {
            if (response == null)
            {
                return(false);
            }

            var encoder = context.GetEncoder(context.ProtocolType);

            writer.Write(response.error_code)
            .Write(response.member_assignment, encoder);
            return(true);
        }
Exemple #8
0
        private static bool TryEncodeResponse(IKafkaWriter writer, IRequestContext context, SyncGroupResponse response)
        {
            if (response == null)
            {
                return(false);
            }

            var encoder = context.GetEncoder();

            writer.Write(response.ErrorCode)
            .Write(response.MemberAssignment, encoder);
            return(true);
        }