> On June 18, 2015, 9:59 p.m., Jay Kreps wrote: > > clients/src/main/java/org/apache/kafka/clients/consumer/KafkaConsumer.java, > > line 1364 > > <https://reviews.apache.org/r/34789/diff/9-10/?file=983137#file983137line1364> > > > > This seems like one of these things that is clever but invariably ends > > up not quite working. Did we actually determine there is a performance hit > > from just synchronizing. Biased locking and lock elision should make this > > very cheap right? Given we acquire locks for all the perf stats and there > > are several stat updates for each poll call I don't see the problem with > > just synchronizing. > > Ewen Cheslack-Postava wrote: > Adding synchronization has at least one other downside besides > performance - you can pretty easily end up deadlocking due to callbacks > (consumer rebalance, commit) if you also have other synchronization outside > the consumer itself. And if someone has a chance of accessing the consumer > from multiple threads, that probably does mean they have some other > synchronization (or should). Deadlocks are generally easier to diagnose than > synchronization bugs, but you're introducing potential issues either way. > > Based on previous conversation, I think this addresses the main concern > with the unsynchronized version and actually results in a lot *less* > unintuitive behavior than the synchronized version. If I'm already unaware of > the fact that I am incorrectly calling the consumer from multiple threads, > using the synchronized version is just going to make me think > commits/seeks/etc are running really slow as I wait for poll() calls to > return, and then blame the library because as far as I know I'm using it > correctly and it's just not behaving well. This solution seems a lot better > because although it is not guaranteed to catch conflicts, you're a lot more > likely to hit them, they get turned into actual exceptions, and the cause is > made very clear to you -- it specifically puts the blame on the code calling > these methods and indicates that the caller has a bug in their code since > they have not properly synchronized access to the consumer. > > A real race detector is more likely to pick up these errors, but this is > a pretty good way to have a fair chance of catching the error and informing > the user, especially since the most likely error is calling a method while a > poll() is running, and those should generally have pretty long timeouts. > Having to litter the code with try/finally blocks is a definite drawback, but > just encourages us to keep the API as small as possible :)
As Ewen said, I think the main advantage is that it forces users into the single-threaded access model that we want them to use. However, if we think this implementation is a bit too clever (and if we aren't overly concerned about the potential for deadlock in the callback), then we could use a traditional ReentrantLock and get the same behavior by using tryLock(). I doubt the performance impact would be significant. - Jason ----------------------------------------------------------- This is an automatically generated e-mail. To reply, visit: https://reviews.apache.org/r/34789/#review88441 ----------------------------------------------------------- On June 18, 2015, 9:40 p.m., Jason Gustafson wrote: > > ----------------------------------------------------------- > This is an automatically generated e-mail. To reply, visit: > https://reviews.apache.org/r/34789/ > ----------------------------------------------------------- > > (Updated June 18, 2015, 9:40 p.m.) > > > Review request for kafka. > > > Bugs: KAFKA-2168 > https://issues.apache.org/jira/browse/KAFKA-2168 > > > Repository: kafka > > > Description > ------- > > KAFKA-2168; refactored callback handling to prevent unnecessary requests > > > KAFKA-2168; address review comments > > > KAFKA-2168; fix rebase error and checkstyle issue > > > KAFKA-2168; address review comments and add docs > > > KAFKA-2168; handle polling with timeout 0 > > > KAFKA-2168; timeout=0 means return immediately > > > KAFKA-2168; address review comments > > > KAFKA-2168; address more review comments > > > Diffs > ----- > > clients/src/main/java/org/apache/kafka/clients/consumer/Consumer.java > 8f587bc0705b65b3ef37c86e0c25bb43ab8803de > > clients/src/main/java/org/apache/kafka/clients/consumer/ConsumerRecords.java > 1ca75f83d3667f7d01da1ae2fd9488fb79562364 > > clients/src/main/java/org/apache/kafka/clients/consumer/ConsumerWakeupException.java > PRE-CREATION > clients/src/main/java/org/apache/kafka/clients/consumer/KafkaConsumer.java > 951c34c92710fc4b38d656e99d2a41255c60aeb7 > clients/src/main/java/org/apache/kafka/clients/consumer/MockConsumer.java > f50da825756938c193d7f07bee953e000e2627d9 > > clients/src/main/java/org/apache/kafka/clients/consumer/OffsetResetStrategy.java > PRE-CREATION > > clients/src/main/java/org/apache/kafka/clients/consumer/internals/Coordinator.java > 41cb9458f51875ac9418fce52f264b35adba92f4 > > clients/src/main/java/org/apache/kafka/clients/consumer/internals/Fetcher.java > 56281ee15cc33dfc96ff64d5b1e596047c7132a4 > > clients/src/main/java/org/apache/kafka/clients/consumer/internals/Heartbeat.java > e7cfaaad296fa6e325026a5eee1aaf9b9c0fe1fe > > clients/src/main/java/org/apache/kafka/clients/consumer/internals/RequestFuture.java > PRE-CREATION > > clients/src/main/java/org/apache/kafka/clients/consumer/internals/SubscriptionState.java > cee75410127dd1b86c1156563003216d93a086b3 > clients/src/main/java/org/apache/kafka/common/utils/Utils.java > f73eedb030987f018d8446bb1dcd98d19fa97331 > > clients/src/test/java/org/apache/kafka/clients/consumer/MockConsumerTest.java > 677edd385f35d4262342b567262c0b874876d25b > > clients/src/test/java/org/apache/kafka/clients/consumer/internals/CoordinatorTest.java > 1454ab73df22cce028f41f74b970628829da4e9d > > clients/src/test/java/org/apache/kafka/clients/consumer/internals/FetcherTest.java > 419541011d652becf0cda7a5e62ce813cddb1732 > > clients/src/test/java/org/apache/kafka/clients/consumer/internals/HeartbeatTest.java > ecc78cedf59a994fcf084fa7a458fe9ed5386b00 > > clients/src/test/java/org/apache/kafka/clients/consumer/internals/SubscriptionStateTest.java > e000cf8e10ebfacd6c9ee68d7b88ff8c157f73c6 > clients/src/test/java/org/apache/kafka/common/utils/UtilsTest.java > 2ebe3c21f611dc133a2dbb8c7dfb0845f8c21498 > > Diff: https://reviews.apache.org/r/34789/diff/ > > > Testing > ------- > > > Thanks, > > Jason Gustafson > >