kafka git commit: MINOR: Allow timestamp parameter in `ProcessorTopologyTestDriver.process`
Repository: kafka Updated Branches: refs/heads/trunk 75070bdb5 -> 51af6fb65 MINOR: Allow timestamp parameter in `ProcessorTopologyTestDriver.process` All current implementations process records using the same timestamp. This makes it difficult to test operations that require time windows, like `KStream-KStream joins`. This change would allow tests to simulate records created at different times, thus making it possible to test operations like the above mentioned joins. Author: Sebastian GavrilReviewers: Bill Bejeck , Guozhang Wang Closes #3753 from sebigavril/allow-timestamps-in-test-driver Project: http://git-wip-us.apache.org/repos/asf/kafka/repo Commit: http://git-wip-us.apache.org/repos/asf/kafka/commit/51af6fb6 Tree: http://git-wip-us.apache.org/repos/asf/kafka/tree/51af6fb6 Diff: http://git-wip-us.apache.org/repos/asf/kafka/diff/51af6fb6 Branch: refs/heads/trunk Commit: 51af6fb654c482fb6fdd85126991149238640fd7 Parents: 75070bd Author: Sebastian Gavril Authored: Thu Aug 31 14:57:54 2017 -0700 Committer: Guozhang Wang Committed: Thu Aug 31 14:57:54 2017 -0700 -- .../internals/ProcessorTopologyTest.java| 46 +++- .../kafka/test/ProcessorTopologyTestDriver.java | 23 +- 2 files changed, 56 insertions(+), 13 deletions(-) -- http://git-wip-us.apache.org/repos/asf/kafka/blob/51af6fb6/streams/src/test/java/org/apache/kafka/streams/processor/internals/ProcessorTopologyTest.java -- diff --git a/streams/src/test/java/org/apache/kafka/streams/processor/internals/ProcessorTopologyTest.java b/streams/src/test/java/org/apache/kafka/streams/processor/internals/ProcessorTopologyTest.java index fd3afa8..1ea09cd 100644 --- a/streams/src/test/java/org/apache/kafka/streams/processor/internals/ProcessorTopologyTest.java +++ b/streams/src/test/java/org/apache/kafka/streams/processor/internals/ProcessorTopologyTest.java @@ -63,7 +63,6 @@ public class ProcessorTopologyTest { private static final String OUTPUT_TOPIC_2 = "output-topic-2"; private static final String THROUGH_TOPIC_1 = "through-topic-1"; -private static long timestamp = 1000L; private final TopologyBuilder builder = new TopologyBuilder(); private final MockProcessorSupplier mockProcessorSupplier = new MockProcessorSupplier(); @@ -315,20 +314,43 @@ public class ProcessorTopologyTest { assertThat(result, containsString("child-two:\n\t\tchildren:\t[child-two-one]")); } -private void assertNextOutputRecord(String topic, String key, String value) { -ProducerRecord record = driver.readOutput(topic, STRING_DESERIALIZER, STRING_DESERIALIZER); -assertEquals(topic, record.topic()); -assertEquals(key, record.key()); -assertEquals(value, record.value()); -assertNull(record.partition()); +@Test +public void shouldConsiderTimeStamps() throws Exception { +final int partition = 10; +driver = new ProcessorTopologyTestDriver(config, createSimpleTopology(partition).internalTopologyBuilder); +driver.process(INPUT_TOPIC_1, "key1", "value1", STRING_SERIALIZER, STRING_SERIALIZER, 10L); +driver.process(INPUT_TOPIC_1, "key2", "value2", STRING_SERIALIZER, STRING_SERIALIZER, 20L); +driver.process(INPUT_TOPIC_1, "key3", "value3", STRING_SERIALIZER, STRING_SERIALIZER, 30L); +assertNextOutputRecord(OUTPUT_TOPIC_1, "key1", "value1", partition, 10L); +assertNextOutputRecord(OUTPUT_TOPIC_1, "key2", "value2", partition, 20L); +assertNextOutputRecord(OUTPUT_TOPIC_1, "key3", "value3", partition, 30L); } -private void assertNextOutputRecord(String topic, String key, String value, Integer partition) { + +private void assertNextOutputRecord(final String topic, +final String key, +final String value) { +assertNextOutputRecord(topic, key, value, null, 0L); +} + +private void assertNextOutputRecord(final String topic, +final String key, +final String value, +final Integer partition) { +assertNextOutputRecord(topic, key, value, partition, 0L); +} + +private void assertNextOutputRecord(final String topic, +final String key, +final String value, +final Integer partition, +final Long timestamp) { ProducerRecord record =
kafka git commit: MINOR: Increase timeout of Zookeeper service in system tests
Repository: kafka Updated Branches: refs/heads/0.10.2 c9168e10f -> b4271b5cb MINOR: Increase timeout of Zookeeper service in system tests The previous timeout was 10 seconds, but system test failures have occurred when Zookeeper has started after about 11 seconds. Increasing the timeout to 30 seconds, since most of the time this extra time will not be required, and when it is it will prevent a failed system test. In addition to merging to `trunk`, please backport to the `0.11.x` and `0.10.2.x` branches. Author: Randall HauchReviewers: Ewen Cheslack-Postava Closes #3774 from rhauch/MINOR-Increase-timeout-of-zookeeper-service-in-system-tests (cherry picked from commit 75070bdb5d70cc0b2f52faf4f769144f68f02ee2) Signed-off-by: Ewen Cheslack-Postava Project: http://git-wip-us.apache.org/repos/asf/kafka/repo Commit: http://git-wip-us.apache.org/repos/asf/kafka/commit/b4271b5c Tree: http://git-wip-us.apache.org/repos/asf/kafka/tree/b4271b5c Diff: http://git-wip-us.apache.org/repos/asf/kafka/diff/b4271b5c Branch: refs/heads/0.10.2 Commit: b4271b5cbc229143d485d9375b35cbb7a3a826c1 Parents: c9168e1 Author: Randall Hauch Authored: Thu Aug 31 14:53:44 2017 -0700 Committer: Ewen Cheslack-Postava Committed: Thu Aug 31 14:54:05 2017 -0700 -- tests/kafkatest/services/zookeeper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -- http://git-wip-us.apache.org/repos/asf/kafka/blob/b4271b5c/tests/kafkatest/services/zookeeper.py -- diff --git a/tests/kafkatest/services/zookeeper.py b/tests/kafkatest/services/zookeeper.py index 6606598..d10a2bc 100644 --- a/tests/kafkatest/services/zookeeper.py +++ b/tests/kafkatest/services/zookeeper.py @@ -79,7 +79,7 @@ class ZookeeperService(KafkaPathResolverMixin, Service): start_cmd += "/mnt/zookeeper.properties 1>> %(path)s 2>> %(path)s &" % self.logs["zk_log"] node.account.ssh(start_cmd) -wait_until(lambda: self.listening(node), timeout_sec=10, err_msg="Zookeeper node failed to start") +wait_until(lambda: self.listening(node), timeout_sec=30, err_msg="Zookeeper node failed to start") def listening(self, node): try:
kafka git commit: MINOR: Increase timeout of Zookeeper service in system tests
Repository: kafka Updated Branches: refs/heads/0.11.0 c3980a22b -> 5ec185e27 MINOR: Increase timeout of Zookeeper service in system tests The previous timeout was 10 seconds, but system test failures have occurred when Zookeeper has started after about 11 seconds. Increasing the timeout to 30 seconds, since most of the time this extra time will not be required, and when it is it will prevent a failed system test. In addition to merging to `trunk`, please backport to the `0.11.x` and `0.10.2.x` branches. Author: Randall HauchReviewers: Ewen Cheslack-Postava Closes #3774 from rhauch/MINOR-Increase-timeout-of-zookeeper-service-in-system-tests (cherry picked from commit 75070bdb5d70cc0b2f52faf4f769144f68f02ee2) Signed-off-by: Ewen Cheslack-Postava Project: http://git-wip-us.apache.org/repos/asf/kafka/repo Commit: http://git-wip-us.apache.org/repos/asf/kafka/commit/5ec185e2 Tree: http://git-wip-us.apache.org/repos/asf/kafka/tree/5ec185e2 Diff: http://git-wip-us.apache.org/repos/asf/kafka/diff/5ec185e2 Branch: refs/heads/0.11.0 Commit: 5ec185e277051798f048657df944c643562e86e1 Parents: c3980a2 Author: Randall Hauch Authored: Thu Aug 31 14:53:44 2017 -0700 Committer: Ewen Cheslack-Postava Committed: Thu Aug 31 14:53:57 2017 -0700 -- tests/kafkatest/services/zookeeper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -- http://git-wip-us.apache.org/repos/asf/kafka/blob/5ec185e2/tests/kafkatest/services/zookeeper.py -- diff --git a/tests/kafkatest/services/zookeeper.py b/tests/kafkatest/services/zookeeper.py index f484fb1..b1eed33 100644 --- a/tests/kafkatest/services/zookeeper.py +++ b/tests/kafkatest/services/zookeeper.py @@ -79,7 +79,7 @@ class ZookeeperService(KafkaPathResolverMixin, Service): start_cmd += "/mnt/zookeeper.properties 1>> %(path)s 2>> %(path)s &" % self.logs["zk_log"] node.account.ssh(start_cmd) -wait_until(lambda: self.listening(node), timeout_sec=10, err_msg="Zookeeper node failed to start") +wait_until(lambda: self.listening(node), timeout_sec=30, err_msg="Zookeeper node failed to start") def listening(self, node): try:
kafka git commit: MINOR: Increase timeout of Zookeeper service in system tests
Repository: kafka Updated Branches: refs/heads/trunk ded874117 -> 75070bdb5 MINOR: Increase timeout of Zookeeper service in system tests The previous timeout was 10 seconds, but system test failures have occurred when Zookeeper has started after about 11 seconds. Increasing the timeout to 30 seconds, since most of the time this extra time will not be required, and when it is it will prevent a failed system test. In addition to merging to `trunk`, please backport to the `0.11.x` and `0.10.2.x` branches. Author: Randall HauchReviewers: Ewen Cheslack-Postava Closes #3774 from rhauch/MINOR-Increase-timeout-of-zookeeper-service-in-system-tests Project: http://git-wip-us.apache.org/repos/asf/kafka/repo Commit: http://git-wip-us.apache.org/repos/asf/kafka/commit/75070bdb Tree: http://git-wip-us.apache.org/repos/asf/kafka/tree/75070bdb Diff: http://git-wip-us.apache.org/repos/asf/kafka/diff/75070bdb Branch: refs/heads/trunk Commit: 75070bdb5d70cc0b2f52faf4f769144f68f02ee2 Parents: ded8741 Author: Randall Hauch Authored: Thu Aug 31 14:53:44 2017 -0700 Committer: Ewen Cheslack-Postava Committed: Thu Aug 31 14:53:44 2017 -0700 -- tests/kafkatest/services/zookeeper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -- http://git-wip-us.apache.org/repos/asf/kafka/blob/75070bdb/tests/kafkatest/services/zookeeper.py -- diff --git a/tests/kafkatest/services/zookeeper.py b/tests/kafkatest/services/zookeeper.py index b469c0c..dcf0eb8 100644 --- a/tests/kafkatest/services/zookeeper.py +++ b/tests/kafkatest/services/zookeeper.py @@ -82,7 +82,7 @@ class ZookeeperService(KafkaPathResolverMixin, Service): start_cmd += "%s/zookeeper.properties &>> %s &" % (ZookeeperService.ROOT, self.logs["zk_log"]["path"]) node.account.ssh(start_cmd) -wait_until(lambda: self.listening(node), timeout_sec=10, err_msg="Zookeeper node failed to start") +wait_until(lambda: self.listening(node), timeout_sec=30, err_msg="Zookeeper node failed to start") def listening(self, node): try:
kafka git commit: MINOR: Fix unit test failures from last commit, cherry-pick fix for SASL principal
Repository: kafka Updated Branches: refs/heads/0.10.2 0b4daa4bf -> c9168e10f MINOR: Fix unit test failures from last commit, cherry-pick fix for SASL principal This fixes PlainSaslServerTest from the last commit which uses a class not present in 0.10.2. Also cherry-picked commit 9934d28 to 0.10.2 since that is required for multiple mechanism support (SaslMultiMechanismConsumerTest was failing with the changes without this). Author: Rajini SivaramReviewers: Ismael Juma , Jun Rao Closes #3773 from rajinisivaram/MINOR-0.10.2-buildfix Project: http://git-wip-us.apache.org/repos/asf/kafka/repo Commit: http://git-wip-us.apache.org/repos/asf/kafka/commit/c9168e10 Tree: http://git-wip-us.apache.org/repos/asf/kafka/tree/c9168e10 Diff: http://git-wip-us.apache.org/repos/asf/kafka/diff/c9168e10 Branch: refs/heads/0.10.2 Commit: c9168e10f93d713ad78ed421f50e9819b3f046b5 Parents: 0b4daa4 Author: Rajini Sivaram Authored: Thu Aug 31 16:20:33 2017 -0400 Committer: Rajini Sivaram Committed: Thu Aug 31 16:20:33 2017 -0400 -- .../consumer/internals/AbstractCoordinator.java | 2 +- .../apache/kafka/common/network/Selector.java | 17 +- .../kafka/common/protocol/types/Struct.java | 2 +- .../authenticator/SaslClientAuthenticator.java | 35 .../SaslClientCallbackHandler.java | 2 +- .../authenticator/SaslServerAuthenticator.java | 10 +++--- .../clients/producer/ProducerRecordTest.java| 12 +++ .../authenticator/SaslAuthenticatorTest.java| 9 +++-- .../security/plain/PlainSaslServerTest.java | 16 ++--- .../security/scram/ScramSaslServerTest.java | 2 +- 10 files changed, 76 insertions(+), 31 deletions(-) -- http://git-wip-us.apache.org/repos/asf/kafka/blob/c9168e10/clients/src/main/java/org/apache/kafka/clients/consumer/internals/AbstractCoordinator.java -- diff --git a/clients/src/main/java/org/apache/kafka/clients/consumer/internals/AbstractCoordinator.java b/clients/src/main/java/org/apache/kafka/clients/consumer/internals/AbstractCoordinator.java index d0d5e8d..c8096ef 100644 --- a/clients/src/main/java/org/apache/kafka/clients/consumer/internals/AbstractCoordinator.java +++ b/clients/src/main/java/org/apache/kafka/clients/consumer/internals/AbstractCoordinator.java @@ -966,7 +966,7 @@ public abstract class AbstractCoordinator implements Closeable { log.error("Unexpected interrupt received in heartbeat thread for group {}", groupId, e); this.failed.set(new RuntimeException(e)); } catch (RuntimeException e) { -log.error("Heartbeat thread for group {} failed due to unexpected error" , groupId, e); +log.error("Heartbeat thread for group {} failed due to unexpected error", groupId, e); this.failed.set(e); } finally { log.debug("Heartbeat thread for group {} has closed", groupId); http://git-wip-us.apache.org/repos/asf/kafka/blob/c9168e10/clients/src/main/java/org/apache/kafka/common/network/Selector.java -- diff --git a/clients/src/main/java/org/apache/kafka/common/network/Selector.java b/clients/src/main/java/org/apache/kafka/common/network/Selector.java index df35266..f55dc96 100644 --- a/clients/src/main/java/org/apache/kafka/common/network/Selector.java +++ b/clients/src/main/java/org/apache/kafka/common/network/Selector.java @@ -185,7 +185,17 @@ public class Selector implements Selectable { throw e; } SelectionKey key = socketChannel.register(nioSelector, SelectionKey.OP_CONNECT); -KafkaChannel channel = channelBuilder.buildChannel(id, key, maxReceiveSize); +KafkaChannel channel; +try { +channel = channelBuilder.buildChannel(id, key, maxReceiveSize); +} catch (Exception e) { +try { +socketChannel.close(); +} finally { +key.cancel(); +} +throw new IOException("Channel could not be created for socket " + socketChannel, e); +} key.attach(channel); this.channels.put(id, channel); @@ -650,6 +660,11 @@ public class Selector implements Selectable { this.sensors.recordBytesReceived(channel.id(), networkReceive.payload().limit()); } +// only for testing +public Set keys() { +return new HashSet<>(nioSelector.keys()); +} + private class SelectorMetrics { private final Metrics metrics; public final Sensor connectionClosed;
kafka git commit: KAFKA-5806; Fix transient unit test failure in trogdor coordinator shutdown
Repository: kafka Updated Branches: refs/heads/trunk 47c275349 -> ded874117 KAFKA-5806; Fix transient unit test failure in trogdor coordinator shutdown In the coordinator, we should check that 'shutdown' is not true before going to sleep waiting for the condition. Author: Colin P. MccabeReviewers: Apurva Mehta , Jason Gustafson Closes #3755 from cmccabe/KAFKA-5806 Project: http://git-wip-us.apache.org/repos/asf/kafka/repo Commit: http://git-wip-us.apache.org/repos/asf/kafka/commit/ded87411 Tree: http://git-wip-us.apache.org/repos/asf/kafka/tree/ded87411 Diff: http://git-wip-us.apache.org/repos/asf/kafka/diff/ded87411 Branch: refs/heads/trunk Commit: ded8741173854c98f3be0525403b6a17a55b6027 Parents: 47c2753 Author: Colin P. Mccabe Authored: Thu Aug 31 13:19:28 2017 -0700 Committer: Jason Gustafson Committed: Thu Aug 31 13:19:28 2017 -0700 -- .../apache/kafka/trogdor/coordinator/Coordinator.java| 11 +++ 1 file changed, 7 insertions(+), 4 deletions(-) -- http://git-wip-us.apache.org/repos/asf/kafka/blob/ded87411/tools/src/main/java/org/apache/kafka/trogdor/coordinator/Coordinator.java -- diff --git a/tools/src/main/java/org/apache/kafka/trogdor/coordinator/Coordinator.java b/tools/src/main/java/org/apache/kafka/trogdor/coordinator/Coordinator.java index 1f71fc5..2759a36 100644 --- a/tools/src/main/java/org/apache/kafka/trogdor/coordinator/Coordinator.java +++ b/tools/src/main/java/org/apache/kafka/trogdor/coordinator/Coordinator.java @@ -130,16 +130,19 @@ public final class Coordinator { List toStart = new ArrayList<>(); lock.lock(); try { +if (shutdown) { +break; +} if (nextWakeMs > now) { if (cond.await(nextWakeMs - now, TimeUnit.MILLISECONDS)) { log.trace("CoordinatorRunnable woke up early."); } +now = time.milliseconds(); +if (shutdown) { +break; +} } nextWakeMs = now + (60L * 60L * 1000L); -if (shutdown) { -log.info("CoordinatorRunnable shutting down."); -return; -} Iterator iter = pendingFaults.iterateByStart(); while (iter.hasNext()) { Fault fault = iter.next();
kafka git commit: KAFKA-2105; Check for null in KafkaProducer.partitionsFor
Repository: kafka Updated Branches: refs/heads/0.11.0 9f3468645 -> c3980a22b KAFKA-2105; Check for null in KafkaProducer.partitionsFor Author: Manikumar ReddyReviewers: Ismael Juma Closes #3697 from omkreddy/KAFKA-2105 (cherry picked from commit 9836adc732288924813927c4869ffb3908febba1) Signed-off-by: Ismael Juma Project: http://git-wip-us.apache.org/repos/asf/kafka/repo Commit: http://git-wip-us.apache.org/repos/asf/kafka/commit/c3980a22 Tree: http://git-wip-us.apache.org/repos/asf/kafka/tree/c3980a22 Diff: http://git-wip-us.apache.org/repos/asf/kafka/diff/c3980a22 Branch: refs/heads/0.11.0 Commit: c3980a22bdbe9f7477b6b56c4194f5c46d0307f9 Parents: 9f34686 Author: Manikumar Reddy Authored: Thu Aug 31 16:30:33 2017 +0100 Committer: Ismael Juma Committed: Thu Aug 31 18:31:03 2017 +0100 -- .../src/main/java/org/apache/kafka/clients/Metadata.java | 1 + .../org/apache/kafka/clients/producer/KafkaProducer.java | 2 ++ .../apache/kafka/clients/producer/KafkaProducerTest.java | 11 +++ 3 files changed, 14 insertions(+) -- http://git-wip-us.apache.org/repos/asf/kafka/blob/c3980a22/clients/src/main/java/org/apache/kafka/clients/Metadata.java -- diff --git a/clients/src/main/java/org/apache/kafka/clients/Metadata.java b/clients/src/main/java/org/apache/kafka/clients/Metadata.java index 0963bad..b4521c3 100644 --- a/clients/src/main/java/org/apache/kafka/clients/Metadata.java +++ b/clients/src/main/java/org/apache/kafka/clients/Metadata.java @@ -112,6 +112,7 @@ public final class Metadata { * will be reset on the next update. */ public synchronized void add(String topic) { +Objects.requireNonNull(topic, "topic cannot be null"); if (topics.put(topic, TOPIC_EXPIRY_NEEDS_UPDATE) == null) { requestUpdateForNewTopics(); } http://git-wip-us.apache.org/repos/asf/kafka/blob/c3980a22/clients/src/main/java/org/apache/kafka/clients/producer/KafkaProducer.java -- diff --git a/clients/src/main/java/org/apache/kafka/clients/producer/KafkaProducer.java b/clients/src/main/java/org/apache/kafka/clients/producer/KafkaProducer.java index f9c5538..7690cac 100644 --- a/clients/src/main/java/org/apache/kafka/clients/producer/KafkaProducer.java +++ b/clients/src/main/java/org/apache/kafka/clients/producer/KafkaProducer.java @@ -66,6 +66,7 @@ import java.net.InetSocketAddress; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Properties; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; @@ -956,6 +957,7 @@ public class KafkaProducer implements Producer { */ @Override public List partitionsFor(String topic) { +Objects.requireNonNull(topic, "topic cannot be null"); try { return waitOnMetadata(topic, null, maxBlockTimeMs).cluster.partitionsForTopic(topic); } catch (InterruptedException e) { http://git-wip-us.apache.org/repos/asf/kafka/blob/c3980a22/clients/src/test/java/org/apache/kafka/clients/producer/KafkaProducerTest.java -- diff --git a/clients/src/test/java/org/apache/kafka/clients/producer/KafkaProducerTest.java b/clients/src/test/java/org/apache/kafka/clients/producer/KafkaProducerTest.java index 56c1b18..46dcf14 100644 --- a/clients/src/test/java/org/apache/kafka/clients/producer/KafkaProducerTest.java +++ b/clients/src/test/java/org/apache/kafka/clients/producer/KafkaProducerTest.java @@ -473,4 +473,15 @@ public class KafkaProducerTest { } +@Test +public void testPartitionsForWithNullTopic() { +Properties props = new Properties(); +props.setProperty(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9000"); +try (KafkaProducer producer = new KafkaProducer<>(props, new ByteArraySerializer(), new ByteArraySerializer())) { +producer.partitionsFor(null); +fail("Expected NullPointerException to be raised"); +} catch (NullPointerException e) { +// expected +} +} }
kafka git commit: MINOR: Test SASL authorization id
Repository: kafka Updated Branches: refs/heads/0.10.2 565455eae -> 0b4daa4bf MINOR: Test SASL authorization id Author: Rajini SivaramReviewers: Ismael Juma Closes #3766 from rajinisivaram/MINOR-sasl (cherry picked from commit 47c2753496875db2849065ad91ee03c7c842c8e9) Signed-off-by: Rajini Sivaram Project: http://git-wip-us.apache.org/repos/asf/kafka/repo Commit: http://git-wip-us.apache.org/repos/asf/kafka/commit/0b4daa4b Tree: http://git-wip-us.apache.org/repos/asf/kafka/tree/0b4daa4b Diff: http://git-wip-us.apache.org/repos/asf/kafka/diff/0b4daa4b Branch: refs/heads/0.10.2 Commit: 0b4daa4bf48517b4b3e9cda11692e80ade620b04 Parents: 565455e Author: Rajini Sivaram Authored: Thu Aug 31 12:42:08 2017 -0400 Committer: Rajini Sivaram Committed: Thu Aug 31 12:44:00 2017 -0400 -- .../common/security/plain/PlainSaslServer.java | 14 ++-- .../common/security/scram/ScramSaslServer.java | 18 +++-- .../security/plain/PlainSaslServerTest.java | 75 .../security/scram/ScramSaslServerTest.java | 74 +++ 4 files changed, 172 insertions(+), 9 deletions(-) -- http://git-wip-us.apache.org/repos/asf/kafka/blob/0b4daa4b/clients/src/main/java/org/apache/kafka/common/security/plain/PlainSaslServer.java -- diff --git a/clients/src/main/java/org/apache/kafka/common/security/plain/PlainSaslServer.java b/clients/src/main/java/org/apache/kafka/common/security/plain/PlainSaslServer.java index 0928057..af0affd 100644 --- a/clients/src/main/java/org/apache/kafka/common/security/plain/PlainSaslServer.java +++ b/clients/src/main/java/org/apache/kafka/common/security/plain/PlainSaslServer.java @@ -50,7 +50,7 @@ public class PlainSaslServer implements SaslServer { private static final String JAAS_USER_PREFIX = "user_"; private boolean complete; -private String authorizationID; +private String authorizationId; public PlainSaslServer(CallbackHandler callbackHandler) { } @@ -78,7 +78,7 @@ public class PlainSaslServer implements SaslServer { } if (tokens.length != 3) throw new SaslException("Invalid SASL/PLAIN response: expected 3 tokens, got " + tokens.length); -authorizationID = tokens[0]; +String authorizationIdFromClient = tokens[0]; String username = tokens[1]; String password = tokens[2]; @@ -88,8 +88,6 @@ public class PlainSaslServer implements SaslServer { if (password.isEmpty()) { throw new SaslException("Authentication failed: password not specified"); } -if (authorizationID.isEmpty()) -authorizationID = username; try { String expectedPassword = JaasUtils.defaultServerJaasConfigOption(JAAS_USER_PREFIX + username, PlainLoginModule.class.getName()); @@ -99,6 +97,12 @@ public class PlainSaslServer implements SaslServer { } catch (IOException e) { throw new SaslException("Authentication failed: Invalid JAAS configuration", e); } + +if (!authorizationIdFromClient.isEmpty() && !authorizationIdFromClient.equals(username)) +throw new SaslException("Authentication failed: Client requested an authorization id that is different from username"); + +this.authorizationId = username; + complete = true; return new byte[0]; } @@ -107,7 +111,7 @@ public class PlainSaslServer implements SaslServer { public String getAuthorizationID() { if (!complete) throw new IllegalStateException("Authentication exchange has not completed"); -return authorizationID; +return authorizationId; } @Override http://git-wip-us.apache.org/repos/asf/kafka/blob/0b4daa4b/clients/src/main/java/org/apache/kafka/common/security/scram/ScramSaslServer.java -- diff --git a/clients/src/main/java/org/apache/kafka/common/security/scram/ScramSaslServer.java b/clients/src/main/java/org/apache/kafka/common/security/scram/ScramSaslServer.java index 4298f98..e95a0c0 100644 --- a/clients/src/main/java/org/apache/kafka/common/security/scram/ScramSaslServer.java +++ b/clients/src/main/java/org/apache/kafka/common/security/scram/ScramSaslServer.java @@ -66,7 +66,6 @@ public class ScramSaslServer implements SaslServer { private String username; private ClientFirstMessage clientFirstMessage; private ServerFirstMessage serverFirstMessage; -private String serverNonce; private ScramCredential scramCredential; public ScramSaslServer(ScramMechanism mechanism, Map
kafka git commit: MINOR: Test SASL authorization id
Repository: kafka Updated Branches: refs/heads/0.11.0 0cffb6237 -> 9f3468645 MINOR: Test SASL authorization id Author: Rajini SivaramReviewers: Ismael Juma Closes #3766 from rajinisivaram/MINOR-sasl (cherry picked from commit 47c2753496875db2849065ad91ee03c7c842c8e9) Signed-off-by: Rajini Sivaram Project: http://git-wip-us.apache.org/repos/asf/kafka/repo Commit: http://git-wip-us.apache.org/repos/asf/kafka/commit/9f346864 Tree: http://git-wip-us.apache.org/repos/asf/kafka/tree/9f346864 Diff: http://git-wip-us.apache.org/repos/asf/kafka/diff/9f346864 Branch: refs/heads/0.11.0 Commit: 9f3468645b968761ca9141d18337cb6adadbae97 Parents: 0cffb62 Author: Rajini Sivaram Authored: Thu Aug 31 12:42:08 2017 -0400 Committer: Rajini Sivaram Committed: Thu Aug 31 12:43:24 2017 -0400 -- .../common/security/plain/PlainSaslServer.java | 14 ++-- .../common/security/scram/ScramSaslServer.java | 18 +++-- .../security/plain/PlainSaslServerTest.java | 75 .../security/scram/ScramSaslServerTest.java | 74 +++ 4 files changed, 172 insertions(+), 9 deletions(-) -- http://git-wip-us.apache.org/repos/asf/kafka/blob/9f346864/clients/src/main/java/org/apache/kafka/common/security/plain/PlainSaslServer.java -- diff --git a/clients/src/main/java/org/apache/kafka/common/security/plain/PlainSaslServer.java b/clients/src/main/java/org/apache/kafka/common/security/plain/PlainSaslServer.java index 6fe3b25..93faee0 100644 --- a/clients/src/main/java/org/apache/kafka/common/security/plain/PlainSaslServer.java +++ b/clients/src/main/java/org/apache/kafka/common/security/plain/PlainSaslServer.java @@ -50,7 +50,7 @@ public class PlainSaslServer implements SaslServer { private final JaasContext jaasContext; private boolean complete; -private String authorizationID; +private String authorizationId; public PlainSaslServer(JaasContext jaasContext) { this.jaasContext = jaasContext; @@ -79,7 +79,7 @@ public class PlainSaslServer implements SaslServer { } if (tokens.length != 3) throw new SaslException("Invalid SASL/PLAIN response: expected 3 tokens, got " + tokens.length); -authorizationID = tokens[0]; +String authorizationIdFromClient = tokens[0]; String username = tokens[1]; String password = tokens[2]; @@ -89,14 +89,18 @@ public class PlainSaslServer implements SaslServer { if (password.isEmpty()) { throw new SaslException("Authentication failed: password not specified"); } -if (authorizationID.isEmpty()) -authorizationID = username; String expectedPassword = jaasContext.configEntryOption(JAAS_USER_PREFIX + username, PlainLoginModule.class.getName()); if (!password.equals(expectedPassword)) { throw new SaslException("Authentication failed: Invalid username or password"); } + +if (!authorizationIdFromClient.isEmpty() && !authorizationIdFromClient.equals(username)) +throw new SaslException("Authentication failed: Client requested an authorization id that is different from username"); + +this.authorizationId = username; + complete = true; return new byte[0]; } @@ -105,7 +109,7 @@ public class PlainSaslServer implements SaslServer { public String getAuthorizationID() { if (!complete) throw new IllegalStateException("Authentication exchange has not completed"); -return authorizationID; +return authorizationId; } @Override http://git-wip-us.apache.org/repos/asf/kafka/blob/9f346864/clients/src/main/java/org/apache/kafka/common/security/scram/ScramSaslServer.java -- diff --git a/clients/src/main/java/org/apache/kafka/common/security/scram/ScramSaslServer.java b/clients/src/main/java/org/apache/kafka/common/security/scram/ScramSaslServer.java index 942c299..04b9afa 100644 --- a/clients/src/main/java/org/apache/kafka/common/security/scram/ScramSaslServer.java +++ b/clients/src/main/java/org/apache/kafka/common/security/scram/ScramSaslServer.java @@ -64,7 +64,6 @@ public class ScramSaslServer implements SaslServer { private String username; private ClientFirstMessage clientFirstMessage; private ServerFirstMessage serverFirstMessage; -private String serverNonce; private ScramCredential scramCredential; public ScramSaslServer(ScramMechanism mechanism, Map props, CallbackHandler callbackHandler) throws
kafka git commit: MINOR: Test SASL authorization id
Repository: kafka Updated Branches: refs/heads/trunk 9ebc303bb -> 47c275349 MINOR: Test SASL authorization id Author: Rajini SivaramReviewers: Ismael Juma Closes #3766 from rajinisivaram/MINOR-sasl Project: http://git-wip-us.apache.org/repos/asf/kafka/repo Commit: http://git-wip-us.apache.org/repos/asf/kafka/commit/47c27534 Tree: http://git-wip-us.apache.org/repos/asf/kafka/tree/47c27534 Diff: http://git-wip-us.apache.org/repos/asf/kafka/diff/47c27534 Branch: refs/heads/trunk Commit: 47c2753496875db2849065ad91ee03c7c842c8e9 Parents: 9ebc303 Author: Rajini Sivaram Authored: Thu Aug 31 12:42:08 2017 -0400 Committer: Rajini Sivaram Committed: Thu Aug 31 12:42:08 2017 -0400 -- .../common/security/plain/PlainSaslServer.java | 14 ++-- .../common/security/scram/ScramSaslServer.java | 18 +++-- .../security/plain/PlainSaslServerTest.java | 75 .../security/scram/ScramSaslServerTest.java | 74 +++ 4 files changed, 172 insertions(+), 9 deletions(-) -- http://git-wip-us.apache.org/repos/asf/kafka/blob/47c27534/clients/src/main/java/org/apache/kafka/common/security/plain/PlainSaslServer.java -- diff --git a/clients/src/main/java/org/apache/kafka/common/security/plain/PlainSaslServer.java b/clients/src/main/java/org/apache/kafka/common/security/plain/PlainSaslServer.java index 6fe3b25..93faee0 100644 --- a/clients/src/main/java/org/apache/kafka/common/security/plain/PlainSaslServer.java +++ b/clients/src/main/java/org/apache/kafka/common/security/plain/PlainSaslServer.java @@ -50,7 +50,7 @@ public class PlainSaslServer implements SaslServer { private final JaasContext jaasContext; private boolean complete; -private String authorizationID; +private String authorizationId; public PlainSaslServer(JaasContext jaasContext) { this.jaasContext = jaasContext; @@ -79,7 +79,7 @@ public class PlainSaslServer implements SaslServer { } if (tokens.length != 3) throw new SaslException("Invalid SASL/PLAIN response: expected 3 tokens, got " + tokens.length); -authorizationID = tokens[0]; +String authorizationIdFromClient = tokens[0]; String username = tokens[1]; String password = tokens[2]; @@ -89,14 +89,18 @@ public class PlainSaslServer implements SaslServer { if (password.isEmpty()) { throw new SaslException("Authentication failed: password not specified"); } -if (authorizationID.isEmpty()) -authorizationID = username; String expectedPassword = jaasContext.configEntryOption(JAAS_USER_PREFIX + username, PlainLoginModule.class.getName()); if (!password.equals(expectedPassword)) { throw new SaslException("Authentication failed: Invalid username or password"); } + +if (!authorizationIdFromClient.isEmpty() && !authorizationIdFromClient.equals(username)) +throw new SaslException("Authentication failed: Client requested an authorization id that is different from username"); + +this.authorizationId = username; + complete = true; return new byte[0]; } @@ -105,7 +109,7 @@ public class PlainSaslServer implements SaslServer { public String getAuthorizationID() { if (!complete) throw new IllegalStateException("Authentication exchange has not completed"); -return authorizationID; +return authorizationId; } @Override http://git-wip-us.apache.org/repos/asf/kafka/blob/47c27534/clients/src/main/java/org/apache/kafka/common/security/scram/ScramSaslServer.java -- diff --git a/clients/src/main/java/org/apache/kafka/common/security/scram/ScramSaslServer.java b/clients/src/main/java/org/apache/kafka/common/security/scram/ScramSaslServer.java index 942c299..04b9afa 100644 --- a/clients/src/main/java/org/apache/kafka/common/security/scram/ScramSaslServer.java +++ b/clients/src/main/java/org/apache/kafka/common/security/scram/ScramSaslServer.java @@ -64,7 +64,6 @@ public class ScramSaslServer implements SaslServer { private String username; private ClientFirstMessage clientFirstMessage; private ServerFirstMessage serverFirstMessage; -private String serverNonce; private ScramCredential scramCredential; public ScramSaslServer(ScramMechanism mechanism, Map props, CallbackHandler callbackHandler) throws NoSuchAlgorithmException { @@ -80,7 +79,7 @@ public class ScramSaslServer implements SaslServer { switch (state) {
kafka git commit: KAFKA-5379 follow up: reduce redundant mock processor context
Repository: kafka Updated Branches: refs/heads/trunk 9836adc73 -> 9ebc303bb KAFKA-5379 follow up: reduce redundant mock processor context Author: Guozhang WangReviewers: Matthias J. Sax Closes #3757 from guozhangwang/K5379-follow-up Project: http://git-wip-us.apache.org/repos/asf/kafka/repo Commit: http://git-wip-us.apache.org/repos/asf/kafka/commit/9ebc303b Tree: http://git-wip-us.apache.org/repos/asf/kafka/tree/9ebc303b Diff: http://git-wip-us.apache.org/repos/asf/kafka/diff/9ebc303b Branch: refs/heads/trunk Commit: 9ebc303bb85bf5aae2b732c60d3b3e0a6e07512d Parents: 9836adc Author: Guozhang Wang Authored: Thu Aug 31 08:43:13 2017 -0700 Committer: Guozhang Wang Committed: Thu Aug 31 08:43:13 2017 -0700 -- .../internals/AbstractProcessorContext.java | 4 +- .../processor/internals/ProcessorNodeTest.java | 6 +- .../state/internals/RocksDBStoreTest.java | 49 +- .../apache/kafka/test/MockProcessorContext.java | 160 +++ 4 files changed, 66 insertions(+), 153 deletions(-) -- http://git-wip-us.apache.org/repos/asf/kafka/blob/9ebc303b/streams/src/main/java/org/apache/kafka/streams/processor/internals/AbstractProcessorContext.java -- diff --git a/streams/src/main/java/org/apache/kafka/streams/processor/internals/AbstractProcessorContext.java b/streams/src/main/java/org/apache/kafka/streams/processor/internals/AbstractProcessorContext.java index 2c28226..3c8e077 100644 --- a/streams/src/main/java/org/apache/kafka/streams/processor/internals/AbstractProcessorContext.java +++ b/streams/src/main/java/org/apache/kafka/streams/processor/internals/AbstractProcessorContext.java @@ -41,8 +41,8 @@ public abstract class AbstractProcessorContext implements InternalProcessorConte private final ThreadCache cache; private final Serde valueSerde; private boolean initialized; -private RecordContext recordContext; -private ProcessorNode currentNode; +protected RecordContext recordContext; +protected ProcessorNode currentNode; final StateManager stateManager; public AbstractProcessorContext(final TaskId taskId, http://git-wip-us.apache.org/repos/asf/kafka/blob/9ebc303b/streams/src/test/java/org/apache/kafka/streams/processor/internals/ProcessorNodeTest.java -- diff --git a/streams/src/test/java/org/apache/kafka/streams/processor/internals/ProcessorNodeTest.java b/streams/src/test/java/org/apache/kafka/streams/processor/internals/ProcessorNodeTest.java index ab29c5c..f37a674 100644 --- a/streams/src/test/java/org/apache/kafka/streams/processor/internals/ProcessorNodeTest.java +++ b/streams/src/test/java/org/apache/kafka/streams/processor/internals/ProcessorNodeTest.java @@ -102,16 +102,16 @@ public class ProcessorNodeTest { "The average number of occurrence of " + opName + " operation per second.", metricTags))); } + @Test public void testMetrics() { final StateSerdes anyStateSerde = StateSerdes.withBuiltinTypes("anyName", Bytes.class, Bytes.class); -final MockProcessorContext context = new MockProcessorContext(anyStateSerde, new RecordCollectorImpl(null, null)); +final Metrics metrics = new Metrics(); +final MockProcessorContext context = new MockProcessorContext(anyStateSerde, new RecordCollectorImpl(null, null), metrics); final ProcessorNode node = new ProcessorNode("name", new NoOpProcessor(), Collections.emptySet()); node.init(context); -Metrics metrics = context.baseMetrics(); -String name = "task." + context.taskId(); String[] latencyOperations = {"process", "punctuate", "create", "destroy"}; String throughputOperation = "forward"; String groupName = "stream-processor-node-metrics"; http://git-wip-us.apache.org/repos/asf/kafka/blob/9ebc303b/streams/src/test/java/org/apache/kafka/streams/state/internals/RocksDBStoreTest.java -- diff --git a/streams/src/test/java/org/apache/kafka/streams/state/internals/RocksDBStoreTest.java b/streams/src/test/java/org/apache/kafka/streams/state/internals/RocksDBStoreTest.java index 8b916cb..2f93a7c 100644 --- a/streams/src/test/java/org/apache/kafka/streams/state/internals/RocksDBStoreTest.java +++ b/streams/src/test/java/org/apache/kafka/streams/state/internals/RocksDBStoreTest.java @@ -22,11 +22,6 @@ import org.apache.kafka.common.utils.Utils; import org.apache.kafka.streams.KeyValue; import org.apache.kafka.streams.StreamsConfig; import org.apache.kafka.streams.errors.ProcessorStateException; -import
kafka git commit: KAFKA-2105; Check for null in KafkaProducer.partitionsFor
Repository: kafka Updated Branches: refs/heads/trunk ce04b1435 -> 9836adc73 KAFKA-2105; Check for null in KafkaProducer.partitionsFor Author: Manikumar ReddyReviewers: Ismael Juma Closes #3697 from omkreddy/KAFKA-2105 Project: http://git-wip-us.apache.org/repos/asf/kafka/repo Commit: http://git-wip-us.apache.org/repos/asf/kafka/commit/9836adc7 Tree: http://git-wip-us.apache.org/repos/asf/kafka/tree/9836adc7 Diff: http://git-wip-us.apache.org/repos/asf/kafka/diff/9836adc7 Branch: refs/heads/trunk Commit: 9836adc732288924813927c4869ffb3908febba1 Parents: ce04b14 Author: Manikumar Reddy Authored: Thu Aug 31 16:30:33 2017 +0100 Committer: Ismael Juma Committed: Thu Aug 31 16:30:42 2017 +0100 -- .../main/java/org/apache/kafka/clients/Metadata.java| 1 + .../apache/kafka/clients/producer/KafkaProducer.java| 2 ++ .../kafka/clients/producer/KafkaProducerTest.java | 12 3 files changed, 15 insertions(+) -- http://git-wip-us.apache.org/repos/asf/kafka/blob/9836adc7/clients/src/main/java/org/apache/kafka/clients/Metadata.java -- diff --git a/clients/src/main/java/org/apache/kafka/clients/Metadata.java b/clients/src/main/java/org/apache/kafka/clients/Metadata.java index 0963bad..b4521c3 100644 --- a/clients/src/main/java/org/apache/kafka/clients/Metadata.java +++ b/clients/src/main/java/org/apache/kafka/clients/Metadata.java @@ -112,6 +112,7 @@ public final class Metadata { * will be reset on the next update. */ public synchronized void add(String topic) { +Objects.requireNonNull(topic, "topic cannot be null"); if (topics.put(topic, TOPIC_EXPIRY_NEEDS_UPDATE) == null) { requestUpdateForNewTopics(); } http://git-wip-us.apache.org/repos/asf/kafka/blob/9836adc7/clients/src/main/java/org/apache/kafka/clients/producer/KafkaProducer.java -- diff --git a/clients/src/main/java/org/apache/kafka/clients/producer/KafkaProducer.java b/clients/src/main/java/org/apache/kafka/clients/producer/KafkaProducer.java index b06b415..3fa007a 100644 --- a/clients/src/main/java/org/apache/kafka/clients/producer/KafkaProducer.java +++ b/clients/src/main/java/org/apache/kafka/clients/producer/KafkaProducer.java @@ -66,6 +66,7 @@ import java.net.InetSocketAddress; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Properties; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; @@ -964,6 +965,7 @@ public class KafkaProducer implements Producer { */ @Override public List partitionsFor(String topic) { +Objects.requireNonNull(topic, "topic cannot be null"); try { return waitOnMetadata(topic, null, maxBlockTimeMs).cluster.partitionsForTopic(topic); } catch (InterruptedException e) { http://git-wip-us.apache.org/repos/asf/kafka/blob/9836adc7/clients/src/test/java/org/apache/kafka/clients/producer/KafkaProducerTest.java -- diff --git a/clients/src/test/java/org/apache/kafka/clients/producer/KafkaProducerTest.java b/clients/src/test/java/org/apache/kafka/clients/producer/KafkaProducerTest.java index dd62457..26f7588 100644 --- a/clients/src/test/java/org/apache/kafka/clients/producer/KafkaProducerTest.java +++ b/clients/src/test/java/org/apache/kafka/clients/producer/KafkaProducerTest.java @@ -464,4 +464,16 @@ public class KafkaProducerTest { EasyMock.verify(interceptors); } + +@Test +public void testPartitionsForWithNullTopic() { +Properties props = new Properties(); +props.setProperty(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9000"); +try (KafkaProducer producer = new KafkaProducer<>(props, new ByteArraySerializer(), new ByteArraySerializer())) { +producer.partitionsFor(null); +fail("Expected NullPointerException to be raised"); +} catch (NullPointerException e) { +// expected +} +} }
kafka-site git commit: Add Damian's PGP
Repository: kafka-site Updated Branches: refs/heads/asf-site 52b928144 -> 07a0b4045 Add Damian's PGP Project: http://git-wip-us.apache.org/repos/asf/kafka-site/repo Commit: http://git-wip-us.apache.org/repos/asf/kafka-site/commit/07a0b404 Tree: http://git-wip-us.apache.org/repos/asf/kafka-site/tree/07a0b404 Diff: http://git-wip-us.apache.org/repos/asf/kafka-site/diff/07a0b404 Branch: refs/heads/asf-site Commit: 07a0b4045f5f3d55af44e0d1bfde60c90915d9ab Parents: 52b9281 Author: Damian GuyAuthored: Thu Aug 31 10:29:03 2017 +0100 Committer: Damian Guy Committed: Thu Aug 31 10:29:03 2017 +0100 -- KEYS | 57 + 1 file changed, 57 insertions(+) -- http://git-wip-us.apache.org/repos/asf/kafka-site/blob/07a0b404/KEYS -- diff --git a/KEYS b/KEYS index 2efca24..75298ca 100644 --- a/KEYS +++ b/KEYS @@ -711,3 +711,60 @@ U0PdwcFXT1sU3rtuhREDUTagZ3FmwIOse/NXbN5dHcnnZMWn+qqzMxiutb4MuN01 qUAdpxxKffByAEiV =LJo0 -END PGP PUBLIC KEY BLOCK- +pub 4096R/518830CF 2017-08-31 +uid [ultimate] Damian Guy (CODE SIGNING KEY) +sig 3518830CF 2017-08-31 Damian Guy (CODE SIGNING KEY) +sub 4096R/6B21A95F 2017-08-31 +sig 518830CF 2017-08-31 Damian Guy (CODE SIGNING KEY) + +-BEGIN PGP PUBLIC KEY BLOCK- + +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 +xc4GtaeCajdGhBWlwaEba0Go +=ZGR0 +-END PGP PUBLIC KEY BLOCK-