You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@kafka.apache.org by Galus <gi...@git.apache.org> on 2017/09/29 19:48:35 UTC

[GitHub] kafka pull request #3995: KAFKA-5514 KafkaConsumer ignores default values in...

GitHub user Galus opened a pull request:

    https://github.com/apache/kafka/pull/3995

    KAFKA-5514 KafkaConsumer ignores default values in Properties object because of incorrect use of Properties object.

    This problem plagues anywhere Properties are being misused. I have this issue with KafkaProducer(Properties properties) constructor. I bet this problem spans across more classes just like this KafkaConsumer(Properties properties).
    
    Clarification:
    
    putAll is implemented in Hashtable.java and at that point we are already too late.
    When we cast to Map/Hashtable we lose  Properties's 'defaults member which is another Properties object. Whenever you use Properties's getProperty() method, if the Property object does not explicity contain the property, it will refer to it's internal defaults Properties object which can be set as so:
    Properties myProps = new Properties(oldProperties)
    if oldProperties has a key:value of foo:bar
    calling myProps.get(foo) will not return bar
    whereas, calling myProps.getProperty(foo) will return bar
    
    Reference:
    
    
    ```
    public
    class Properties extends Hashtable<Object,Object> {
    ...
        /**
         * A property list that contains default values for any keys not
         * found in this property list.
         *
         * @serial
         */
        protected Properties defaults;
    
        /**
         * Creates an empty property list with the specified defaults.
         *
         * @param   defaults   the defaults.
         */
        public Properties(Properties defaults) {
            this.defaults = defaults;
        }
    ...
        public String getProperty(String key) {
            Object oval = super.get(key);
            String sval = (oval instanceof String) ? (String)oval : null;
            return ((sval == null) && (defaults != null)) ? defaults.getProperty(key) : sval;
        }
    ...
    ```
    
    
    
    Here is the fix:
    
    ```
            for (final String name: properties.stringPropertyNames()) {
                if (properties.get(name) == null) {
                    map.put(name, properties.getProperty(name));
                }
            }
    ```
    
    
    This pulls all the 'default' inner Properties object's entries up into the outer level Properties object.
    This should be applied to all the public methods that are being passed in a Properties object
    See https://github.com/Galus/kafka/commit/8af611dfd9c8f3cb37f1d2b400890525c5a646d3 and https://github.com/Galus/kafka/commit/130b4cde2da4d9ede7aa6d6a99997af32d1a00fc
    
    
    Similar Issues addressing this issue: KAFKA-2184, KAFKA-3049, KAFKA-3161
    @Kamal15 
    
    This contribution is my original work and I hereby license it for use by the apache kafka project's open source license.

You can merge this pull request into a Git repository by running:

    $ git pull https://github.com/Galus/kafka trunk

Alternatively you can review and apply these changes as the patch at:

    https://github.com/apache/kafka/pull/3995.patch

To close this pull request, make a commit to your master/trunk branch
with (at least) the following in the commit message:

    This closes #3995
    
----
commit 8053f294ff938c6cc295b42f8afa6bec2eb5dc75
Author: Galus <mg...@gmail.com>
Date:   2017-09-29T19:15:07Z

    KAFKA-5514 Better Handling Of Properties
    
    KafkaProducer update.

commit 8af611dfd9c8f3cb37f1d2b400890525c5a646d3
Author: Galus <mg...@gmail.com>
Date:   2017-09-29T19:29:34Z

    KAFKA-5514 Better Properties Handling
    
    Fixes KafkaConsumer's inability to handle Properties object's inner Properties object 'defaults'

commit 130b4cde2da4d9ede7aa6d6a99997af32d1a00fc
Author: Galus <mg...@gmail.com>
Date:   2017-09-29T19:31:56Z

    KAFKA-5514 Better Properties Handling
    
    Fixes KafkaProducer's inability to handle Properties object's inner Properties object 'defaults'

----


---