zookeeper-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "ASF GitHub Bot (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (ZOOKEEPER-2901) Session ID that is negative causes mis-calculation of Ephemeral Type
Date Thu, 22 Feb 2018 06:39:00 GMT

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

ASF GitHub Bot commented on ZOOKEEPER-2901:
-------------------------------------------

Github user anmolnar commented on a diff in the pull request:

    https://github.com/apache/zookeeper/pull/377#discussion_r169865059
  
    --- Diff: src/java/main/org/apache/zookeeper/server/EphemeralType.java ---
    @@ -37,41 +77,152 @@
         /**
          * TTL node
          */
    -    TTL;
    +    TTL() {
    +        @Override
    +        public long maxValue() {
    +            return EXTENDED_FEATURE_VALUE_MASK;  // 12725 days, about 34 years
    +        }
    +
    +        @Override
    +        public long toEphemeralOwner(long ttl) {
    +            if ((ttl > TTL.maxValue()) || (ttl <= 0)) {
    +                throw new IllegalArgumentException("ttl must be positive and cannot be
larger than: " + TTL.maxValue());
    +            }
    +            //noinspection PointlessBitwiseExpression
    +            return EXTENDED_MASK | EXTENDED_BIT_TTL | ttl;  // TTL_RESERVED_BIT is actually
zero - but it serves to document that the proper extended bit needs to be set
    +        }
    +
    +        @Override
    +        public long getValue(long ephemeralOwner) {
    +            return getExtendedFeatureValue(ephemeralOwner);
    +        }
    +    };
    +
    +    /**
    +     * For types that support it, the maximum extended value
    +     *
    +     * @return 0 or max
    +     */
    +    public long maxValue() {
    +        return 0;
    +    }
    +
    +    /**
    +     * For types that support it, convert a value to an extended ephemeral owner
    +     *
    +     * @return 0 or extended ephemeral owner
    +     */
    +    public long toEphemeralOwner(long value) {
    +        return 0;
    +    }
    +
    +    /**
    +     * For types that support it, return the extended value from an extended ephemeral
owner
    +     *
    +     * @return 0 or extended value
    +     */
    +    public long getValue(long ephemeralOwner) {
    +        return 0;
    +    }
     
         public static final long CONTAINER_EPHEMERAL_OWNER = Long.MIN_VALUE;
    -    public static final long MAX_TTL = 0x0fffffffffffffffL;
    -    public static final long TTL_MASK = 0x8000000000000000L;
    +    public static final long MAX_EXTENDED_SERVER_ID = 0xfe;  // 254
    +
    +    private static final long EXTENDED_MASK = 0xff00000000000000L;
    +    private static final long EXTENDED_BIT_TTL = 0x0000;
    +    private static final long RESERVED_BITS_MASK = 0x00ffff0000000000L;
    +    private static final long RESERVED_BITS_SHIFT = 40;
    +
    +    private static final Map<Long, EphemeralType> extendedFeatureMap;
     
    +    static {
    +        Map<Long, EphemeralType> map = new HashMap<>();
    +        map.put(EXTENDED_BIT_TTL, TTL);
    +        extendedFeatureMap = Collections.unmodifiableMap(map);
    +    }
    +
    +    private static final long EXTENDED_FEATURE_VALUE_MASK = ~(EXTENDED_MASK | RESERVED_BITS_MASK);
    +
    +    // Visible for testing
    +    static final String EXTENDED_TYPES_ENABLED_PROPERTY = "zookeeper.extendedTypesEnabled";
    +    static final String TTL_3_5_3_EMULATION_PROPERTY = "zookeeper.emulate353TTLNodes";
    +
    +    /**
    +     * Return true if extended ephemeral types are enabled
    +     *
    +     * @return true/false
    +     */
    +    public static boolean extendedEphemeralTypesEnabled() {
    --- End diff --
    
    Maybe I'm missing the point here. Would you please elaborate a little bit on what's the
additional benefit of making this generic by extended ephemeral types?
    Why don't you just KISS (keep it simple), because YAGNI (you ain't gonna need) the extended
types?


> Session ID that is negative causes mis-calculation of Ephemeral Type
> --------------------------------------------------------------------
>
>                 Key: ZOOKEEPER-2901
>                 URL: https://issues.apache.org/jira/browse/ZOOKEEPER-2901
>             Project: ZooKeeper
>          Issue Type: Bug
>          Components: server
>    Affects Versions: 3.5.3
>         Environment: Running 3.5.3-beta in Docker container
>            Reporter: Mark Johnson
>            Assignee: Jordan Zimmerman
>            Priority: Blocker
>
> In the code that determines the EphemeralType it is looking at the owner (which is the
client ID or connection ID):
> EphemeralType.java:
>    public static EphemeralType get(long ephemeralOwner) {
>        if (ephemeralOwner == CONTAINER_EPHEMERAL_OWNER) {
>            return CONTAINER;
>        }
>        if (ephemeralOwner < 0) {
>            return TTL;
>        }
>        return (ephemeralOwner == 0) ? VOID : NORMAL;
>    }
> However my connection ID is:
> header.getClientId(): -720548323429908480
> This causes the code to think this is a TTL Ephemeral node instead of a
> NORMAL Ephemeral node.
> This also explains why this is random - if my client ID is non-negative
> then the node gets added correctly.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Mime
View raw message