[ https://issues.apache.org/jira/browse/ZOOKEEPER-2901?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16372909#comment-16372909 ]
ASF GitHub Bot commented on ZOOKEEPER-2901: ------------------------------------------- Github user Randgalt commented on a diff in the pull request: https://github.com/apache/zookeeper/pull/377#discussion_r169985373 --- 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 -- The way it's implemented now, we can add easily new features in the future. Why code ourselves into a corner when we can leave some room? BTW - I'd discussed this offline with @phunt > 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)