[ https://issues.apache.org/jira/browse/KAFKA-513?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13542550#comment-13542550 ]
Neha Narkhede commented on KAFKA-513: ------------------------------------- Thanks for patch v1. Overall looks pretty good, a few review suggestions and questions - 1. Partition.scala 1.1 The state change log is a timeline of state change requests sent by the controller and state change requests completed by the broker. On the broker side, it will be nice to see something like this - Controller 3 sent the follower state transition for [foo,1] to broker 1 Broker 1 started follower state transition for [foo,1] to leader 2 Broker 1 completed follower state transition for [foo,1] to leader 2 Broker 1 aborted follower state transition for [foo,1] to leader 2 1.2 It will be good to standardize on our logging style for partition. There are some log statements that use [topic, partition], others that use [topic,partition] and some more that use "topic %s partition %d". I personally prefer [topic,partition] since it is concise and does not have extra white spaces. 1.3 Given that we already have one log statement on the broker stating start of the state transition, I think we can get rid of the following from the state change log Started to become follower at the request %s 2. PartitionStateMachine 2.1 There are 2 ways I see the log messages from controller being logged. One is a specialized formatted log that is the state change log. This is used by the state change log merge tool to create a timeline of state changes for a particular partition. Another is re-directing log4j statements from kafka.controller to a separate log4j appender. The purpose would be keeping the log statements specific to controller from polluting the broker logs since presumably only Kafka developers or advanced users would be able to make sense of it. Having said that, I think we can keep the debug statements and anything that helps troubleshooting out of the specialized state change log since that will be captured in the controller's log anyway. 2.2 The leader election state change log messages can be something like Controller 3 started leader election for [foo,1] Controller 3 completed leader election for [foo,1] 3. PartitionStateChangeLogger Since this is a thin wrapper over the Logging trait, do we really need this class at all ? Or, to maintain consistency, we can just use it as a standard logger similar to the requestLogger in KafkaApis. 4. ReplicaStateMachine Given that we already have the state change message for OfflineReplica, I think we don't need the following message about removing it from the ISR 5. log4j.properties How about calling it just a stateChangeAppender and the log a state_change.log ? 6. PartitionStateChangeLogMerger 6.1 It's unclear what the input to this tool is. It will help to give a more detailed description to the input options. 6.2 The way I see it, there are at least 3 ways to merge the state change logs - Filter all the state changes on a partition or all partitions for a topic or everything. We should probably provide these options as input 6.3 Currently, the merging algorithm requires streaming all the entries from each broker's state change log in memory. I wonder if this runs a risk of running out of memory. On one hand, I think there should be fewer state change log entries, so this approach should work just fine. On the other hand, if there is a problem, leading to a lot of state change traffic, this tool might not hold up. One way to mediate this is to basically do a n-way merge from m input files. The algorithm is something like this - 6.3.1 Read a line (that matches the topic/partition regex if there is one) from every input file in a priority queue 6.3.2 Take the line from the file with the earliest date and add it to an output buffer 6.3.3 Add another line from the file in the earlier step in the priority queue 6.3.4 Flush the output buffer every n entries This approach will bound the memory required by this tool to the amount of memory required to store roughly n log entries > Add state change log to Kafka brokers > ------------------------------------- > > Key: KAFKA-513 > URL: https://issues.apache.org/jira/browse/KAFKA-513 > Project: Kafka > Issue Type: Sub-task > Affects Versions: 0.8 > Reporter: Neha Narkhede > Assignee: Swapnil Ghike > Priority: Blocker > Labels: replication, tools > Fix For: 0.8 > > Attachments: kafka-513-v1.patch > > Original Estimate: 96h > Remaining Estimate: 96h > > Once KAFKA-499 is checked in, every controller to broker communication can be > modelled as a state change for one or more partitions. Every state change > request will carry the controller epoch. If there is a problem with the state > of some partitions, it will be good to have a tool that can create a timeline > of requested and completed state changes. This will require each broker to > output a state change log that has entries like > [2012-09-10 10:06:17,280] broker 1 received request LeaderAndIsr() for > partition [foo, 0] from controller 2, epoch 1 > [2012-09-10 10:06:17,350] broker 1 completed request LeaderAndIsr() for > partition [foo, 0] from controller 2, epoch 1 > On controller, this will look like - > [2012-09-10 10:06:17,198] controller 2, epoch 1, initiated state change > request LeaderAndIsr() for partition [foo, 0] > We need a tool that can collect the state change log from all brokers and > create a per-partition timeline of state changes - > [foo, 0] > [2012-09-10 10:06:17,198] controller 2, epoch 1 initiated state change > request LeaderAndIsr() > [2012-09-10 10:06:17,280] broker 1 received request LeaderAndIsr() from > controller 2, epoch 1 > [2012-09-10 10:06:17,350] broker 1 completed request LeaderAndIsr() from > controller 2, epoch 1 > This JIRA involves adding the state change log to each broker and adding the > tool to create the timeline -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators For more information on JIRA, see: http://www.atlassian.com/software/jira