summaryrefslogtreecommitdiff
path: root/kafka
diff options
context:
space:
mode:
authorDana Powers <dana.powers@gmail.com>2015-02-19 23:25:19 -0800
committerDana Powers <dana.powers@gmail.com>2015-02-19 23:25:19 -0800
commit9ad0be662d388b47aadf04d712f5744add6456e3 (patch)
treef520b34f440b7d2e9513b8802841c32b1126a106 /kafka
parent60a73788ee9036a79078193dfab892c6e6ef8f9b (diff)
parent6ed6ad53f23fae8dd7ccadc15a7c84f67334d0c0 (diff)
downloadkafka-python-9ad0be662d388b47aadf04d712f5744add6456e3.tar.gz
Merge pull request #314 from dpkp/keyed_producer_failover
Handle keyed producer failover
Diffstat (limited to 'kafka')
-rw-r--r--kafka/partitioner/base.py7
-rw-r--r--kafka/partitioner/hashed.py4
-rw-r--r--kafka/partitioner/roundrobin.py4
-rw-r--r--kafka/producer/keyed.py2
4 files changed, 9 insertions, 8 deletions
diff --git a/kafka/partitioner/base.py b/kafka/partitioner/base.py
index 0b1bb59..857f634 100644
--- a/kafka/partitioner/base.py
+++ b/kafka/partitioner/base.py
@@ -12,14 +12,13 @@ class Partitioner(object):
"""
self.partitions = partitions
- def partition(self, key, partitions):
+ def partition(self, key, partitions=None):
"""
Takes a string key and num_partitions as argument and returns
a partition to be used for the message
Arguments:
- partitions: The list of partitions is passed in every call. This
- may look like an overhead, but it will be useful
- (in future) when we handle cases like rebalancing
+ key: the key to use for partitioning
+ partitions: (optional) a list of partitions.
"""
raise NotImplementedError('partition function has to be implemented')
diff --git a/kafka/partitioner/hashed.py b/kafka/partitioner/hashed.py
index 587a3de..fb5e598 100644
--- a/kafka/partitioner/hashed.py
+++ b/kafka/partitioner/hashed.py
@@ -5,7 +5,9 @@ class HashedPartitioner(Partitioner):
Implements a partitioner which selects the target partition based on
the hash of the key
"""
- def partition(self, key, partitions):
+ def partition(self, key, partitions=None):
+ if not partitions:
+ partitions = self.partitions
size = len(partitions)
idx = hash(key) % size
diff --git a/kafka/partitioner/roundrobin.py b/kafka/partitioner/roundrobin.py
index 54d00da..6439e53 100644
--- a/kafka/partitioner/roundrobin.py
+++ b/kafka/partitioner/roundrobin.py
@@ -15,9 +15,9 @@ class RoundRobinPartitioner(Partitioner):
self.partitions = partitions
self.iterpart = cycle(partitions)
- def partition(self, key, partitions):
+ def partition(self, key, partitions=None):
# Refresh the partition list if necessary
- if self.partitions != partitions:
+ if partitions and self.partitions != partitions:
self._set_partitions(partitions)
return next(self.iterpart)
diff --git a/kafka/producer/keyed.py b/kafka/producer/keyed.py
index fe5b056..36328ed 100644
--- a/kafka/producer/keyed.py
+++ b/kafka/producer/keyed.py
@@ -54,7 +54,7 @@ class KeyedProducer(Producer):
self.partitioners[topic] = self.partitioner_class(self.client.get_partition_ids_for_topic(topic))
partitioner = self.partitioners[topic]
- return partitioner.partition(key, self.client.get_partition_ids_for_topic(topic))
+ return partitioner.partition(key)
def send_messages(self,topic,key,*msg):
partition = self._next_partition(topic, key)