Skip to content

Commit 1dd2e1e

Browse files
dangraedenhill
authored andcommitted
Implement pause/resume support (closes confluentinc#120, @dangra)
* Implement pause/resume support. Closes confluentinc#120 * Add basic test case for pause/resume methods * fix typo in method documentation * do not leak c_parts on pause/resume
1 parent 99f8eac commit 1dd2e1e

File tree

2 files changed

+79
-0
lines changed

2 files changed

+79
-0
lines changed

confluent_kafka/src/Consumer.c

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -649,6 +649,55 @@ static PyObject *Consumer_position (Handle *self, PyObject *args,
649649
return plist;
650650
}
651651

652+
static PyObject *Consumer_pause(Handle *self, PyObject *args,
653+
PyObject *kwargs) {
654+
655+
PyObject *plist;
656+
rd_kafka_topic_partition_list_t *c_parts;
657+
rd_kafka_resp_err_t err;
658+
static char *kws[] = {"partitions", NULL};
659+
660+
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", kws, &plist))
661+
return NULL;
662+
663+
if (!(c_parts = py_to_c_parts(plist)))
664+
return NULL;
665+
666+
err = rd_kafka_pause_partitions(self->rk, c_parts);
667+
rd_kafka_topic_partition_list_destroy(c_parts);
668+
if (err) {
669+
cfl_PyErr_Format(err,
670+
"Failed to pause partitions: %s",
671+
rd_kafka_err2str(err));
672+
return NULL;
673+
}
674+
Py_RETURN_NONE;
675+
}
676+
677+
static PyObject *Consumer_resume (Handle *self, PyObject *args,
678+
PyObject *kwargs) {
679+
680+
PyObject *plist;
681+
rd_kafka_topic_partition_list_t *c_parts;
682+
rd_kafka_resp_err_t err;
683+
static char *kws[] = {"partitions", NULL};
684+
685+
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", kws, &plist))
686+
return NULL;
687+
688+
if (!(c_parts = py_to_c_parts(plist)))
689+
return NULL;
690+
691+
err = rd_kafka_resume_partitions(self->rk, c_parts);
692+
rd_kafka_topic_partition_list_destroy(c_parts);
693+
if (err) {
694+
cfl_PyErr_Format(err,
695+
"Failed to resume partitions: %s",
696+
rd_kafka_err2str(err));
697+
return NULL;
698+
}
699+
Py_RETURN_NONE;
700+
}
652701

653702
static PyObject *Consumer_get_watermark_offsets (Handle *self, PyObject *args,
654703
PyObject *kwargs) {
@@ -1063,6 +1112,30 @@ static PyMethodDef Consumer_methods[] = {
10631112
" :raises: RuntimeError if called on a closed consumer\n"
10641113
"\n"
10651114
},
1115+
{ "pause", (PyCFunction)Consumer_pause,
1116+
METH_VARARGS|METH_KEYWORDS,
1117+
".. py:function:: pause(partitions)\n"
1118+
"\n"
1119+
" Pause consumption for the provided list of partitions.\n"
1120+
"\n"
1121+
" :param list(TopicPartition) partitions: List of topic+partitions "
1122+
"to pause.\n"
1123+
" :rtype: None\n"
1124+
" :raises: KafkaException\n"
1125+
"\n"
1126+
},
1127+
{ "resume", (PyCFunction)Consumer_resume,
1128+
METH_VARARGS|METH_KEYWORDS,
1129+
".. py:function:: resume(partitions)\n"
1130+
"\n"
1131+
" Resume consumption for the provided list of partitions.\n"
1132+
"\n"
1133+
" :param list(TopicPartition) partitions: List of topic+partitions "
1134+
"to resume.\n"
1135+
" :rtype: None\n"
1136+
" :raises: KafkaException\n"
1137+
"\n"
1138+
},
10661139
{ "get_watermark_offsets", (PyCFunction)Consumer_get_watermark_offsets,
10671140
METH_VARARGS|METH_KEYWORDS,
10681141
".. py:function:: get_watermark_offsets(partition, [timeout=None], [cached=False])\n"

tests/test_Consumer.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,12 @@ def dummy_assign_revoke(consumer, partitions):
5959
assignment = kc.assignment()
6060
assert partitions == assignment
6161

62+
# Pause partitions
63+
kc.pause(partitions)
64+
65+
# Resume partitions
66+
kc.resume(partitions)
67+
6268
# Get cached watermarks, should all be invalid.
6369
lo, hi = kc.get_watermark_offsets(partitions[0], cached=True)
6470
assert lo == -1001 and hi == -1001

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy