Why disconnect the client on a InvalidRequestException? The 2 errors
you are catching are both topic-level: (1) multiple requests for the
same topic, and (2) ReplicaAssignment and num_partitions /
replication_factor both set. Wouldn't it be better to just error the
offending create_topic_request, not the entire connection? The
CreateTopicsResponse returns a map of topics to error codes. You could
just return the topic that caused the error and an
InvalidRequestException error code.

-Dana

On Thu, Jun 16, 2016 at 8:37 AM, Grant Henke <ghe...@cloudera.com> wrote:
> I have updated the wiki and pull request based on the feedback. If there
> are no objections I will start a vote at the end of the day.
>
> Details for this implementation can be read here:
> https://cwiki.apache.org/confluence/display/KAFKA/KIP-4+-+Command+line+and+centralized+administrative+operations#KIP-4-Commandlineandcentralizedadministrativeoperations-CreateTopicRequest
>
> The updated pull request can be found here (feel free to review):
> https://github.com/apache/kafka/pull/1489
>
> Below is the exact content for clarity:
>
>> Create Topics Request (KAFKA-2945
>> <https://issues.apache.org/jira/browse/KAFKA-2945>)
>>
>>
>>
>> CreateTopics Request (Version: 0) => [create_topic_requests] timeout
>>   create_topic_requests => topic num_partitions replication_factor 
>> [replica_assignment] [configs]
>>     topic => STRING
>>     num_partitions => INT32
>>     replication_factor => INT16
>>     replica_assignment => partition_id [replicas]
>>       partition_id => INT32
>>       replicas => INT32
>>     configs => config_key config_value
>>       config_key => STRING
>>       config_value => STRING
>>   timeout => INT32
>>
>> CreateTopicsRequest is a batch request to initiate topic creation with
>> either predefined or automatic replica assignment and optionally topic
>> configuration.
>>
>> Request semantics:
>>
>>    1. Must be sent to the controller broker
>>    2. If there are multiple instructions for the same topic in one
>>    request an InvalidRequestException will be logged on the broker and the
>>    client will be disconnected.
>>       - This is because the list of topics is modeled server side as a
>>       map with TopicName as the key
>>    3. The principal must be authorized to the "Create" Operation on the
>>    "Cluster" resource to create topics.
>>       - Unauthorized requests will receive a ClusterAuthorizationException
>>    4.
>>
>>    Only one from ReplicaAssignment or (num_partitions + replication_factor
>>    ), can be defined in one instruction.
>>    - If both parameters are specified an InvalidRequestException will be
>>       logged on the broker and the client will be disconnected.
>>       - In the case ReplicaAssignment is defined number of partitions and
>>       replicas will be calculated from the supplied replica_assignment.
>>       - In the case of defined (num_partitions + replication_factor)
>>       replica assignment will be automatically generated by the server.
>>       - One or the other must be defined. The existing broker side auto
>>       create defaults will not be used
>>       (default.replication.factor, num.partitions). The client 
>> implementation can
>>       have defaults for these options when generating the messages.
>>       - The first replica in [replicas] is assumed to be the preferred
>>       leader. This matches current behavior elsewhere.
>>    5. Setting a timeout > 0 will allow the request to block until the
>>    topic metadata is "complete" on the controller node.
>>       - Complete means the local topic metadata cache been completely
>>       populated and all partitions have leaders
>>          - The topic metadata is updated when the controller sends out
>>          update metadata requests to the brokers
>>       - If a timeout error occurs, the topic could still be created
>>       successfully at a later time. Its up to the client to query for the 
>> state
>>       at that point.
>>    6. Setting a timeout <= 0 will validate arguments and trigger the
>>    create topics and return immediately.
>>       - This is essentially the fully asynchronous mode we have in the
>>       Zookeeper tools today.
>>       - The error code in the response will either contain an argument
>>       validation exception or a timeout exception. If you receive a timeout
>>       exception, because you asked for 0 timeout, you can assume the message 
>> was
>>       valid and the topic creation was triggered.
>>    7. The request is not transactional.
>>       1. If an error occurs on one topic, the others could still be
>>       created.
>>       2. Errors are reported independently.
>>
>> QA:
>>
>>    - Why is CreateTopicsRequest a batch request?
>>       - Scenarios where tools or admins want to create many topics should
>>       be able to with fewer requests
>>       - Example: MirrorMaker may want to create the topics downstream
>>    - What happens if some topics error immediately? Will it
>>    return immediately?
>>       - The request will block until all topics have either been created,
>>       errors, or the timeout has been hit
>>       - There is no "short circuiting" where 1 error stops the other
>>       topics from being created
>>    - Why implement "partial blocking" instead of fully async or fully
>>    consistent?
>>       - See Cluster Consistent Blocking
>>       
>> <https://cwiki.apache.org/confluence/display/KAFKA/KIP-4+-+Command+line+and+centralized+administrative+operations#KIP-4-Commandlineandcentralizedadministrativeoperations-cluster-consistent-blocking>
>>        below
>>    - Why require the request to go to the controller?
>>       - The controller is responsible for the cluster metadata and
>>       its propagation
>>       - See Request Forwarding
>>       
>> <https://cwiki.apache.org/confluence/display/KAFKA/KIP-4+-+Command+line+and+centralized+administrative+operations#KIP-4-Commandlineandcentralizedadministrativeoperations-request>
>>        below
>>
>> Create Topics Response
>>
>>
>>
>> CreateTopics Response (Version: 0) => [topic_error_codes]
>>   topic_error_codes => topic error_code
>>     topic => STRING
>>     error_code => INT16
>>
>> CreateTopicsResponse contains a map between topic and topic creation
>> result error code (see New Protocol Errors
>> <https://cwiki.apache.org/confluence/display/KAFKA/KIP-4+-+Command+line+and+centralized+administrative+operations#KIP-4-Commandlineandcentralizedadministrativeoperations-NewProtocolErrors>
>> ).
>>
>>
> Thank you,
> Grant
>
>
> On Wed, Jun 15, 2016 at 4:11 PM, Grant Henke <ghe...@cloudera.com> wrote:
>
>> Turns out we already have an InvalidRequestException:
>> https://github.com/apache/kafka/blob/trunk/core/src/main/scala/kafka/network/RequestChannel.scala#L75-L98
>>
>> We just don't map it in Errors.java so it results in an UNKNOWN error when
>> sent back to the client.
>>
>> I will migrate the InvalidRequestException to the client package, add it
>> to Errors and use that to signify any protocol parsing/rule errors.
>>
>>
>>
>> On Wed, Jun 15, 2016 at 2:55 PM, Dana Powers <dana.pow...@gmail.com>
>> wrote:
>>
>>> On Wed, Jun 15, 2016 at 12:19 PM, Ismael Juma <ism...@juma.me.uk> wrote:
>>> > Hi Grant,
>>> >
>>> > Comments below.
>>> >
>>> > On Wed, Jun 15, 2016 at 6:52 PM, Grant Henke <ghe...@cloudera.com>
>>> wrote:
>>> >>
>>> >> The one thing I want to avoid is to many super specific error codes. I
>>> am
>>> >> not sure how much of a problem it really is but in the case of wire
>>> >> protocol errors like multiple instances of the same topic, do you have
>>> any
>>> >> thoughts on the error? Should we make a generic InvalidRequest error
>>> and
>>> >> log the detailed message on the broker for client authors to debug?
>>> >>
>>> >
>>> > That is a good question. It would be good to get input from client
>>> > developers like Dana on this.
>>>
>>> I think generic error codes are fine if the wire protocol requirements
>>> are documented [i.e., no duplicate topics and partitions/replicas are
>>> either/or not both]. If I get a broker error at the protocol level
>>> that I don't understand, the first place I look is the protocol docs.
>>> It may cause a few more emails to the mailing lists asking for
>>> clarification, but I think those will be easier to triage than
>>> confused emails like "I said create topic with 10 partitions, but I
>>> only got 5???"
>>>
>>> -Dana
>>>
>>
>>
>>
>> --
>> Grant Henke
>> Software Engineer | Cloudera
>> gr...@cloudera.com | twitter.com/gchenke | linkedin.com/in/granthenke
>>
>
>
>
> --
> Grant Henke
> Software Engineer | Cloudera
> gr...@cloudera.com | twitter.com/gchenke | linkedin.com/in/granthenke

Reply via email to