)]}'
{"tooz/drivers/redis.py":[{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"7a51c93a287661b7ead2925882330fee72ca9188","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        timeout \u003d options.get(\u0027timeout\u0027, [self._CLIENT_DEFAULT_SOCKET_TO])"},{"line_number":159,"context_line":"        self.timeout \u003d int(timeout[-1])"},{"line_number":160,"context_line":"        self.membership_timeout \u003d int(options.get("},{"line_number":161,"context_line":"            \u0027membership_timeout\u0027, timeout)[-1])"},{"line_number":162,"context_line":"        lock_timeout \u003d options.get(\u0027lock_timeout\u0027, [self.timeout])"},{"line_number":163,"context_line":"        self.lock_timeout \u003d int(lock_timeout[-1])"},{"line_number":164,"context_line":"        self._namespace \u003d options.get(\u0027namespace\u0027, \u0027_tooz\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9aa7fdbe_27b917cc","line":161,"updated":"2014-10-28 19:26:31.000000000","message":"Is this an option that users of a timeout-capable tooz driver should always be scaling to the frequency at which they expect send heartbeats?\n\nSo in ceilometer, we have a coordination.heartbeat config option that determines how often the heartbeat is sent, and also an independent backend_url option that presumably allows the membership_timeout option to be encoded via config.\n\nShould we be ensuring that the membership_timeout is always say at most half the heartbeat period, before passing that URL to the tooz get_coordinator factory method?","commit_id":"679ec645673229e532a11ac0accab73edf6b1d0e"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"e20fb219e3789c012e45559b34d1fd8ecc4ec9ed","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        timeout \u003d options.get(\u0027timeout\u0027, [self._CLIENT_DEFAULT_SOCKET_TO])"},{"line_number":159,"context_line":"        self.timeout \u003d int(timeout[-1])"},{"line_number":160,"context_line":"        self.membership_timeout \u003d int(options.get("},{"line_number":161,"context_line":"            \u0027membership_timeout\u0027, timeout)[-1])"},{"line_number":162,"context_line":"        lock_timeout \u003d options.get(\u0027lock_timeout\u0027, [self.timeout])"},{"line_number":163,"context_line":"        self.lock_timeout \u003d int(lock_timeout[-1])"},{"line_number":164,"context_line":"        self._namespace \u003d options.get(\u0027namespace\u0027, \u0027_tooz\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9aa7fdbe_021a41c5","line":161,"in_reply_to":"9aa7fdbe_27b917cc","updated":"2014-10-28 20:09:55.000000000","message":"Hmmm, I\u0027m unsure as to what a good scaling/beat frequency should be, but I do agree that one does make sense.\n\nIf your application is ok with dead members not being removed \u0027quickly\u0027 (or your application can handle this kind of issue), set the \u0027membership_timeout\u0027 frequency to be a multiple of the \u0027heartbeat_frequency\u0027 (2 * heartbeat_frequency for example) . If you want more accurate groups (and/or don\u0027t expect heartbeat issues to be a problem) then u want to have the \u0027membership_timeout \u0027 be closer to the \u0027heartbeat_frequency\u0027 value (1.2 * heartbeat_frequency might be good?).\n\nI\u0027m betting that if this kind of information is searched for, the zookeeper folks might have some good values for this kind of stuff (or some research/papers might have found some good values...)","commit_id":"679ec645673229e532a11ac0accab73edf6b1d0e"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"7a51c93a287661b7ead2925882330fee72ca9188","unresolved":false,"context_lines":[{"line_number":274,"context_line":"            raise coordination.ToozError(\"Redis client has not been created\")"},{"line_number":275,"context_line":"        with _translate_failures():"},{"line_number":276,"context_line":"            self._client.setex(self._encode_beat_id(self._member_id),"},{"line_number":277,"context_line":"                               time\u003dself.membership_timeout,"},{"line_number":278,"context_line":"                               value\u003d\"Not dead!\")"},{"line_number":279,"context_line":"        for lock in self._acquired_locks:"},{"line_number":280,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"9aa7fdbe_47e37bd8","line":277,"updated":"2014-10-28 19:26:31.000000000","message":"As suggested in the comment above, makes sense to have some latitude on the expiry timeout here to tolerate a bit of tardiness on the heartbeat?","commit_id":"679ec645673229e532a11ac0accab73edf6b1d0e"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"7e759720814dbde7e475bfbe3d7dbfab8cb44495","unresolved":false,"context_lines":[{"line_number":274,"context_line":"            raise coordination.ToozError(\"Redis client has not been created\")"},{"line_number":275,"context_line":"        with _translate_failures():"},{"line_number":276,"context_line":"            self._client.setex(self._encode_beat_id(self._member_id),"},{"line_number":277,"context_line":"                               time\u003dself.membership_timeout,"},{"line_number":278,"context_line":"                               value\u003d\"Not dead!\")"},{"line_number":279,"context_line":"        for lock in self._acquired_locks:"},{"line_number":280,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"9aa7fdbe_a27ed516","line":277,"in_reply_to":"9aa7fdbe_47e37bd8","updated":"2014-10-28 20:02:00.000000000","message":"It\u0027d be nice to although I\u0027m unsure how that would be done, the expiry is done by redis, not by this code, unless we start creating our own expiry values wrapped inside of redis keys that never expire (I don\u0027t recommend this; since at that point we are just creating our own expiry mechanism).\n\nJust to note, this kind of stuff in zookeeper is existent, in that it does have tolerances and such. I\u0027m pretty sure that implementation in zookeeper is much more robust; but hey this is a poor mans zookeeper for a reason, ha.","commit_id":"679ec645673229e532a11ac0accab73edf6b1d0e"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"7a51c93a287661b7ead2925882330fee72ca9188","unresolved":false,"context_lines":[{"line_number":397,"context_line":"                    gone_members.add(potential_member)"},{"line_number":398,"context_line":"            # Trash all the members that no longer are with us... RIP..."},{"line_number":399,"context_line":"            for m in gone_members:"},{"line_number":400,"context_line":"                p.hdel(encoded_group, self._encode_member_id(m))"},{"line_number":401,"context_line":"            return [m for m in potential_members if m not in gone_members]"},{"line_number":402,"context_line":""},{"line_number":403,"context_line":"        return RedisFutureResult(self._submit(self._client.transaction,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9aa7fdbe_a7d34702","line":400,"updated":"2014-10-28 19:26:31.000000000","message":"Presumably the deletion of expired members is idempotent?","commit_id":"679ec645673229e532a11ac0accab73edf6b1d0e"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"7e759720814dbde7e475bfbe3d7dbfab8cb44495","unresolved":false,"context_lines":[{"line_number":397,"context_line":"                    gone_members.add(potential_member)"},{"line_number":398,"context_line":"            # Trash all the members that no longer are with us... RIP..."},{"line_number":399,"context_line":"            for m in gone_members:"},{"line_number":400,"context_line":"                p.hdel(encoded_group, self._encode_member_id(m))"},{"line_number":401,"context_line":"            return [m for m in potential_members if m not in gone_members]"},{"line_number":402,"context_line":""},{"line_number":403,"context_line":"        return RedisFutureResult(self._submit(self._client.transaction,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9aa7fdbe_2292e54b","line":400,"in_reply_to":"9aa7fdbe_a7d34702","updated":"2014-10-28 20:02:00.000000000","message":"Ya, just doesn\u0027t do anything if its not there (it returns 0 in that case to say no keys were deleted).\n\nhttp://redis.io/commands/hdel","commit_id":"679ec645673229e532a11ac0accab73edf6b1d0e"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"cb9c4f8524bc777a9125158de6439e0a58e9d9b4","unresolved":false,"context_lines":[{"line_number":459,"context_line":"                    gone_members.add(potential_member)"},{"line_number":460,"context_line":"            # Trash all the members that no longer are with us... RIP..."},{"line_number":461,"context_line":"            for m in gone_members:"},{"line_number":462,"context_line":"                p.hdel(encoded_group, self._encode_member_id(m))"},{"line_number":463,"context_line":"            return [m for m in potential_members if m not in gone_members]"},{"line_number":464,"context_line":""},{"line_number":465,"context_line":"        return RedisFutureResult(self._submit(self._client.transaction,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9aa7fdbe_0254efc8","line":462,"updated":"2014-10-29 11:53:32.000000000","message":"What happens if finally the member comes back to life after the hearbeat timeout and still thinks it is part of the group?\nJust wondering out loud.","commit_id":"055f3e4770d4f825503e56b2e034f0873a5f1d8f"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"5d2c4ffa23ef2ea885fa2134cb66abc88a45bc1a","unresolved":false,"context_lines":[{"line_number":459,"context_line":"                    gone_members.add(potential_member)"},{"line_number":460,"context_line":"            # Trash all the members that no longer are with us... RIP..."},{"line_number":461,"context_line":"            for m in gone_members:"},{"line_number":462,"context_line":"                p.hdel(encoded_group, self._encode_member_id(m))"},{"line_number":463,"context_line":"            return [m for m in potential_members if m not in gone_members]"},{"line_number":464,"context_line":""},{"line_number":465,"context_line":"        return RedisFutureResult(self._submit(self._client.transaction,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9aa7fdbe_caecb992","line":462,"in_reply_to":"9aa7fdbe_0254efc8","updated":"2014-10-29 14:36:22.000000000","message":"Yeah, the case of the tardy heartbeat is what I was getting at with the patchset2 comment on scaling the heartbeat period to a fraction of the timeout on the beats key. So that should not occur in practice if those values line up conservatively (e.g. if the heartbeat period is half the beats key timeout).","commit_id":"055f3e4770d4f825503e56b2e034f0873a5f1d8f"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"fcc94bd14fc21bc63dc33affb12e904500905f32","unresolved":false,"context_lines":[{"line_number":459,"context_line":"                    gone_members.add(potential_member)"},{"line_number":460,"context_line":"            # Trash all the members that no longer are with us... RIP..."},{"line_number":461,"context_line":"            for m in gone_members:"},{"line_number":462,"context_line":"                p.hdel(encoded_group, self._encode_member_id(m))"},{"line_number":463,"context_line":"            return [m for m in potential_members if m not in gone_members]"},{"line_number":464,"context_line":""},{"line_number":465,"context_line":"        return RedisFutureResult(self._submit(self._client.transaction,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9aa7fdbe_8d49e690","line":462,"in_reply_to":"9aa7fdbe_6d1cc2c2","updated":"2014-10-29 17:38:45.000000000","message":"^ Sounds like zookeeper watchs :-P","commit_id":"055f3e4770d4f825503e56b2e034f0873a5f1d8f"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"d45a84b8e79190e14f40dafb0fb415158415f1b9","unresolved":false,"context_lines":[{"line_number":459,"context_line":"                    gone_members.add(potential_member)"},{"line_number":460,"context_line":"            # Trash all the members that no longer are with us... RIP..."},{"line_number":461,"context_line":"            for m in gone_members:"},{"line_number":462,"context_line":"                p.hdel(encoded_group, self._encode_member_id(m))"},{"line_number":463,"context_line":"            return [m for m in potential_members if m not in gone_members]"},{"line_number":464,"context_line":""},{"line_number":465,"context_line":"        return RedisFutureResult(self._submit(self._client.transaction,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9aa7fdbe_d62380bc","line":462,"in_reply_to":"9aa7fdbe_caecb992","updated":"2014-10-29 16:33:00.000000000","message":"That\u0027s ok from the client consuming the get_members() call, but the tardy-heartbeater will still think it\u0027s part of the group AFAIU. Which is going to be wrong.","commit_id":"055f3e4770d4f825503e56b2e034f0873a5f1d8f"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"94b21542bbcad8473a4664e4ce35e92fde7916de","unresolved":false,"context_lines":[{"line_number":459,"context_line":"                    gone_members.add(potential_member)"},{"line_number":460,"context_line":"            # Trash all the members that no longer are with us... RIP..."},{"line_number":461,"context_line":"            for m in gone_members:"},{"line_number":462,"context_line":"                p.hdel(encoded_group, self._encode_member_id(m))"},{"line_number":463,"context_line":"            return [m for m in potential_members if m not in gone_members]"},{"line_number":464,"context_line":""},{"line_number":465,"context_line":"        return RedisFutureResult(self._submit(self._client.transaction,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9aa7fdbe_6d1cc2c2","line":462,"in_reply_to":"9aa7fdbe_d62380bc","updated":"2014-10-29 17:32:17.000000000","message":"Well then a tardy-heartbeater needs to probably figure out it\u0027s not in groups anymore (or has been ejected from some). This seems like it could be done in the heartbeat function (or at least done every X heartbeats, to see what groups it got kicked out of, if any at all).\n\nRecreating parts of zookeeper, not so much fun :-P","commit_id":"055f3e4770d4f825503e56b2e034f0873a5f1d8f"}]}
