static rd_kafka_message_t * rd_kafka_message_setup (rd_kafka_op_t *rko, rd_kafka_message_t *rkmessage) { rd_kafka_itopic_t *rkt; rd_kafka_toppar_t *rktp = NULL; if (rko->rko_type == RD_KAFKA_OP_DR) { rkt = rd_kafka_topic_s2i(rko->rko_u.dr.s_rkt); } else { if (rko->rko_rktp) { rktp = rd_kafka_toppar_s2i(rko->rko_rktp); rkt = rktp->rktp_rkt; } else rkt = NULL; rkmessage->_private = rko; } if (!rkmessage->rkt && rkt) rkmessage->rkt = rd_kafka_topic_keep_a(rkt); if (rktp) rkmessage->partition = rktp->rktp_partition; if (!rkmessage->err) rkmessage->err = rko->rko_err; return rkmessage; }
rd_kafka_message_t *rd_kafka_message_get (rd_kafka_op_t *rko) { rd_kafka_message_t *rkmessage; if (rko) { rkmessage = &rko->rko_rkmessage; rkmessage->_private = rko; if (!rkmessage->rkt && rko->rko_rktp) rkmessage->rkt = rd_kafka_topic_keep_a( rd_kafka_toppar_s2i(rko->rko_rktp)-> rktp_rkt); } else rkmessage = rd_kafka_message_new(); return rkmessage; }
/** * Take action when the offset for a toppar becomes unusable. * * Locality: toppar handler thread * Locks: toppar_lock() MUST be held */ void rd_kafka_offset_reset (rd_kafka_toppar_t *rktp, int64_t err_offset, rd_kafka_resp_err_t err, const char *reason) { int64_t offset = RD_KAFKA_OFFSET_ERROR; rd_kafka_op_t *rko; int64_t offset_reset = rktp->rktp_rkt->rkt_conf.auto_offset_reset; /* Enqueue op for toppar handler thread if we're on the wrong thread. */ if (!thrd_is_current(rktp->rktp_rkt->rkt_rk->rk_thread)) { rd_kafka_op_t *rko = rd_kafka_op_new(RD_KAFKA_OP_CALLBACK); rko->rko_op_cb = rd_kafka_offset_reset_op_cb; rko->rko_rktp = rd_kafka_toppar_keep(rktp); rko->rko_err = err; rko->rko_offset = err_offset; rko->rko_flags |= RD_KAFKA_OP_F_FREE; rko->rko_payload = rd_strdup(reason); rko->rko_len = strlen(reason); rd_kafka_q_enq(&rktp->rktp_ops, rko); return; } if (!err) { /* No error: Logical offset lookup */ rktp->rktp_query_offset = err_offset; offset = err_offset; rd_kafka_toppar_set_fetch_state( rktp, RD_KAFKA_TOPPAR_FETCH_OFFSET_QUERY); } else if (offset_reset == RD_KAFKA_OFFSET_END || offset_reset == RD_KAFKA_OFFSET_BEGINNING || offset_reset <= RD_KAFKA_OFFSET_TAIL_BASE) { /* Error, use auto.offset.reset */ offset = rktp->rktp_rkt->rkt_conf.auto_offset_reset; rktp->rktp_query_offset = offset; rd_kafka_toppar_set_fetch_state( rktp, RD_KAFKA_TOPPAR_FETCH_OFFSET_QUERY); } else if (offset_reset == RD_KAFKA_OFFSET_ERROR) { /* Error, auto.offset.reset tells us to error out. */ rko = rd_kafka_op_new(RD_KAFKA_OP_CONSUMER_ERR); rko->rko_err = err; rko->rko_rkmessage.offset = err_offset; rko->rko_rkmessage.partition = rktp->rktp_partition; rko->rko_payload = rd_strdup(reason); rko->rko_len = strlen(rko->rko_payload); rko->rko_flags |= RD_KAFKA_OP_F_FREE; rko->rko_rkmessage.rkt = rd_kafka_topic_keep_a(rktp->rktp_rkt); rd_kafka_q_enq(&rktp->rktp_fetchq, rko); rd_kafka_toppar_set_fetch_state( rktp, RD_KAFKA_TOPPAR_FETCH_NONE); } rd_kafka_dbg(rktp->rktp_rkt->rkt_rk, TOPIC, "OFFSET", "%s [%"PRId32"]: offset reset (at offset %s) " "to %s: %s: %s", rktp->rktp_rkt->rkt_topic->str, rktp->rktp_partition, rd_kafka_offset2str(err_offset), rd_kafka_offset2str(offset), reason, rd_kafka_err2str(err)); if (rktp->rktp_fetch_state == RD_KAFKA_TOPPAR_FETCH_OFFSET_QUERY) rd_kafka_toppar_offset_request(rktp, rktp->rktp_query_offset,0); }