48
48
struct Producer_msgstate {
49
49
Handle * self ;
50
50
PyObject * dr_cb ;
51
- PyObject * partitioner_cb ;
52
51
};
53
52
54
53
@@ -58,32 +57,23 @@ struct Producer_msgstate {
58
57
*/
59
58
static __inline struct Producer_msgstate *
60
59
Producer_msgstate_new (Handle * self ,
61
- PyObject * dr_cb , PyObject * partitioner_cb ) {
60
+ PyObject * dr_cb ) {
62
61
struct Producer_msgstate * msgstate ;
63
62
64
- if (!dr_cb && !partitioner_cb )
65
- return NULL ;
66
-
67
63
msgstate = calloc (1 , sizeof (* msgstate ));
68
64
msgstate -> self = self ;
69
65
70
66
if (dr_cb ) {
71
67
msgstate -> dr_cb = dr_cb ;
72
68
Py_INCREF (dr_cb );
73
69
}
74
- if (partitioner_cb ) {
75
- msgstate -> partitioner_cb = partitioner_cb ;
76
- Py_INCREF (partitioner_cb );
77
- }
78
70
return msgstate ;
79
71
}
80
72
81
73
static __inline void
82
74
Producer_msgstate_destroy (struct Producer_msgstate * msgstate ) {
83
75
if (msgstate -> dr_cb )
84
76
Py_DECREF (msgstate -> dr_cb );
85
- if (msgstate -> partitioner_cb )
86
- Py_DECREF (msgstate -> partitioner_cb );
87
77
free (msgstate );
88
78
}
89
79
@@ -93,10 +83,6 @@ static void Producer_clear0 (Handle *self) {
93
83
Py_DECREF (self -> u .Producer .default_dr_cb );
94
84
self -> u .Producer .default_dr_cb = NULL ;
95
85
}
96
- if (self -> u .Producer .partitioner_cb ) {
97
- Py_DECREF (self -> u .Producer .partitioner_cb );
98
- self -> u .Producer .partitioner_cb = NULL ;
99
- }
100
86
}
101
87
102
88
static int Producer_clear (Handle * self ) {
@@ -128,8 +114,6 @@ static int Producer_traverse (Handle *self,
128
114
visitproc visit , void * arg ) {
129
115
if (self -> u .Producer .default_dr_cb )
130
116
Py_VISIT (self -> u .Producer .default_dr_cb );
131
- if (self -> u .Producer .partitioner_cb )
132
- Py_VISIT (self -> u .Producer .partitioner_cb );
133
117
134
118
Handle_traverse (self , visit , arg );
135
119
@@ -191,71 +175,6 @@ static void dr_msg_cb (rd_kafka_t *rk, const rd_kafka_message_t *rkm,
191
175
}
192
176
193
177
194
- /**
195
- * FIXME: The partitioner is currently broken due to threading/GIL issues.
196
- */
197
- int32_t Producer_partitioner_cb (const rd_kafka_topic_t * rkt ,
198
- const void * keydata ,
199
- size_t keylen ,
200
- int32_t partition_cnt ,
201
- void * rkt_opaque , void * msg_opaque ) {
202
- Handle * self = rkt_opaque ;
203
- struct Producer_msgstate * msgstate = msg_opaque ;
204
- PyGILState_STATE gstate ;
205
- PyObject * result ;
206
- PyObject * args ;
207
- int32_t r = RD_KAFKA_PARTITION_UA ;
208
-
209
- if (!msgstate ) {
210
- /* Fall back on default C partitioner if neither a per-msg
211
- * partitioner nor a default Python partitioner is available */
212
- return self -> u .Producer .c_partitioner_cb (rkt , keydata , keylen ,
213
- partition_cnt ,
214
- rkt_opaque , msg_opaque );
215
- }
216
-
217
- gstate = PyGILState_Ensure ();
218
-
219
- if (!msgstate -> partitioner_cb ) {
220
- /* Fall back on default C partitioner if neither a per-msg
221
- * partitioner nor a default Python partitioner is available */
222
- r = msgstate -> self -> u .Producer .c_partitioner_cb (rkt ,
223
- keydata , keylen ,
224
- partition_cnt ,
225
- rkt_opaque ,
226
- msg_opaque );
227
- goto done ;
228
- }
229
-
230
- args = Py_BuildValue ("(s#l)" ,
231
- (const char * )keydata , (int )keylen ,
232
- (long )partition_cnt );
233
- if (!args ) {
234
- cfl_PyErr_Format (RD_KAFKA_RESP_ERR__FAIL ,
235
- "Unable to build callback args" );
236
- goto done ;
237
- }
238
-
239
-
240
- result = PyObject_CallObject (msgstate -> partitioner_cb , args );
241
- Py_DECREF (args );
242
-
243
- if (result ) {
244
- r = (int32_t )cfl_PyInt_AsInt (result );
245
- if (PyErr_Occurred ())
246
- printf ("FIXME: partition_cb returned wrong type "
247
- "(expected long), how to propagate?\n" );
248
- Py_DECREF (result );
249
- } else {
250
- printf ("FIXME: partitioner_cb crashed, how to propagate?\n" );
251
- }
252
-
253
- done :
254
- PyGILState_Release (gstate );
255
- return r ;
256
- }
257
-
258
-
259
178
#if HAVE_PRODUCEV
260
179
static rd_kafka_resp_err_t
261
180
Producer_producev (Handle * self ,
@@ -313,7 +232,7 @@ static PyObject *Producer_produce (Handle *self, PyObject *args,
313
232
const char * topic , * value = NULL , * key = NULL ;
314
233
int value_len = 0 , key_len = 0 ;
315
234
int partition = RD_KAFKA_PARTITION_UA ;
316
- PyObject * headers = NULL , * dr_cb = NULL , * dr_cb2 = NULL , * partitioner_cb = NULL ;
235
+ PyObject * headers = NULL , * dr_cb = NULL , * dr_cb2 = NULL ;
317
236
long long timestamp = 0 ;
318
237
rd_kafka_resp_err_t err ;
319
238
struct Producer_msgstate * msgstate ;
@@ -327,17 +246,16 @@ static PyObject *Producer_produce (Handle *self, PyObject *args,
327
246
"partition" ,
328
247
"callback" ,
329
248
"on_delivery" , /* Alias */
330
- "partitioner" ,
331
249
"timestamp" ,
332
250
"headers" ,
333
251
NULL };
334
252
335
253
if (!PyArg_ParseTupleAndKeywords (args , kwargs ,
336
- "s|z#z#iOOOLO "
254
+ "s|z#z#iOOLO "
337
255
, kws ,
338
256
& topic , & value , & value_len ,
339
257
& key , & key_len , & partition ,
340
- & dr_cb , & dr_cb2 , & partitioner_cb ,
258
+ & dr_cb , & dr_cb2 ,
341
259
& timestamp , & headers ))
342
260
return NULL ;
343
261
@@ -376,13 +294,10 @@ static PyObject *Producer_produce (Handle *self, PyObject *args,
376
294
377
295
if (!dr_cb || dr_cb == Py_None )
378
296
dr_cb = self -> u .Producer .default_dr_cb ;
379
- if (!partitioner_cb || partitioner_cb == Py_None )
380
- partitioner_cb = self -> u .Producer .partitioner_cb ;
381
-
382
297
383
298
/* Create msgstate if necessary, may return NULL if no callbacks
384
299
* are wanted. */
385
- msgstate = Producer_msgstate_new (self , dr_cb , partitioner_cb );
300
+ msgstate = Producer_msgstate_new (self , dr_cb );
386
301
387
302
/* Produce message */
388
303
#if HAVE_PRODUCEV
@@ -503,8 +418,8 @@ static PyMethodDef Producer_methods[] = {
503
418
" :param str topic: Topic to produce message to\n"
504
419
" :param str|bytes value: Message payload\n"
505
420
" :param str|bytes key: Message key\n"
506
- " :param int partition: Partition to produce to, elses uses the "
507
- "configured partitioner.\n"
421
+ " :param int partition: Partition to produce to, else uses the "
422
+ "configured built-in partitioner.\n"
508
423
" :param func on_delivery(err,msg): Delivery report callback to call "
509
424
"(from :py:func:`poll()` or :py:func:`flush()`) on successful or "
510
425
"failed delivery\n"
0 commit comments