[ 
https://issues.apache.org/jira/browse/KAFKA-5859?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16224279#comment-16224279
 ] 

Sean Glover edited comment on KAFKA-5859 at 10/30/17 1:15 AM:
--------------------------------------------------------------

Hey [~ijuma].  I've been analyzing the work required for this ticket.  I'm new 
to Kafka, so I'm new to the codebase.  I understand that the parsed request is 
mostly just used in `KafkaApis.handle`, but to [~huxi_2b]'s point there are a 
few places in `RequestChannel.Request` that need a parsed request.

* `updateRequestMetrics` - Checks to see if the parsed request is a 
`FetchRequest` to access the `isFromFollower` value.  [~huxi_2b] already 
pointed this out.  What do you mean that "it needs the `ApiKeys` instance"?  
* `updateRequestMetrics`  - Requires the parsed size of the request in bytes to 
update the `requestBytesHist` metric
* `updateRequestMetrics` - Calls `requestDesc(true)` or `requestDesc(false)` 
depending on whether trace logging enabled.  It looks like it's used when 
request logging is enabled.
* `Request` constructor has a trace logging line that calls `requestDesc(true)`

I could parse the request in the `Request` constructor and generate a 
detailed/non-detailed request representations (equivalent to 
`requestTrue(true|false)`), but not keep the actual `AbstractRequest`.  What do 
you think?


was (Author: seglo):
Hey [~ijuma].  I've been analyzing the work required for this ticket.  I'm new 
to Kafka, so I'm new to the codebase.  I understand that the parsed request is 
mostly just used in `KafkaApis.handle`, but to [~huxi_2b]'s point there are a 
few places in `RequestChannel.Request` that need a parsed request.

* `updateRequestMetrics`
  * Checks to see if the parsed request is a `FetchRequest` to access the 
`isFromFollower` value.  [~huxi_2b] already pointed this out.  What do you mean 
that "it needs the `ApiKeys` instance"?  
  * Requires the parsed size of the request in bytes to update the 
`requestBytesHist` metric
  * Calls `requestDesc(true)` or `requestDesc(false)` depending on whether 
trace logging enabled.  It looks like it's used when request logging is enabled.
* `Request` constructor has a trace logging line that calls `requestDesc(true)`

I could parse the request in the `Request` constructor and generate a 
detailed/non-detailed request representations (equivalent to 
`requestTrue(true|false)`), but not keep the actual `AbstractRequest`.  What do 
you think?

> Avoid retaining AbstractRequest in RequestChannel.Request
> ---------------------------------------------------------
>
>                 Key: KAFKA-5859
>                 URL: https://issues.apache.org/jira/browse/KAFKA-5859
>             Project: Kafka
>          Issue Type: Improvement
>            Reporter: Ismael Juma
>            Assignee: Sean Glover
>            Priority: Minor
>              Labels: newbie
>
> We currently store AbstractRequest in RequestChannel.Request.bodyAndSize. 
> RequestChannel.Request is, in turn, stored in RequestChannel.Response. We 
> keep the latter until the response is sent to the client.
> However, after KafkaApis.handle, we no longer need AbstractRequest apart from 
> its string representation for logging. We could potentially replace 
> AbstractRequest with a String representation (if the relevant logging is 
> enabled). The String representation is generally small while some 
> AbstractRequest subclasses can be pretty large. The largest one is 
> ProduceRequest and we clear the underlying ByteBuffer explicitly in 
> KafkaApis.handleProduceRequest. We could potentially remove that special case 
> if AbstractRequest subclasses were not retained.
> This was originally suggested by [~hachikuji] in the following PR 
> https://github.com/apache/kafka/pull/3801#discussion_r137592277



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to