Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Handle session_timeout_ms / max_poll_interval_ms defaults differently…
… for old brokers
  • Loading branch information
dpkp committed Dec 21, 2017
commit 5b2a48301d23c302d6aed564ce73dbe566bf7fc2
40 changes: 27 additions & 13 deletions kafka/consumer/group.py
Original file line number Diff line number Diff line change
Expand Up @@ -265,7 +265,7 @@ class KafkaConsumer(six.Iterator):
'partition_assignment_strategy': (RangePartitionAssignor, RoundRobinPartitionAssignor),
'max_poll_records': 500,
'max_poll_interval_ms': 300000,
'session_timeout_ms': 10000, # XXX should be 30000 if < 0.11
'session_timeout_ms': 10000,
'heartbeat_interval_ms': 3000,
'receive_buffer_bytes': None,
'send_buffer_bytes': None,
Expand Down Expand Up @@ -294,16 +294,16 @@ class KafkaConsumer(six.Iterator):
'sasl_plain_password': None,
'sasl_kerberos_service_name': 'kafka'
}
DEFAULT_SESSION_TIMEOUT_MS_0_9 = 30000

def __init__(self, *topics, **configs):
self.config = copy.copy(self.DEFAULT_CONFIG)
configs_copy = copy.copy(configs)
for key in self.config:
if key in configs:
self.config[key] = configs_copy.pop(key)

# Only check for extra config keys in top-level class
assert not configs_copy, 'Unrecognized configs: %s' % configs_copy
extra_configs = set(configs).difference(self.DEFAULT_CONFIG)
if extra_configs:
raise Errors.KafkaConfigurationError("Unrecognized configs: %s" % extra_configs)

self.config = copy.copy(self.DEFAULT_CONFIG)
self.config.update(configs)

deprecated = {'smallest': 'earliest', 'largest': 'latest'}
if self.config['auto_offset_reset'] in deprecated:
Expand All @@ -313,12 +313,7 @@ def __init__(self, *topics, **configs):
self.config['auto_offset_reset'] = new_config

request_timeout_ms = self.config['request_timeout_ms']
session_timeout_ms = self.config['session_timeout_ms']
fetch_max_wait_ms = self.config['fetch_max_wait_ms']
if self.config['group_id'] is not None and request_timeout_ms <= session_timeout_ms:
raise KafkaConfigurationError(
"Request timeout (%s) must be larger than session timeout (%s)" %
(request_timeout_ms, session_timeout_ms))
if request_timeout_ms <= fetch_max_wait_ms:
raise KafkaConfigurationError("Request timeout (%s) must be larger than fetch-max-wait-ms (%s)" %
(request_timeout_ms, fetch_max_wait_ms))
Expand Down Expand Up @@ -347,6 +342,25 @@ def __init__(self, *topics, **configs):
if self.config['api_version'] is None:
self.config['api_version'] = self._client.config['api_version']

# Coordinator configurations are different for older brokers
# max_poll_interval_ms is not supported directly -- it must the be
# the same as session_timeout_ms. If the user provides one of them,
# use it for both. Otherwise use the old default of 30secs
if self.config['api_version'] < (0, 10, 1):
if 'session_timeout_ms' not in configs:
if 'max_poll_interval_ms' in configs:
self.config['session_timeout_ms'] = configs['max_poll_interval_ms']
else:
self.config['session_timeout_ms'] = self.DEFAULT_SESSION_TIMEOUT_MS_0_9
if 'max_poll_interval_ms' not in configs:
self.config['max_poll_interval_ms'] = self.config['session_timeout_ms']

if self.config['group_id'] is not None:
if self.config['request_timeout_ms'] <= self.config['session_timeout_ms']:
raise KafkaConfigurationError(
"Request timeout (%s) must be larger than session timeout (%s)" %
(self.config['request_timeout_ms'], self.config['session_timeout_ms']))

self._subscription = SubscriptionState(self.config['auto_offset_reset'])
self._fetcher = Fetcher(
self._client, self._subscription, self._metrics, **self.config)
Expand Down
10 changes: 8 additions & 2 deletions kafka/coordinator/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,11 +83,11 @@ class BaseCoordinator(object):

DEFAULT_CONFIG = {
'group_id': 'kafka-python-default-group',
'session_timeout_ms': 10000, # XXX 30000 for < 0.11 brokers
'session_timeout_ms': 10000,
'heartbeat_interval_ms': 3000,
'max_poll_interval_ms': 300000,
'retry_backoff_ms': 100,
'api_version': (0, 9),
'api_version': (0, 10, 1),
'metric_group_prefix': '',
}

Expand Down Expand Up @@ -116,6 +116,12 @@ def __init__(self, client, metrics, **configs):
if key in configs:
self.config[key] = configs[key]

if self.config['api_version'] < (0, 10, 1):
if self.config['max_poll_interval_ms'] != self.config['session_timeout_ms']:
raise Errors.KafkaConfigurationError("Broker version %s does not support "
"different values for max_poll_interval_ms "
"and session_timeout_ms")

self._client = client
self.group_id = self.config['group_id']
self.heartbeat = Heartbeat(**self.config)
Expand Down
21 changes: 14 additions & 7 deletions kafka/coordinator/consumer.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ class ConsumerCoordinator(BaseCoordinator):
'heartbeat_interval_ms': 3000,
'max_poll_interval_ms': 300000,
'retry_backoff_ms': 100,
'api_version': (0, 9),
'api_version': (0, 10, 1),
'exclude_internal_topics': True,
'metric_group_prefix': 'consumer'
}
Expand Down Expand Up @@ -83,12 +83,6 @@ def __init__(self, client, subscription, metrics, **configs):
if key in configs:
self.config[key] = configs[key]

if self.config['default_offset_commit_callback'] is None:
self.config['default_offset_commit_callback'] = self._default_offset_commit_callback

if self.config['api_version'] >= (0, 9) and self.config['group_id'] is not None:
assert self.config['assignors'], 'Coordinator requires assignors'

self._subscription = subscription
self._metadata_snapshot = self._build_metadata_snapshot(subscription, client.cluster)
self._assignment_snapshot = None
Expand All @@ -97,6 +91,19 @@ def __init__(self, client, subscription, metrics, **configs):
self.next_auto_commit_deadline = None
self.completed_offset_commits = collections.deque()

if self.config['default_offset_commit_callback'] is None:
self.config['default_offset_commit_callback'] = self._default_offset_commit_callback

if self.config['group_id'] is not None:
if self.config['api_version'] >= (0, 9):
if not self.config['assignors']:
raise Errors.KafkaConfigurationError('Coordinator requires assignors')
if self.config['api_version'] < (0, 10, 1):
if self.config['max_poll_interval_ms'] != self.config['session_timeout_ms']:
raise Errors.KafkaConfigurationError("Broker version %s does not support "
"different values for max_poll_interval_ms "
"and session_timeout_ms")

if self.config['enable_auto_commit']:
if self.config['api_version'] < (0, 8, 1):
log.warning('Broker version (%s) does not support offset'
Expand Down