)]}'
{"searchlight/elasticsearch/plugins/base.py":[{"author":{"_account_id":10063,"name":"Steve McLellan","email":"steven.j.mclellan@gmail.com","username":"sjmc7"},"change_message_id":"6924190162a6b3ef6159b948050e3880c85e4dfc","unresolved":false,"context_lines":[{"line_number":474,"context_line":"        \"\"\"Process the incoming notification message.\"\"\""},{"line_number":475,"context_line":"        LOG.debug(\"Received %s event for %s\", event_type, self.document_type)"},{"line_number":476,"context_line":"        try:"},{"line_number":477,"context_line":"            self.get_event_handlers()[event_type](payload, metadata)"},{"line_number":478,"context_line":"            return oslo_messaging.NotificationResult.HANDLED"},{"line_number":479,"context_line":"        except Exception as e:"},{"line_number":480,"context_line":"            LOG.error(encodeutils.exception_to_unicode(e))"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_52d4cf1e","line":477,"range":{"start_line":477,"start_character":59,"end_line":477,"end_character":67},"updated":"2016-01-04 20:34:25.000000000","message":"Is there anything else in the metadata that would ever be useful? Otherwise i would be inclined to call this \u0027timestamp\u0027 and pass it explicitly, because it\u0027s not clear in the individual handlers what \u0027metadata\u0027 refers to.","commit_id":"2471c9bb853ae9366ed64e27b6fbc723e50c3de1"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"c0cadfdc43f90865b11dd7692ea997c985e91895","unresolved":false,"context_lines":[{"line_number":474,"context_line":"        \"\"\"Process the incoming notification message.\"\"\""},{"line_number":475,"context_line":"        LOG.debug(\"Received %s event for %s\", event_type, self.document_type)"},{"line_number":476,"context_line":"        try:"},{"line_number":477,"context_line":"            self.get_event_handlers()[event_type](payload, metadata)"},{"line_number":478,"context_line":"            return oslo_messaging.NotificationResult.HANDLED"},{"line_number":479,"context_line":"        except Exception as e:"},{"line_number":480,"context_line":"            LOG.error(encodeutils.exception_to_unicode(e))"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_e1716545","line":477,"range":{"start_line":477,"start_character":59,"end_line":477,"end_character":67},"in_reply_to":"fa69d971_52d4cf1e","updated":"2016-01-05 07:53:37.000000000","message":"Yes, good catch, passing timestamp is a lot explicit","commit_id":"2471c9bb853ae9366ed64e27b6fbc723e50c3de1"},{"author":{"_account_id":14680,"name":"Rick Aulino","email":"rick.aulino@hpe.com","username":"ricka"},"change_message_id":"c0444fef0b7f786d2a861b1058ac9026b5133bfc","unresolved":false,"context_lines":[{"line_number":498,"context_line":"        version number, format is"},{"line_number":499,"context_line":"        \u003cright 9 digits update second(create second)\u003e\u003cright 9 digits timestamp"},{"line_number":500,"context_line":"        in milliseconds\u003e, if timestamp is not present(sync indexing), fill in"},{"line_number":501,"context_line":"        9 digits of zero instead."},{"line_number":502,"context_line":"        \"\"\""},{"line_number":503,"context_line":"        updated \u003d None"},{"line_number":504,"context_line":"        if \u0027updated_at\u0027 in payload:"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_4ef663fa","line":501,"updated":"2016-01-04 23:40:36.000000000","message":"Let\u0027s expand the comment a little to explain that the create/update epoch seconds are used as a tie-breaker in case the notification epoch seconds are the same. Otherwise it will be very confusing why we are concatenating the two separate epoch times. Maybe also include a quick explanation about why 9 digits for each epoch seconds are used with respect to the 19 digit limit of Elasticsearch.","commit_id":"2471c9bb853ae9366ed64e27b6fbc723e50c3de1"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"c0cadfdc43f90865b11dd7692ea997c985e91895","unresolved":false,"context_lines":[{"line_number":498,"context_line":"        version number, format is"},{"line_number":499,"context_line":"        \u003cright 9 digits update second(create second)\u003e\u003cright 9 digits timestamp"},{"line_number":500,"context_line":"        in milliseconds\u003e, if timestamp is not present(sync indexing), fill in"},{"line_number":501,"context_line":"        9 digits of zero instead."},{"line_number":502,"context_line":"        \"\"\""},{"line_number":503,"context_line":"        updated \u003d None"},{"line_number":504,"context_line":"        if \u0027updated_at\u0027 in payload:"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_81c98928","line":501,"in_reply_to":"fa69d971_4ef663fa","updated":"2016-01-05 07:53:37.000000000","message":"Yes, that will help better understand the context.","commit_id":"2471c9bb853ae9366ed64e27b6fbc723e50c3de1"},{"author":{"_account_id":4428,"name":"Liyingjun","email":"yinjalee@163.com","username":"liyingjun"},"change_message_id":"348213c2cafb3509e97fdf38bf87d25c044dfb4d","unresolved":false,"context_lines":[{"line_number":507,"context_line":"            updated \u003d payload[\u0027created_at\u0027]"},{"line_number":508,"context_line":"        else:"},{"line_number":509,"context_line":"            msg \u003d (\u0027Failed to build elasticsearch version, updated_at and \u0027"},{"line_number":510,"context_line":"                   \u0027create_at not exist, %s\u0027 % str(payload)"},{"line_number":511,"context_line":"                   )"},{"line_number":512,"context_line":"            raise SearchlightException(message\u003dmsg)"},{"line_number":513,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9a68dd71_aa5dd9ed","line":510,"updated":"2016-01-27 02:22:57.000000000","message":"nit: s/create_at/created_at","commit_id":"2471c9bb853ae9366ed64e27b6fbc723e50c3de1"},{"author":{"_account_id":14680,"name":"Rick Aulino","email":"rick.aulino@hpe.com","username":"ricka"},"change_message_id":"c0444fef0b7f786d2a861b1058ac9026b5133bfc","unresolved":false,"context_lines":[{"line_number":510,"context_line":"                   \u0027create_at not exist, %s\u0027 % str(payload)"},{"line_number":511,"context_line":"                   )"},{"line_number":512,"context_line":"            raise SearchlightException(message\u003dmsg)"},{"line_number":513,"context_line":""},{"line_number":514,"context_line":"        updated_obj \u003d timeutils.parse_isotime(updated)"},{"line_number":515,"context_line":"        updated_second \u003d int(time.mktime(updated_obj.timetuple()))"},{"line_number":516,"context_line":"        if timestamp:"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_8e0c5bee","line":513,"updated":"2016-01-04 23:40:36.000000000","message":"Do we need to place all of the time calculations in a try/except block?","commit_id":"2471c9bb853ae9366ed64e27b6fbc723e50c3de1"},{"author":{"_account_id":10063,"name":"Steve McLellan","email":"steven.j.mclellan@gmail.com","username":"sjmc7"},"change_message_id":"2245812ffa24916360f954099d802ba06ca9c129","unresolved":false,"context_lines":[{"line_number":510,"context_line":"                   \u0027create_at not exist, %s\u0027 % str(payload)"},{"line_number":511,"context_line":"                   )"},{"line_number":512,"context_line":"            raise SearchlightException(message\u003dmsg)"},{"line_number":513,"context_line":""},{"line_number":514,"context_line":"        updated_obj \u003d timeutils.parse_isotime(updated)"},{"line_number":515,"context_line":"        updated_second \u003d int(time.mktime(updated_obj.timetuple()))"},{"line_number":516,"context_line":"        if timestamp:"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_a4711446","line":513,"in_reply_to":"fa69d971_018cb9d8","updated":"2016-01-05 19:43:44.000000000","message":"I don\u0027t think the rest of this code needs to be in an exception handler unless there are conditions where we might reasonably recover from failure","commit_id":"2471c9bb853ae9366ed64e27b6fbc723e50c3de1"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"c0cadfdc43f90865b11dd7692ea997c985e91895","unresolved":false,"context_lines":[{"line_number":510,"context_line":"                   \u0027create_at not exist, %s\u0027 % str(payload)"},{"line_number":511,"context_line":"                   )"},{"line_number":512,"context_line":"            raise SearchlightException(message\u003dmsg)"},{"line_number":513,"context_line":""},{"line_number":514,"context_line":"        updated_obj \u003d timeutils.parse_isotime(updated)"},{"line_number":515,"context_line":"        updated_second \u003d int(time.mktime(updated_obj.timetuple()))"},{"line_number":516,"context_line":"        if timestamp:"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_018cb9d8","line":513,"in_reply_to":"fa69d971_8e0c5bee","updated":"2016-01-05 07:53:37.000000000","message":"I think we need to put it in a try/except block because it\u0027s indeed an exception and should be noted, what do you think Rick?","commit_id":"2471c9bb853ae9366ed64e27b6fbc723e50c3de1"},{"author":{"_account_id":14680,"name":"Rick Aulino","email":"rick.aulino@hpe.com","username":"ricka"},"change_message_id":"c0444fef0b7f786d2a861b1058ac9026b5133bfc","unresolved":false,"context_lines":[{"line_number":511,"context_line":"                   )"},{"line_number":512,"context_line":"            raise SearchlightException(message\u003dmsg)"},{"line_number":513,"context_line":""},{"line_number":514,"context_line":"        updated_obj \u003d timeutils.parse_isotime(updated)"},{"line_number":515,"context_line":"        updated_second \u003d int(time.mktime(updated_obj.timetuple()))"},{"line_number":516,"context_line":"        if timestamp:"},{"line_number":517,"context_line":"            timestamp_obj \u003d timeutils.parse_isotime(timestamp)"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_0eddcb6e","line":514,"updated":"2016-01-04 23:40:36.000000000","message":"It seems that Oslo returns a time based on UTC. Is the UTC time zone reflected in the string? Does it end with \"Z\"/\"+00:00\"/\"-00:00\"?  If not, the call to parse_isotime will use the local time zone. Same comment for line 517.","commit_id":"2471c9bb853ae9366ed64e27b6fbc723e50c3de1"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"c0cadfdc43f90865b11dd7692ea997c985e91895","unresolved":false,"context_lines":[{"line_number":511,"context_line":"                   )"},{"line_number":512,"context_line":"            raise SearchlightException(message\u003dmsg)"},{"line_number":513,"context_line":""},{"line_number":514,"context_line":"        updated_obj \u003d timeutils.parse_isotime(updated)"},{"line_number":515,"context_line":"        updated_second \u003d int(time.mktime(updated_obj.timetuple()))"},{"line_number":516,"context_line":"        if timestamp:"},{"line_number":517,"context_line":"            timestamp_obj \u003d timeutils.parse_isotime(timestamp)"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_28eaf9db","line":514,"in_reply_to":"fa69d971_0eddcb6e","updated":"2016-01-05 07:53:37.000000000","message":"Thanks for pointing that. I checked Nova, it returns a UTC time string ended with \"Z\", so using time.mktime is problematic. If other services behave like Nova, the correct way is to use calendar.timegm instead of time.mktime, to keep UTC time all the way. Is my understanding right?","commit_id":"2471c9bb853ae9366ed64e27b6fbc723e50c3de1"},{"author":{"_account_id":10063,"name":"Steve McLellan","email":"steven.j.mclellan@gmail.com","username":"sjmc7"},"change_message_id":"2245812ffa24916360f954099d802ba06ca9c129","unresolved":false,"context_lines":[{"line_number":511,"context_line":"                   )"},{"line_number":512,"context_line":"            raise SearchlightException(message\u003dmsg)"},{"line_number":513,"context_line":""},{"line_number":514,"context_line":"        updated_obj \u003d timeutils.parse_isotime(updated)"},{"line_number":515,"context_line":"        updated_second \u003d int(time.mktime(updated_obj.timetuple()))"},{"line_number":516,"context_line":"        if timestamp:"},{"line_number":517,"context_line":"            timestamp_obj \u003d timeutils.parse_isotime(timestamp)"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_84c65066","line":514,"in_reply_to":"fa69d971_28eaf9db","updated":"2016-01-05 19:43:44.000000000","message":"In general all openstack services are *supposed* to use UTC (and datetimes without can be assumed to be UTC), but as Rick points out the server timezone may well not be. timetuple is also localtime! Probably best to use utctimetuple and calendar.gmtime. Good catch","commit_id":"2471c9bb853ae9366ed64e27b6fbc723e50c3de1"},{"author":{"_account_id":14680,"name":"Rick Aulino","email":"rick.aulino@hpe.com","username":"ricka"},"change_message_id":"c0444fef0b7f786d2a861b1058ac9026b5133bfc","unresolved":false,"context_lines":[{"line_number":512,"context_line":"            raise SearchlightException(message\u003dmsg)"},{"line_number":513,"context_line":""},{"line_number":514,"context_line":"        updated_obj \u003d timeutils.parse_isotime(updated)"},{"line_number":515,"context_line":"        updated_second \u003d int(time.mktime(updated_obj.timetuple()))"},{"line_number":516,"context_line":"        if timestamp:"},{"line_number":517,"context_line":"            timestamp_obj \u003d timeutils.parse_isotime(timestamp)"},{"line_number":518,"context_line":"            timestamp_second \u003d int(time.mktime(timestamp_obj.timetuple()))"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_4ecd03b6","line":515,"updated":"2016-01-04 23:40:36.000000000","message":"time.mktime() uses the local time zone, not UTC. Is this an issue? Same comment for line 518.","commit_id":"2471c9bb853ae9366ed64e27b6fbc723e50c3de1"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"c0cadfdc43f90865b11dd7692ea997c985e91895","unresolved":false,"context_lines":[{"line_number":512,"context_line":"            raise SearchlightException(message\u003dmsg)"},{"line_number":513,"context_line":""},{"line_number":514,"context_line":"        updated_obj \u003d timeutils.parse_isotime(updated)"},{"line_number":515,"context_line":"        updated_second \u003d int(time.mktime(updated_obj.timetuple()))"},{"line_number":516,"context_line":"        if timestamp:"},{"line_number":517,"context_line":"            timestamp_obj \u003d timeutils.parse_isotime(timestamp)"},{"line_number":518,"context_line":"            timestamp_second \u003d int(time.mktime(timestamp_obj.timetuple()))"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_2842f9ae","line":515,"in_reply_to":"fa69d971_4ecd03b6","updated":"2016-01-05 07:53:37.000000000","message":"See above.","commit_id":"2471c9bb853ae9366ed64e27b6fbc723e50c3de1"},{"author":{"_account_id":14680,"name":"Rick Aulino","email":"rick.aulino@hpe.com","username":"ricka"},"change_message_id":"c0444fef0b7f786d2a861b1058ac9026b5133bfc","unresolved":false,"context_lines":[{"line_number":515,"context_line":"        updated_second \u003d int(time.mktime(updated_obj.timetuple()))"},{"line_number":516,"context_line":"        if timestamp:"},{"line_number":517,"context_line":"            timestamp_obj \u003d timeutils.parse_isotime(timestamp)"},{"line_number":518,"context_line":"            timestamp_second \u003d int(time.mktime(timestamp_obj.timetuple()))"},{"line_number":519,"context_line":"            timestamp_milli \u003d (timestamp_second * 1000 +"},{"line_number":520,"context_line":"                               timestamp_obj.microsecond // 1000)"},{"line_number":521,"context_line":"            truncate_timestamp \u003d str(timestamp_milli)[-9:].zfill(9)"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_aebcbf06","line":518,"updated":"2016-01-04 23:40:36.000000000","message":"Maybe rename \"timestamp_second\". It\u0027s not the seconds field in the timestamp_obj (i.e. \"timestamp_obj.second\") but rather the timestamp converted into epoch seconds. Maybe \"timestamp_epoch\"?","commit_id":"2471c9bb853ae9366ed64e27b6fbc723e50c3de1"},{"author":{"_account_id":10063,"name":"Steve McLellan","email":"steven.j.mclellan@gmail.com","username":"sjmc7"},"change_message_id":"2245812ffa24916360f954099d802ba06ca9c129","unresolved":false,"context_lines":[{"line_number":515,"context_line":"        updated_second \u003d int(time.mktime(updated_obj.timetuple()))"},{"line_number":516,"context_line":"        if timestamp:"},{"line_number":517,"context_line":"            timestamp_obj \u003d timeutils.parse_isotime(timestamp)"},{"line_number":518,"context_line":"            timestamp_second \u003d int(time.mktime(timestamp_obj.timetuple()))"},{"line_number":519,"context_line":"            timestamp_milli \u003d (timestamp_second * 1000 +"},{"line_number":520,"context_line":"                               timestamp_obj.microsecond // 1000)"},{"line_number":521,"context_line":"            truncate_timestamp \u003d str(timestamp_milli)[-9:].zfill(9)"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_448a981c","line":518,"in_reply_to":"fa69d971_88e0c5fb","updated":"2016-01-05 19:43:44.000000000","message":"Same here regarding timezones; and we should have some timezone-aware unit tests for this.","commit_id":"2471c9bb853ae9366ed64e27b6fbc723e50c3de1"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"c0cadfdc43f90865b11dd7692ea997c985e91895","unresolved":false,"context_lines":[{"line_number":515,"context_line":"        updated_second \u003d int(time.mktime(updated_obj.timetuple()))"},{"line_number":516,"context_line":"        if timestamp:"},{"line_number":517,"context_line":"            timestamp_obj \u003d timeutils.parse_isotime(timestamp)"},{"line_number":518,"context_line":"            timestamp_second \u003d int(time.mktime(timestamp_obj.timetuple()))"},{"line_number":519,"context_line":"            timestamp_milli \u003d (timestamp_second * 1000 +"},{"line_number":520,"context_line":"                               timestamp_obj.microsecond // 1000)"},{"line_number":521,"context_line":"            truncate_timestamp \u003d str(timestamp_milli)[-9:].zfill(9)"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_88e0c5fb","line":518,"in_reply_to":"fa69d971_aebcbf06","updated":"2016-01-05 07:53:37.000000000","message":"That sounds better.","commit_id":"2471c9bb853ae9366ed64e27b6fbc723e50c3de1"},{"author":{"_account_id":10063,"name":"Steve McLellan","email":"steven.j.mclellan@gmail.com","username":"sjmc7"},"change_message_id":"6924190162a6b3ef6159b948050e3880c85e4dfc","unresolved":false,"context_lines":[{"line_number":518,"context_line":"            timestamp_second \u003d int(time.mktime(timestamp_obj.timetuple()))"},{"line_number":519,"context_line":"            timestamp_milli \u003d (timestamp_second * 1000 +"},{"line_number":520,"context_line":"                               timestamp_obj.microsecond // 1000)"},{"line_number":521,"context_line":"            truncate_timestamp \u003d str(timestamp_milli)[-9:].zfill(9)"},{"line_number":522,"context_line":"            return \u0027%s%s\u0027 % (str(updated_second)[-9:], truncate_timestamp)"},{"line_number":523,"context_line":"        else:"},{"line_number":524,"context_line":"            return \u0027%s%s\u0027 % (str(updated_second)[-9:], \u00270\u0027 * 9)"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_d2967f4b","line":521,"range":{"start_line":521,"start_character":66,"end_line":521,"end_character":67},"updated":"2016-01-04 20:34:25.000000000","message":"Let\u0027s put a comment in explaining why we\u0027re doing this truncation, when we\u0027ll run out of numbers etc","commit_id":"2471c9bb853ae9366ed64e27b6fbc723e50c3de1"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"c0cadfdc43f90865b11dd7692ea997c985e91895","unresolved":false,"context_lines":[{"line_number":518,"context_line":"            timestamp_second \u003d int(time.mktime(timestamp_obj.timetuple()))"},{"line_number":519,"context_line":"            timestamp_milli \u003d (timestamp_second * 1000 +"},{"line_number":520,"context_line":"                               timestamp_obj.microsecond // 1000)"},{"line_number":521,"context_line":"            truncate_timestamp \u003d str(timestamp_milli)[-9:].zfill(9)"},{"line_number":522,"context_line":"            return \u0027%s%s\u0027 % (str(updated_second)[-9:], truncate_timestamp)"},{"line_number":523,"context_line":"        else:"},{"line_number":524,"context_line":"            return \u0027%s%s\u0027 % (str(updated_second)[-9:], \u00270\u0027 * 9)"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_a8bca9dc","line":521,"range":{"start_line":521,"start_character":66,"end_line":521,"end_character":67},"in_reply_to":"fa69d971_d2967f4b","updated":"2016-01-05 07:53:37.000000000","message":"OK, I will put a comment here.","commit_id":"2471c9bb853ae9366ed64e27b6fbc723e50c3de1"},{"author":{"_account_id":10063,"name":"Steve McLellan","email":"steven.j.mclellan@gmail.com","username":"sjmc7"},"change_message_id":"cdf15d278248d1bdba6519f5f60046c94c7dadf9","unresolved":false,"context_lines":[{"line_number":436,"context_line":"        The reason we combine update time and timestamp together is the"},{"line_number":437,"context_line":"        precision of update time is limit to seconds. It\u0027s not accurate enough"},{"line_number":438,"context_line":"        to use as a version."},{"line_number":439,"context_line":"        The max version in Elasticsearch is 9.2e+18, only allows 18 digits"},{"line_number":440,"context_line":"        version. So we need to do some trims to achieve best accuracy, use"},{"line_number":441,"context_line":"        right 9 digits of update epoch, leave another 9 digits to timestamp in"},{"line_number":442,"context_line":"        milliseconds."}],"source_content_type":"text/x-python","patch_set":5,"id":"5a5ae5dd_3da375a0","line":439,"range":{"start_line":439,"start_character":65,"end_line":439,"end_character":67},"updated":"2016-02-09 17:56:58.000000000","message":"19, I think? And perhaps note that it\u0027s 2^63 - 1.\n\nAnd our 18 digits (around 2^59) makes numbers much too large for Javascript (2^53) but i think maybe we agreed that wasn\u0027t a big deal?","commit_id":"162f64856fb63e488229136d85d26e1056a52bb9"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"ccbb397eba4d62b37796b4cd9e91e79995d7d05c","unresolved":false,"context_lines":[{"line_number":436,"context_line":"        The reason we combine update time and timestamp together is the"},{"line_number":437,"context_line":"        precision of update time is limit to seconds. It\u0027s not accurate enough"},{"line_number":438,"context_line":"        to use as a version."},{"line_number":439,"context_line":"        The max version in Elasticsearch is 9.2e+18, only allows 18 digits"},{"line_number":440,"context_line":"        version. So we need to do some trims to achieve best accuracy, use"},{"line_number":441,"context_line":"        right 9 digits of update epoch, leave another 9 digits to timestamp in"},{"line_number":442,"context_line":"        milliseconds."}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_07f8bbe4","line":439,"range":{"start_line":439,"start_character":65,"end_line":439,"end_character":67},"in_reply_to":"5a5ae5dd_3da375a0","updated":"2016-02-10 08:18:51.000000000","message":"nice catch, it should be 19 digits.","commit_id":"162f64856fb63e488229136d85d26e1056a52bb9"},{"author":{"_account_id":10063,"name":"Steve McLellan","email":"steven.j.mclellan@gmail.com","username":"sjmc7"},"change_message_id":"cdf15d278248d1bdba6519f5f60046c94c7dadf9","unresolved":false,"context_lines":[{"line_number":438,"context_line":"        to use as a version."},{"line_number":439,"context_line":"        The max version in Elasticsearch is 9.2e+18, only allows 18 digits"},{"line_number":440,"context_line":"        version. So we need to do some trims to achieve best accuracy, use"},{"line_number":441,"context_line":"        right 9 digits of update epoch, leave another 9 digits to timestamp in"},{"line_number":442,"context_line":"        milliseconds."},{"line_number":443,"context_line":"        \"\"\""},{"line_number":444,"context_line":"        updated \u003d None"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a5ae5dd_40020640","line":441,"range":{"start_line":441,"start_character":33,"end_line":441,"end_character":38},"updated":"2016-02-09 17:56:58.000000000","message":"Since this makes me worry about it, let\u0027s add a little more information. Stripping off the leading \u00271\u0027 from the current epoch seconds (updated_epoch) \u0027rebases\u0027 our epoch around 1984. By the time we get to a timestamp beginning \u0027199\u0027 we\u0027re somewhere around 2033, and truncating timestamps to 2001. Once the clock flips round to begin \u0027200\u0027 things will stop working because we\u0027ll suddenly be using timestamps that look like they\u0027re from 1969. I think we\u0027re probably ok saying that in 18 years we can address this; worst case is a \u0027Y2K\u0027 scenario where you\u0027d have to reindex everything, or reset timestamps.","commit_id":"162f64856fb63e488229136d85d26e1056a52bb9"},{"author":{"_account_id":10063,"name":"Steve McLellan","email":"steven.j.mclellan@gmail.com","username":"sjmc7"},"change_message_id":"6c51534db31c5d556878bcd7de5e32fdba4eec4b","unresolved":false,"context_lines":[{"line_number":438,"context_line":"        to use as a version."},{"line_number":439,"context_line":"        The max version in Elasticsearch is 9.2e+18, only allows 18 digits"},{"line_number":440,"context_line":"        version. So we need to do some trims to achieve best accuracy, use"},{"line_number":441,"context_line":"        right 9 digits of update epoch, leave another 9 digits to timestamp in"},{"line_number":442,"context_line":"        milliseconds."},{"line_number":443,"context_line":"        \"\"\""},{"line_number":444,"context_line":"        updated \u003d None"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_01188f1c","line":441,"range":{"start_line":441,"start_character":33,"end_line":441,"end_character":38},"in_reply_to":"3a57f1b5_c2ce115a","updated":"2016-02-10 16:10:08.000000000","message":"You\u0027re correct, but when timestamps begin \u0027200\u0027, we\u0027ll be in June 2033, and I suspect many things will have changed by then. I\u0027m a little nervous about making the versions larger because it reduces the margin we have. Also, it\u0027s much easier to increase this if we tink it\u0027s too small versus reducing it if it\u0027s too big (increasing will always be safe, decreasing will produce weird results). Please check my math, but i think by the time there is a rollover problem 20 years will have passed.","commit_id":"162f64856fb63e488229136d85d26e1056a52bb9"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"ccbb397eba4d62b37796b4cd9e91e79995d7d05c","unresolved":false,"context_lines":[{"line_number":438,"context_line":"        to use as a version."},{"line_number":439,"context_line":"        The max version in Elasticsearch is 9.2e+18, only allows 18 digits"},{"line_number":440,"context_line":"        version. So we need to do some trims to achieve best accuracy, use"},{"line_number":441,"context_line":"        right 9 digits of update epoch, leave another 9 digits to timestamp in"},{"line_number":442,"context_line":"        milliseconds."},{"line_number":443,"context_line":"        \"\"\""},{"line_number":444,"context_line":"        updated \u003d None"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_c2ce115a","line":441,"range":{"start_line":441,"start_character":33,"end_line":441,"end_character":38},"in_reply_to":"5a5ae5dd_40020640","updated":"2016-02-10 08:18:51.000000000","message":"I\u0027m thinking about this, say if some resources(instances, images and so on) create or update at a timestamp beginning with \u0027199\u0027, when time comes to timestamp beginning with \u0027200\u0027, you may have to reindex everything many times, because reindexing only works on resources when latest updates with timestamp beginning large or equal than \u0027200\u0027 happen. if resources don\u0027t get updated since \u0027199\u0027 beginning timestamp, reindexing won\u0027t help. So everytime a first \u0027200\u0027 timestamp update happens, you have to reindex once, that\u0027s tedious. What about to expand the version to 19 digits, thus there\u0027s no need to truncate update time. Because the max version is 9.2e+18, so the update epoch can be 9100000000 large, somewhere around 2258, long enough for us... How do you think?","commit_id":"162f64856fb63e488229136d85d26e1056a52bb9"},{"author":{"_account_id":10063,"name":"Steve McLellan","email":"steven.j.mclellan@gmail.com","username":"sjmc7"},"change_message_id":"cdf15d278248d1bdba6519f5f60046c94c7dadf9","unresolved":false,"context_lines":[{"line_number":439,"context_line":"        The max version in Elasticsearch is 9.2e+18, only allows 18 digits"},{"line_number":440,"context_line":"        version. So we need to do some trims to achieve best accuracy, use"},{"line_number":441,"context_line":"        right 9 digits of update epoch, leave another 9 digits to timestamp in"},{"line_number":442,"context_line":"        milliseconds."},{"line_number":443,"context_line":"        \"\"\""},{"line_number":444,"context_line":"        updated \u003d None"},{"line_number":445,"context_line":"        if payload.get(\u0027updated_at\u0027):"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a5ae5dd_b136aeb2","line":442,"range":{"start_line":442,"start_character":8,"end_line":442,"end_character":20},"updated":"2016-02-09 17:56:58.000000000","message":"If my math is right, this gives us around 27 hours at millisecond accuracy? We get 5 digits at second precision that we can rely on (the 6th is unreliable since we strip the most significant digit). That\u0027s probably fine but again, be nice to have it explicitly documented. I\u0027d like to put this somewhere in the actual documentation as well.","commit_id":"162f64856fb63e488229136d85d26e1056a52bb9"},{"author":{"_account_id":10063,"name":"Steve McLellan","email":"steven.j.mclellan@gmail.com","username":"sjmc7"},"change_message_id":"6c51534db31c5d556878bcd7de5e32fdba4eec4b","unresolved":false,"context_lines":[{"line_number":439,"context_line":"        The max version in Elasticsearch is 9.2e+18, only allows 18 digits"},{"line_number":440,"context_line":"        version. So we need to do some trims to achieve best accuracy, use"},{"line_number":441,"context_line":"        right 9 digits of update epoch, leave another 9 digits to timestamp in"},{"line_number":442,"context_line":"        milliseconds."},{"line_number":443,"context_line":"        \"\"\""},{"line_number":444,"context_line":"        updated \u003d None"},{"line_number":445,"context_line":"        if payload.get(\u0027updated_at\u0027):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_e1b9b32f","line":442,"range":{"start_line":442,"start_character":8,"end_line":442,"end_character":20},"in_reply_to":"3a57f1b5_c26a911a","updated":"2016-02-10 16:10:08.000000000","message":"Your English is fine :)  Getting the numbers clear is the most important thing.","commit_id":"162f64856fb63e488229136d85d26e1056a52bb9"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"ccbb397eba4d62b37796b4cd9e91e79995d7d05c","unresolved":false,"context_lines":[{"line_number":439,"context_line":"        The max version in Elasticsearch is 9.2e+18, only allows 18 digits"},{"line_number":440,"context_line":"        version. So we need to do some trims to achieve best accuracy, use"},{"line_number":441,"context_line":"        right 9 digits of update epoch, leave another 9 digits to timestamp in"},{"line_number":442,"context_line":"        milliseconds."},{"line_number":443,"context_line":"        \"\"\""},{"line_number":444,"context_line":"        updated \u003d None"},{"line_number":445,"context_line":"        if payload.get(\u0027updated_at\u0027):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_c26a911a","line":442,"range":{"start_line":442,"start_character":8,"end_line":442,"end_character":20},"in_reply_to":"5a5ae5dd_b136aeb2","updated":"2016-02-10 08:18:51.000000000","message":"yes, your math is much better than me : ), forgive my poor english, I will first update it here. If it looks ok then it can be moved to the doc.","commit_id":"162f64856fb63e488229136d85d26e1056a52bb9"},{"author":{"_account_id":14680,"name":"Rick Aulino","email":"rick.aulino@hpe.com","username":"ricka"},"change_message_id":"dcdffc15be985c2fdf984ac11bb799eafcf71480","unresolved":false,"context_lines":[{"line_number":527,"context_line":"        The truncating has some potential things to be noted, similar to Y2K"},{"line_number":528,"context_line":"        problem."},{"line_number":529,"context_line":""},{"line_number":530,"context_line":"        Let\u0027s say we have a updated epoch 1450161655. Stripping off the leading"},{"line_number":531,"context_line":"        \u00271\u0027 from the current epoch seconds \u0027rebases\u0027 our epoch around"},{"line_number":532,"context_line":"        1984(450161655). By the time we get to a updated epoch beginning \u0027199\u0027"},{"line_number":533,"context_line":"        we\u0027re somewhere around 2033, and truncating epoch to 2001. Once the"}],"source_content_type":"text/x-python","patch_set":6,"id":"bae84128_66f8a3e6","line":530,"updated":"2016-02-19 21:19:25.000000000","message":"Nit: \"an updated epoch\"","commit_id":"6325b3fb477a8e0b0e721f2fa0bfae6fc6f8fd02"}],"searchlight/elasticsearch/plugins/designate/notification_handlers.py":[{"author":{"_account_id":10063,"name":"Steve McLellan","email":"steven.j.mclellan@gmail.com","username":"sjmc7"},"change_message_id":"08f1b0bdeedd716077ee265bc6ac0cc544ef748e","unresolved":false,"context_lines":[{"line_number":89,"context_line":"                        parent\u003drs[\"zone_id\"],"},{"line_number":90,"context_line":"                        id\u003drs[\"id\"],"},{"line_number":91,"context_line":"                        version_type\u003d\u0027external\u0027,"},{"line_number":92,"context_line":"                        versoin\u003dget_version(rs)"},{"line_number":93,"context_line":"                    )"},{"line_number":94,"context_line":"            return oslo_messaging.NotificationResult.HANDLED"},{"line_number":95,"context_line":"        except Exception as e:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_c4c7be10","line":92,"updated":"2015-12-10 21:51:39.000000000","message":"Typo : version","commit_id":"040774ee677bf8a27089a44748e69172c86acd10"},{"author":{"_account_id":10063,"name":"Steve McLellan","email":"steven.j.mclellan@gmail.com","username":"sjmc7"},"change_message_id":"08f1b0bdeedd716077ee265bc6ac0cc544ef748e","unresolved":false,"context_lines":[{"line_number":104,"context_line":"            body\u003dpayload,"},{"line_number":105,"context_line":"            id\u003dpayload[\"id\"],"},{"line_number":106,"context_line":"            version_type\u003d\u0027external\u0027,"},{"line_number":107,"context_line":"            versoin\u003dget_version([\u0027updated_at\u0027])"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        )"},{"line_number":110,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_84d1b6cf","line":107,"updated":"2015-12-10 21:51:39.000000000","message":"Same typo","commit_id":"040774ee677bf8a27089a44748e69172c86acd10"},{"author":{"_account_id":4428,"name":"Liyingjun","email":"yinjalee@163.com","username":"liyingjun"},"change_message_id":"348213c2cafb3509e97fdf38bf87d25c044dfb4d","unresolved":false,"context_lines":[{"line_number":96,"context_line":"                    except exceptions.ConflictError as e:"},{"line_number":97,"context_line":"                        if e.error !\u003d VERSION_CONFLICT_MSG:"},{"line_number":98,"context_line":"                            raise e"},{"line_number":99,"context_line":"                        LOG.debug(\u0027Version conflict in updating recordset \u0027"},{"line_number":100,"context_line":"                                  \u0027%s at version %s\u0027 % (id, version))"},{"line_number":101,"context_line":"            return oslo_messaging.NotificationResult.HANDLED"},{"line_number":102,"context_line":"        except Exception as e:"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a68dd71_4aa0dd90","line":99,"updated":"2016-01-27 02:22:57.000000000","message":"I think it deserves a LOG.warning here.","commit_id":"2471c9bb853ae9366ed64e27b6fbc723e50c3de1"},{"author":{"_account_id":4428,"name":"Liyingjun","email":"yinjalee@163.com","username":"liyingjun"},"change_message_id":"348213c2cafb3509e97fdf38bf87d25c044dfb4d","unresolved":false,"context_lines":[{"line_number":97,"context_line":"                        if e.error !\u003d VERSION_CONFLICT_MSG:"},{"line_number":98,"context_line":"                            raise e"},{"line_number":99,"context_line":"                        LOG.debug(\u0027Version conflict in updating recordset \u0027"},{"line_number":100,"context_line":"                                  \u0027%s at version %s\u0027 % (id, version))"},{"line_number":101,"context_line":"            return oslo_messaging.NotificationResult.HANDLED"},{"line_number":102,"context_line":"        except Exception as e:"},{"line_number":103,"context_line":"            LOG.exception(e)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a68dd71_aa2ab9e5","line":100,"updated":"2016-01-27 02:22:57.000000000","message":"rs[\"id\"]","commit_id":"2471c9bb853ae9366ed64e27b6fbc723e50c3de1"},{"author":{"_account_id":4428,"name":"Liyingjun","email":"yinjalee@163.com","username":"liyingjun"},"change_message_id":"348213c2cafb3509e97fdf38bf87d25c044dfb4d","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        except exceptions.ConflictError as e:"},{"line_number":118,"context_line":"            if e.error !\u003d VERSION_CONFLICT_MSG:"},{"line_number":119,"context_line":"                raise e"},{"line_number":120,"context_line":"            LOG.debug(\u0027Version conflict in updating domain \u0027"},{"line_number":121,"context_line":"                      \u0027%s at version %s\u0027 % (payload[\u0027id\u0027], version))"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def delete(self, payload, metadata):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a68dd71_aac63914","line":120,"updated":"2016-01-27 02:22:57.000000000","message":"same as line 99","commit_id":"2471c9bb853ae9366ed64e27b6fbc723e50c3de1"},{"author":{"_account_id":4428,"name":"Liyingjun","email":"yinjalee@163.com","username":"liyingjun"},"change_message_id":"348213c2cafb3509e97fdf38bf87d25c044dfb4d","unresolved":false,"context_lines":[{"line_number":202,"context_line":"        except exceptions.ConflictError as e:"},{"line_number":203,"context_line":"            if e.error !\u003d VERSION_CONFLICT_MSG:"},{"line_number":204,"context_line":"                raise e"},{"line_number":205,"context_line":"            LOG.debug(\u0027Version conflict in updating recordset \u0027"},{"line_number":206,"context_line":"                      \u0027%s at version %s\u0027 % (id_, version))"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    def _serialize(self, obj):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a68dd71_aaedd98f","line":205,"updated":"2016-01-27 02:22:57.000000000","message":"same as line 99","commit_id":"2471c9bb853ae9366ed64e27b6fbc723e50c3de1"},{"author":{"_account_id":14680,"name":"Rick Aulino","email":"rick.aulino@hpe.com","username":"ricka"},"change_message_id":"e12c49f38721ed9535bd406cb27271d6aac92e63","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                            id\u003drs[\"id\"],"},{"line_number":93,"context_line":"                            version_type\u003d\u0027external\u0027,"},{"line_number":94,"context_line":"                            version\u003dversion"},{"line_number":95,"context_line":"                        )"},{"line_number":96,"context_line":"                    except exceptions.ConflictError as e:"},{"line_number":97,"context_line":"                        if e.error !\u003d VERSION_CONFLICT_MSG:"},{"line_number":98,"context_line":"                            raise e"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a5ae5dd_03a458b7","line":95,"updated":"2016-02-08 18:26:46.000000000","message":"Foreshadowing! There is a defect where this ES.index needs to be turned into the user role-friendly save_document() method. When we rebase again after this fix, make sure we do not lose the exception catching, like on line 11 below!","commit_id":"162f64856fb63e488229136d85d26e1056a52bb9"},{"author":{"_account_id":10063,"name":"Steve McLellan","email":"steven.j.mclellan@gmail.com","username":"sjmc7"},"change_message_id":"cdf15d278248d1bdba6519f5f60046c94c7dadf9","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                            id\u003drs[\"id\"],"},{"line_number":93,"context_line":"                            version_type\u003d\u0027external\u0027,"},{"line_number":94,"context_line":"                            version\u003dversion"},{"line_number":95,"context_line":"                        )"},{"line_number":96,"context_line":"                    except exceptions.ConflictError as e:"},{"line_number":97,"context_line":"                        if e.error !\u003d VERSION_CONFLICT_MSG:"},{"line_number":98,"context_line":"                            raise e"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a5ae5dd_b78c6780","line":95,"in_reply_to":"5a5ae5dd_03a458b7","updated":"2016-02-09 17:56:58.000000000","message":"See https://bugs.launchpad.net/searchlight/+bug/1543245. Don\u0027t fix it here; it\u0027ll get rebased when i fix that bug.","commit_id":"162f64856fb63e488229136d85d26e1056a52bb9"},{"author":{"_account_id":14680,"name":"Rick Aulino","email":"rick.aulino@hpe.com","username":"ricka"},"change_message_id":"e12c49f38721ed9535bd406cb27271d6aac92e63","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        payload \u003d self._serialize(payload)"},{"line_number":109,"context_line":"        self.index_helper.save_document("},{"line_number":110,"context_line":"            payload,"},{"line_number":111,"context_line":"            version\u003dself.get_version(payload, timestamp))"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    def delete(self, payload):"},{"line_number":114,"context_line":"        zone_id \u003d payload[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a5ae5dd_e327bc60","line":111,"updated":"2016-02-08 18:26:46.000000000","message":"We use to catch the versioning ConflictError exception when calling ES.index. Now we are calling save_document, but we do not catch the exception anymore. Seems like a rebase/merge issue.","commit_id":"162f64856fb63e488229136d85d26e1056a52bb9"},{"author":{"_account_id":10063,"name":"Steve McLellan","email":"steven.j.mclellan@gmail.com","username":"sjmc7"},"change_message_id":"f1698cb60e55b8c8d5e5219fa816c76ad5353d68","unresolved":false,"context_lines":[{"line_number":82,"context_line":"                    # TODO(ekarlso,sjmc7): doc_type below should come from"},{"line_number":83,"context_line":"                    # the recordset plugin"},{"line_number":84,"context_line":"                    # registers options"},{"line_number":85,"context_line":"                    version \u003d self.get_version(rs)"},{"line_number":86,"context_line":"                    try:"},{"line_number":87,"context_line":"                        self.engine.index("},{"line_number":88,"context_line":"                            index\u003dself.index_name,"}],"source_content_type":"text/x-python","patch_set":8,"id":"bae84128_2ab3200c","line":85,"range":{"start_line":85,"start_character":35,"end_line":85,"end_character":46},"updated":"2016-02-24 21:36:06.000000000","message":"As a note to other reviewers, this code will change as part of https://review.openstack.org/#/c/280908/; right now it doesn\u0027t function correctly","commit_id":"6cc7614fd28a6b32a16458c367dca33f66264d00"}],"searchlight/elasticsearch/plugins/glance/images_notification_handler.py":[{"author":{"_account_id":4428,"name":"Liyingjun","email":"yinjalee@163.com","username":"liyingjun"},"change_message_id":"348213c2cafb3509e97fdf38bf87d25c044dfb4d","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        except exceptions.ConflictError as e:"},{"line_number":69,"context_line":"            if e.error !\u003d VERSION_CONFLICT_MSG:"},{"line_number":70,"context_line":"                raise e"},{"line_number":71,"context_line":"            LOG.debug(\u0027Version conflict in updating image %s \u0027"},{"line_number":72,"context_line":"                      \u0027at version %s\u0027 % (id, version)"},{"line_number":73,"context_line":"                      )"},{"line_number":74,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9a68dd71_0af9854d","line":71,"updated":"2016-01-27 02:22:57.000000000","message":"LOG.warning","commit_id":"2471c9bb853ae9366ed64e27b6fbc723e50c3de1"},{"author":{"_account_id":14680,"name":"Rick Aulino","email":"rick.aulino@hpe.com","username":"ricka"},"change_message_id":"e12c49f38721ed9535bd406cb27271d6aac92e63","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        image_id \u003d payload[\u0027id\u0027]"},{"line_number":58,"context_line":"        try:"},{"line_number":59,"context_line":"            payload \u003d self.serialize_notification(payload)"},{"line_number":60,"context_line":"            self.index_helper.save_document("},{"line_number":61,"context_line":"                payload,"},{"line_number":62,"context_line":"                version\u003dself.get_version(payload, timestamp))"},{"line_number":63,"context_line":"        except glanceclient.exceptions.NotFound:"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a5ae5dd_03d3f860","line":60,"updated":"2016-02-08 18:26:46.000000000","message":"We use to catch the versioning ConflictError exception when calling ES.index. Now we are calling save_document, but we do not catch the exception anymore. Seems like a rebase/merge issue.","commit_id":"162f64856fb63e488229136d85d26e1056a52bb9"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"ccbb397eba4d62b37796b4cd9e91e79995d7d05c","unresolved":false,"context_lines":[{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        payload \u003d serialize_glance_image_members(image_es[\u0027_source\u0027], payload)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        self.index_helper.save_document(payload)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_93aab16f","line":88,"updated":"2016-02-10 08:18:51.000000000","message":"It seems I omit version here, I checked the functional test events, member notification has updated time, but we don\u0027t store it, we just update member info. So I guess I should replace origin document updated time with the notification updated time, and add version support for sync_members, is that right?","commit_id":"162f64856fb63e488229136d85d26e1056a52bb9"},{"author":{"_account_id":10063,"name":"Steve McLellan","email":"steven.j.mclellan@gmail.com","username":"sjmc7"},"change_message_id":"6c51534db31c5d556878bcd7de5e32fdba4eec4b","unresolved":false,"context_lines":[{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        payload \u003d serialize_glance_image_members(image_es[\u0027_source\u0027], payload)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        self.index_helper.save_document(payload)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_d72f959f","line":88,"in_reply_to":"3a57f1b5_93aab16f","updated":"2016-02-10 16:10:08.000000000","message":"That\u0027s interesting. Does adding or removing members result in a change to the image update time? And can the notification time be after it? There\u0027s definitely a race condition here. We may have to use the notification timestamp for now.","commit_id":"162f64856fb63e488229136d85d26e1056a52bb9"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"65bf77b9b816bb52e3217533ee8535bbf0936db0","unresolved":false,"context_lines":[{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        payload \u003d serialize_glance_image_members(image_es[\u0027_source\u0027], payload)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        self.index_helper.save_document(payload)"}],"source_content_type":"text/x-python","patch_set":5,"id":"dae33548_97bc81dd","line":88,"in_reply_to":"3a57f1b5_d72f959f","updated":"2016-02-17 13:29:45.000000000","message":"Changes to members won\u0027t affect image update time. Do you mean combine image update time with member notification timestamp to build a version? It\u0027s a little weird because here we are actually dealing with two kind of resources, images and members. Image version should be compared with image version only. If we compare image version with member version, some problems may rise. For example, a update image notification comes and successfully write into es with version A, and for some reason a member update notification comes with a version B not greater than A, then this member updating will fail, but it may be a valid update.","commit_id":"162f64856fb63e488229136d85d26e1056a52bb9"},{"author":{"_account_id":10063,"name":"Steve McLellan","email":"steven.j.mclellan@gmail.com","username":"sjmc7"},"change_message_id":"6855812d83765926fe85dade80274bd5b1c1e475","unresolved":false,"context_lines":[{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        payload \u003d serialize_glance_image_members(image_es[\u0027_source\u0027], payload)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        self.index_helper.save_document(payload)"}],"source_content_type":"text/x-python","patch_set":5,"id":"dae33548_ea435211","line":88,"in_reply_to":"dae33548_97bc81dd","updated":"2016-02-17 16:58:06.000000000","message":"Yeah, it is weird. I think the image version has to stay how it is (matching the actual image modification time), and we need to change image member updates to use a scripted update that doesn\u0027t modify the version. Ultimately perhaps members should be separate documents. I will put up a separate patch to modify the member update behavior; you can then ignore it here. I don\u0027t want to hold up this patch on this edge case.","commit_id":"162f64856fb63e488229136d85d26e1056a52bb9"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"28d3bc30dc1d419b48c06f41a0b238f1b7aa57ea","unresolved":false,"context_lines":[{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        payload \u003d serialize_glance_image_members(image_es[\u0027_source\u0027], payload)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        self.index_helper.save_document(payload)"}],"source_content_type":"text/x-python","patch_set":5,"id":"dae33548_f1196223","line":88,"in_reply_to":"dae33548_ea435211","updated":"2016-02-18 10:21:41.000000000","message":"I\u0027ve tested scripted updates without providing version, but version gets increased by 1 too. If so, it still leaves some edge cases. These issues happen in glance image and metadef. Separating documents may be the ultimate solution. Perhaps we should disable version for glance plugin in this patch, turn it on when we figure out how to do it.","commit_id":"162f64856fb63e488229136d85d26e1056a52bb9"},{"author":{"_account_id":10063,"name":"Steve McLellan","email":"steven.j.mclellan@gmail.com","username":"sjmc7"},"change_message_id":"11ee80d95cf0099900f538cdce13906d9a4f60de","unresolved":false,"context_lines":[{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        payload \u003d serialize_glance_image_members(image_es[\u0027_source\u0027], payload)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        self.index_helper.save_document(payload)"}],"source_content_type":"text/x-python","patch_set":5,"id":"dae33548_442317bd","line":88,"in_reply_to":"dae33548_f1196223","updated":"2016-02-18 15:37:37.000000000","message":"For what it\u0027s worth, exteranl versioning does seem to work for scripted updates in 1.7. I will test in 2.0 as well:\n\n$ curl \"192.168.235.128:9200/test-parent/test-version/2?version_type\u003dexternal\u0026version\u003d4\" -d \u0027{\"a\": \"b\"}\u0027\n{\"_index\":\"test-parent\",\"_type\":\"test-version\",\"_id\":\"2\",\"_version\":4,\"created\":true}\n\n$ curl -XPUT \"192.168.235.128:9200/test-parent/test-version/2?version_type\u003dexternal\u0026version\u003d4\" -d\u0027{\"script\": {\"inline\": \"ctx._source.a +\u003d c\", \"params\": {\"tag\": \"c\"}}}\u0027\n{\"error\":\"VersionConflictEngineException[[test-parent][0] [test-version][2]: version conflict, current [4], provided [4]]\",\"status\":409}\n\n$ curl -XPUT \"192.168.235.128:9200/test-parent/test-version/2?version_type\u003dexternal\u0026version\u003d7\" -d\u0027{\"script\": {\"inline\": \"ctx._source.a +\u003d c\", \"params\": {\"tag\": \"c\"}}}\u0027\n{\"_index\":\"test-parent\",\"_type\":\"test-version\",\"_id\":\"2\",\"_version\":7,\"created\":false}","commit_id":"162f64856fb63e488229136d85d26e1056a52bb9"}],"searchlight/elasticsearch/plugins/glance/metadefs_notification_handler.py":[{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"42f4b7bffb64ed69440ae80bd0f68429ce43e3e8","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":31,"context_line":"        super(MetadefHandler, self).__init__(*args, **kwargs)"},{"line_number":32,"context_line":"        self.namespace_delete_keys \u003d [\u0027deleted_at\u0027, \u0027deleted\u0027, \u0027created_at\u0027,"},{"line_number":33,"context_line":"                                      \u0027updated_at\u0027, \u0027namespace_old\u0027]"},{"line_number":34,"context_line":"        self.property_delete_keys \u003d [\u0027deleted\u0027, \u0027deleted_at\u0027,"},{"line_number":35,"context_line":"                                     \u0027name_old\u0027, \u0027namespace\u0027]"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7a5de9d1_34ffce68","line":33,"updated":"2016-01-29 06:28:49.000000000","message":"is there any historical reason to delete these time attributes from payloads? External version depends on updated_at and created_at values","commit_id":"2471c9bb853ae9366ed64e27b6fbc723e50c3de1"},{"author":{"_account_id":7665,"name":"Travis Tripp","email":"os.travis.tripp@gmail.com","username":"travis.tripp"},"change_message_id":"cb16d2d99aaf4ffcaf820f91b9c6a33e7d198c49","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":31,"context_line":"        super(MetadefHandler, self).__init__(*args, **kwargs)"},{"line_number":32,"context_line":"        self.namespace_delete_keys \u003d [\u0027deleted_at\u0027, \u0027deleted\u0027, \u0027created_at\u0027,"},{"line_number":33,"context_line":"                                      \u0027updated_at\u0027, \u0027namespace_old\u0027]"},{"line_number":34,"context_line":"        self.property_delete_keys \u003d [\u0027deleted\u0027, \u0027deleted_at\u0027,"},{"line_number":35,"context_line":"                                     \u0027name_old\u0027, \u0027namespace\u0027]"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7a5de9d1_c4654cb5","line":33,"in_reply_to":"7a5de9d1_34ffce68","updated":"2016-01-29 16:05:35.000000000","message":"I just ran queries on glance and searchlight and looked at this code.  I can\u0027t see any reason... I think we need Lakshmi to chime in here.","commit_id":"2471c9bb853ae9366ed64e27b6fbc723e50c3de1"},{"author":{"_account_id":8959,"name":"Lakshmi N Sampath","email":"lakshmi.sampath@hp.com","username":"lakshmi"},"change_message_id":"75384f65f177bb0de2403ad612ee258226c2a4eb","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":31,"context_line":"        super(MetadefHandler, self).__init__(*args, **kwargs)"},{"line_number":32,"context_line":"        self.namespace_delete_keys \u003d [\u0027deleted_at\u0027, \u0027deleted\u0027, \u0027created_at\u0027,"},{"line_number":33,"context_line":"                                      \u0027updated_at\u0027, \u0027namespace_old\u0027]"},{"line_number":34,"context_line":"        self.property_delete_keys \u003d [\u0027deleted\u0027, \u0027deleted_at\u0027,"},{"line_number":35,"context_line":"                                     \u0027name_old\u0027, \u0027namespace\u0027]"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7a5de9d1_aecd86b8","line":33,"in_reply_to":"7a5de9d1_c4654cb5","updated":"2016-01-29 19:35:45.000000000","message":"I was about to say i forgot, but i \"think\" it was to match the display of property with JSON property schema which doesn\u0027t have timestamp fields to define a property. Now cant see why namespace cannot have those fields. So it\u0027s ok to have those keys inside a namespace but for properties, we should try to remove them from elasticsearch results output if we definitely need them in index.\n\nLet clean up the code in https://github.com/openstack/searchlight/blob/master/searchlight/elasticsearch/plugins/glance/__init__.py#L160 \nwhile we are adding these fields in namespace.","commit_id":"2471c9bb853ae9366ed64e27b6fbc723e50c3de1"},{"author":{"_account_id":4428,"name":"Liyingjun","email":"yinjalee@163.com","username":"liyingjun"},"change_message_id":"348213c2cafb3509e97fdf38bf87d25c044dfb4d","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            \"metadef_namespace.delete_tags\": self.delete_tags"},{"line_number":60,"context_line":"        }"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def run_create(self, id, payload, script\u003dFalse, metadata\u003dNone):"},{"line_number":63,"context_line":"        kwargs \u003d {"},{"line_number":64,"context_line":"            \u0027index\u0027: self.index_name,"},{"line_number":65,"context_line":"            \u0027doc_type\u0027: self.document_type,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a68dd71_4a5bfd54","line":62,"updated":"2016-01-27 02:22:57.000000000","message":"script could be removed since it\u0027s not used anywhere here.","commit_id":"2471c9bb853ae9366ed64e27b6fbc723e50c3de1"},{"author":{"_account_id":4428,"name":"Liyingjun","email":"yinjalee@163.com","username":"liyingjun"},"change_message_id":"348213c2cafb3509e97fdf38bf87d25c044dfb4d","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        except exceptions.ConflictError as e:"},{"line_number":76,"context_line":"            if e.error !\u003d VERSION_CONFLICT_MSG:"},{"line_number":77,"context_line":"                raise e"},{"line_number":78,"context_line":"            LOG.debug("},{"line_number":79,"context_line":"                \u0027Version conflict in updating metadef %s \u0027"},{"line_number":80,"context_line":"                \u0027at version %s\u0027 % (id, version))"},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9a68dd71_ca35adf7","line":78,"updated":"2016-01-27 02:22:57.000000000","message":"LOG.warning","commit_id":"2471c9bb853ae9366ed64e27b6fbc723e50c3de1"},{"author":{"_account_id":4428,"name":"Liyingjun","email":"yinjalee@163.com","username":"liyingjun"},"change_message_id":"348213c2cafb3509e97fdf38bf87d25c044dfb4d","unresolved":false,"context_lines":[{"line_number":76,"context_line":"            if e.error !\u003d VERSION_CONFLICT_MSG:"},{"line_number":77,"context_line":"                raise e"},{"line_number":78,"context_line":"            LOG.debug("},{"line_number":79,"context_line":"                \u0027Version conflict in updating metadef %s \u0027"},{"line_number":80,"context_line":"                \u0027at version %s\u0027 % (id, version))"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def run_update(self, id, payload, script\u003dFalse, metadata\u003dNone):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a68dd71_2a2569c1","line":79,"updated":"2016-01-27 02:22:57.000000000","message":"s/updating/creating","commit_id":"2471c9bb853ae9366ed64e27b6fbc723e50c3de1"},{"author":{"_account_id":4428,"name":"Liyingjun","email":"yinjalee@163.com","username":"liyingjun"},"change_message_id":"348213c2cafb3509e97fdf38bf87d25c044dfb4d","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        except exceptions.ConflictError as e:"},{"line_number":101,"context_line":"            if e.error !\u003d VERSION_CONFLICT_MSG:"},{"line_number":102,"context_line":"                raise e"},{"line_number":103,"context_line":"            LOG.debug(\u0027Version conflict in updating metadef %s \u0027"},{"line_number":104,"context_line":"                      \u0027from version %s\u0027 % (id, version)"},{"line_number":105,"context_line":"                      )"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9a68dd71_de4a4e55","line":103,"updated":"2016-01-27 02:22:57.000000000","message":"LOG.warning","commit_id":"2471c9bb853ae9366ed64e27b6fbc723e50c3de1"},{"author":{"_account_id":14680,"name":"Rick Aulino","email":"rick.aulino@hpe.com","username":"ricka"},"change_message_id":"e12c49f38721ed9535bd406cb27271d6aac92e63","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        if script:"},{"line_number":64,"context_line":"            self.index_helper.update_document(payload, id, script)"},{"line_number":65,"context_line":"        else:"},{"line_number":66,"context_line":"            self.index_helper.update_document(payload, id, script)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def create_ns(self, payload, timestamp):"},{"line_number":69,"context_line":"        namespace \u003d self.format_namespace(payload)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a5ae5dd_038bf81f","line":66,"updated":"2016-02-08 18:26:46.000000000","message":"We need to rebase again to pick up the change here (redundant else clause)","commit_id":"162f64856fb63e488229136d85d26e1056a52bb9"},{"author":{"_account_id":14680,"name":"Rick Aulino","email":"rick.aulino@hpe.com","username":"ricka"},"change_message_id":"e12c49f38721ed9535bd406cb27271d6aac92e63","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        namespace \u003d self.format_namespace(payload)"},{"line_number":70,"context_line":"        self.index_helper.save_document("},{"line_number":71,"context_line":"            namespace,"},{"line_number":72,"context_line":"            version\u003dself.get_version(namespace, payload))"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def update_ns(self, payload, timestamp):"},{"line_number":75,"context_line":"        namespace \u003d self.format_namespace(payload)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a5ae5dd_e359fcfd","line":72,"updated":"2016-02-08 18:26:46.000000000","message":"We should be passing \"timestamp\" as the third parameter, not \"payload\".","commit_id":"162f64856fb63e488229136d85d26e1056a52bb9"},{"author":{"_account_id":10063,"name":"Steve McLellan","email":"steven.j.mclellan@gmail.com","username":"sjmc7"},"change_message_id":"80c11a370bdf5a1760f01237e5e964c179d2d7a9","unresolved":false,"context_lines":[{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def update_ns(self, payload, timestamp):"},{"line_number":75,"context_line":"        namespace \u003d self.format_namespace(payload)"},{"line_number":76,"context_line":"        self.index_helper.save_document("},{"line_number":77,"context_line":"            namespace,"},{"line_number":78,"context_line":"            version\u003dself.get_version(namespace, timestamp))"},{"line_number":79,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"5a5ae5dd_79e4e6aa","line":76,"range":{"start_line":76,"start_character":25,"end_line":76,"end_character":26},"updated":"2016-02-08 16:26:43.000000000","message":"Lakshmi/Travis - is this going to cause problems? If a namespace name is updated, doing a full reindex is going to lose any objects etc attached to it.","commit_id":"162f64856fb63e488229136d85d26e1056a52bb9"},{"author":{"_account_id":7665,"name":"Travis Tripp","email":"os.travis.tripp@gmail.com","username":"travis.tripp"},"change_message_id":"8453701b9eb185c67bf204c53f24309bb8200a7d","unresolved":false,"context_lines":[{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def update_ns(self, payload, timestamp):"},{"line_number":75,"context_line":"        namespace \u003d self.format_namespace(payload)"},{"line_number":76,"context_line":"        self.index_helper.save_document("},{"line_number":77,"context_line":"            namespace,"},{"line_number":78,"context_line":"            version\u003dself.get_version(namespace, timestamp))"},{"line_number":79,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_d5db0d1a","line":76,"range":{"start_line":76,"start_character":25,"end_line":76,"end_character":26},"in_reply_to":"5a5ae5dd_79e4e6aa","updated":"2016-02-10 16:38:17.000000000","message":"Does the notification have the previous namespace name?  If not, maybe Lakshmi could update the metadefs notifications with a patch.","commit_id":"162f64856fb63e488229136d85d26e1056a52bb9"}],"searchlight/elasticsearch/plugins/nova/servers_notification_handler.py":[{"author":{"_account_id":4428,"name":"Liyingjun","email":"yinjalee@163.com","username":"liyingjun"},"change_message_id":"348213c2cafb3509e97fdf38bf87d25c044dfb4d","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        except exceptions.ConflictError as e:"},{"line_number":101,"context_line":"            if e.error !\u003d VERSION_CONFLICT_MSG:"},{"line_number":102,"context_line":"                raise e"},{"line_number":103,"context_line":"            LOG.debug(\u0027Version conflict in updating instance %s \u0027"},{"line_number":104,"context_line":"                      \u0027at version %s\u0027 % (instance_id, version)"},{"line_number":105,"context_line":"                      )"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9a68dd71_fe8cf280","line":103,"updated":"2016-01-27 02:22:57.000000000","message":"LOG.warning","commit_id":"2471c9bb853ae9366ed64e27b6fbc723e50c3de1"},{"author":{"_account_id":14680,"name":"Rick Aulino","email":"rick.aulino@hpe.com","username":"ricka"},"change_message_id":"e12c49f38721ed9535bd406cb27271d6aac92e63","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            self.index_helper.save_document("},{"line_number":74,"context_line":"                payload,"},{"line_number":75,"context_line":"                version\u003dself.get_version(payload, timestamp))"},{"line_number":76,"context_line":"        except novaclient.exceptions.NotFound:"},{"line_number":77,"context_line":"            LOG.warning(_LW(\"Instance %s not found; deleting\") % instance_id)"},{"line_number":78,"context_line":"            try:"},{"line_number":79,"context_line":"                self.index_helper.delete_document_by_id(instance_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a5ae5dd_0308d8d8","line":76,"updated":"2016-02-08 18:26:46.000000000","message":"We use to catch the versioning ConflictError exception when calling ES.index. Now we are calling save_document, but we do not catch the exception anymore. Seems like a rebase/merge issue.","commit_id":"162f64856fb63e488229136d85d26e1056a52bb9"},{"author":{"_account_id":10063,"name":"Steve McLellan","email":"steven.j.mclellan@gmail.com","username":"sjmc7"},"change_message_id":"cdf15d278248d1bdba6519f5f60046c94c7dadf9","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            self.index_helper.save_document("},{"line_number":74,"context_line":"                payload,"},{"line_number":75,"context_line":"                version\u003dself.get_version(payload, timestamp))"},{"line_number":76,"context_line":"        except novaclient.exceptions.NotFound:"},{"line_number":77,"context_line":"            LOG.warning(_LW(\"Instance %s not found; deleting\") % instance_id)"},{"line_number":78,"context_line":"            try:"},{"line_number":79,"context_line":"                self.index_helper.delete_document_by_id(instance_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a5ae5dd_b751c7da","line":76,"in_reply_to":"5a5ae5dd_0308d8d8","updated":"2016-02-09 17:56:58.000000000","message":"Rick\u0027s right - the ConflictError needs to be trapped (but in IndexHelper).","commit_id":"162f64856fb63e488229136d85d26e1056a52bb9"}],"searchlight/elasticsearch/plugins/utils.py":[{"author":{"_account_id":10063,"name":"Steve McLellan","email":"steven.j.mclellan@gmail.com","username":"sjmc7"},"change_message_id":"cdf15d278248d1bdba6519f5f60046c94c7dadf9","unresolved":false,"context_lines":[{"line_number":136,"context_line":"    def index_chunk_size(self):"},{"line_number":137,"context_line":"        return 200"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def save_document(self, document, version\u003dFalse):"},{"line_number":140,"context_line":"        if version:"},{"line_number":141,"context_line":"            self.save_documents([document], [version])"},{"line_number":142,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a5ae5dd_37b0768b","line":139,"range":{"start_line":139,"start_character":46,"end_line":139,"end_character":51},"updated":"2016-02-09 17:56:58.000000000","message":"This should use None. False has a specific meaning that\u0027s misleading here. Are there legitimate reasons not to supply a version? It\u0027d make a lot of this logic simpler if not.","commit_id":"162f64856fb63e488229136d85d26e1056a52bb9"},{"author":{"_account_id":7665,"name":"Travis Tripp","email":"os.travis.tripp@gmail.com","username":"travis.tripp"},"change_message_id":"8453701b9eb185c67bf204c53f24309bb8200a7d","unresolved":false,"context_lines":[{"line_number":136,"context_line":"    def index_chunk_size(self):"},{"line_number":137,"context_line":"        return 200"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def save_document(self, document, version\u003dFalse):"},{"line_number":140,"context_line":"        if version:"},{"line_number":141,"context_line":"            self.save_documents([document], [version])"},{"line_number":142,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_f57409fe","line":139,"range":{"start_line":139,"start_character":46,"end_line":139,"end_character":51},"in_reply_to":"3a57f1b5_e0ff8d32","updated":"2016-02-10 16:38:17.000000000","message":"Does the actual image update time change?","commit_id":"162f64856fb63e488229136d85d26e1056a52bb9"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"c5c0f82b077104ad021822c556088fb27d888f4f","unresolved":false,"context_lines":[{"line_number":136,"context_line":"    def index_chunk_size(self):"},{"line_number":137,"context_line":"        return 200"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def save_document(self, document, version\u003dFalse):"},{"line_number":140,"context_line":"        if version:"},{"line_number":141,"context_line":"            self.save_documents([document], [version])"},{"line_number":142,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":5,"id":"dae33548_e01157b1","line":139,"range":{"start_line":139,"start_character":46,"end_line":139,"end_character":51},"in_reply_to":"3a57f1b5_f57409fe","updated":"2016-02-14 14:45:53.000000000","message":"Image update time won\u0027t change, the time in member notification is member\u0027s update time, \"image\" and \"member\" are two different types, but changes to either \"image\" or \"member\" will update es image document. If we update or index image member info of es without version, the version of the updated document will auto increment by 1, which makes the version becomes inaccurate and confusing.","commit_id":"162f64856fb63e488229136d85d26e1056a52bb9"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"ccbb397eba4d62b37796b4cd9e91e79995d7d05c","unresolved":false,"context_lines":[{"line_number":136,"context_line":"    def index_chunk_size(self):"},{"line_number":137,"context_line":"        return 200"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def save_document(self, document, version\u003dFalse):"},{"line_number":140,"context_line":"        if version:"},{"line_number":141,"context_line":"            self.save_documents([document], [version])"},{"line_number":142,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_e0ff8d32","line":139,"range":{"start_line":139,"start_character":46,"end_line":139,"end_character":51},"in_reply_to":"5a5ae5dd_37b0768b","updated":"2016-02-10 08:18:51.000000000","message":"At first I thought glance sync member doesn\u0027t provide updated time, so I don\u0027t add version support for sync member, but from the code it seems that member notification contains updated time, we just update members info and ignore those time fields. I will add version support on \"sync_members\" method and make version parameter as required.","commit_id":"162f64856fb63e488229136d85d26e1056a52bb9"},{"author":{"_account_id":10063,"name":"Steve McLellan","email":"steven.j.mclellan@gmail.com","username":"sjmc7"},"change_message_id":"6855812d83765926fe85dade80274bd5b1c1e475","unresolved":false,"context_lines":[{"line_number":136,"context_line":"    def index_chunk_size(self):"},{"line_number":137,"context_line":"        return 200"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def save_document(self, document, version\u003dFalse):"},{"line_number":140,"context_line":"        if version:"},{"line_number":141,"context_line":"            self.save_documents([document], [version])"},{"line_number":142,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":5,"id":"dae33548_8a01e6b1","line":139,"range":{"start_line":139,"start_character":46,"end_line":139,"end_character":51},"in_reply_to":"dae33548_e01157b1","updated":"2016-02-17 16:58:06.000000000","message":"See the other comment i made in the notification handler; we\u0027ll change image member updates to use a scripted update without modifying the version.","commit_id":"162f64856fb63e488229136d85d26e1056a52bb9"},{"author":{"_account_id":10063,"name":"Steve McLellan","email":"steven.j.mclellan@gmail.com","username":"sjmc7"},"change_message_id":"cdf15d278248d1bdba6519f5f60046c94c7dadf9","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        else:"},{"line_number":143,"context_line":"            self.save_documents([document])"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    def save_documents(self, documents, versions\u003dFalse):"},{"line_number":146,"context_line":"        \"\"\"Send list of serialized documents into search engine.\"\"\""},{"line_number":147,"context_line":"        result \u003d helpers.bulk("},{"line_number":148,"context_line":"            client\u003dself.engine,"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a5ae5dd_b730e608","line":145,"range":{"start_line":145,"start_character":49,"end_line":145,"end_character":54},"updated":"2016-02-09 17:56:58.000000000","message":"Ditto - use None","commit_id":"162f64856fb63e488229136d85d26e1056a52bb9"},{"author":{"_account_id":10063,"name":"Steve McLellan","email":"steven.j.mclellan@gmail.com","username":"sjmc7"},"change_message_id":"cdf15d278248d1bdba6519f5f60046c94c7dadf9","unresolved":false,"context_lines":[{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    def save_documents(self, documents, versions\u003dFalse):"},{"line_number":146,"context_line":"        \"\"\"Send list of serialized documents into search engine.\"\"\""},{"line_number":147,"context_line":"        result \u003d helpers.bulk("},{"line_number":148,"context_line":"            client\u003dself.engine,"},{"line_number":149,"context_line":"            index\u003dself.index_name,"},{"line_number":150,"context_line":"            doc_type\u003dself.document_type,"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a5ae5dd_5ac1977f","line":147,"range":{"start_line":147,"start_character":17,"end_line":147,"end_character":24},"updated":"2016-02-09 17:56:58.000000000","message":"As Rick mentioned, we need to report on ConflictErrors here; when I manually tested this, I got a BulkIndexError listing this:\n\n2016-02-09 11:49:59.174 8012 ERROR searchlight.elasticsearch.plugins.base [-] (u\u00272 document(s) failed to index.\u0027, [{u\u0027index\u0027: {u\u0027status\u0027: 409, u\u0027_type\u0027: u\u0027OS::Nova::Server\u0027, u\u0027_id\u0027: u\u002702b1c1e4-a6c2-439c-9527-62c964f2788b_ADMIN\u0027, u\u0027error\u0027: u\u0027VersionConflictEngineException[[searchlight][0] [OS::Nova::Server][02b1c1e4-a6c2-439c-9527-62c964f2788b_ADMIN]: version conflict, current [455039831000000000], provided [455039823039823383]]\u0027, u\u0027_index\u0027: u\u0027searchlight\u0027}}, {u\u0027index\u0027: {u\u0027status\u0027: 409, u\u0027_type\u0027: u\u0027OS::Nova::Server\u0027, u\u0027_id\u0027: u\u002702b1c1e4-a6c2-439c-9527-62c964f2788b_USER\u0027, u\u0027error\u0027: u\u0027VersionConflictEngineException[[searchlight][0] [OS::Nova::Server][02b1c1e4-a6c2-439c-9527-62c964f2788b_USER]: version conflict, current [455039831000000000], provided [455039823039823383]]\u0027, u\u0027_index\u0027: u\u0027searchlight\u0027}}])","commit_id":"162f64856fb63e488229136d85d26e1056a52bb9"},{"author":{"_account_id":10063,"name":"Steve McLellan","email":"steven.j.mclellan@gmail.com","username":"sjmc7"},"change_message_id":"6855812d83765926fe85dade80274bd5b1c1e475","unresolved":false,"context_lines":[{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    def save_documents(self, documents, versions\u003dFalse):"},{"line_number":146,"context_line":"        \"\"\"Send list of serialized documents into search engine.\"\"\""},{"line_number":147,"context_line":"        result \u003d helpers.bulk("},{"line_number":148,"context_line":"            client\u003dself.engine,"},{"line_number":149,"context_line":"            index\u003dself.index_name,"},{"line_number":150,"context_line":"            doc_type\u003dself.document_type,"}],"source_content_type":"text/x-python","patch_set":5,"id":"dae33548_aaa78abb","line":147,"range":{"start_line":147,"start_character":17,"end_line":147,"end_character":24},"in_reply_to":"3a57f1b5_60c15de4","updated":"2016-02-17 16:58:06.000000000","message":"Yeah, i noticed that. Longer term we need to consider this more carefully; an indexing error might occur for various reasons and we might be able to recover in some circumstances but not others. For now, let\u0027s at least make sure we\u0027re logging errors and not crashing everything out.","commit_id":"162f64856fb63e488229136d85d26e1056a52bb9"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"ccbb397eba4d62b37796b4cd9e91e79995d7d05c","unresolved":false,"context_lines":[{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    def save_documents(self, documents, versions\u003dFalse):"},{"line_number":146,"context_line":"        \"\"\"Send list of serialized documents into search engine.\"\"\""},{"line_number":147,"context_line":"        result \u003d helpers.bulk("},{"line_number":148,"context_line":"            client\u003dself.engine,"},{"line_number":149,"context_line":"            index\u003dself.index_name,"},{"line_number":150,"context_line":"            doc_type\u003dself.document_type,"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a57f1b5_60c15de4","line":147,"range":{"start_line":147,"start_character":17,"end_line":147,"end_character":24},"in_reply_to":"5a5ae5dd_5ac1977f","updated":"2016-02-10 08:18:51.000000000","message":"yes, exceptions in bulk methods are different with \"indexing\" method, will catch Exception when all of the errors are \"VersionConflictEngineException\", if there are other errors mixed with conflict error, the exception will be raised to the outside.","commit_id":"162f64856fb63e488229136d85d26e1056a52bb9"},{"author":{"_account_id":10063,"name":"Steve McLellan","email":"steven.j.mclellan@gmail.com","username":"sjmc7"},"change_message_id":"cdf15d278248d1bdba6519f5f60046c94c7dadf9","unresolved":false,"context_lines":[{"line_number":211,"context_line":"            actions\u003dactions)"},{"line_number":212,"context_line":"        LOG.debug(\"Update result: %s\", result)"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"    def _apply_role_filtering(self, documents, versions\u003dFalse):"},{"line_number":215,"context_line":"        \"\"\"Returns a generator of indexable \u0027actions\u0027. If the plugin requires"},{"line_number":216,"context_line":"        role-based separation, two actions will be yielded per document,"},{"line_number":217,"context_line":"        otherwise one. _id and USER_ROLE_FIELD are set as appropriate"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a5ae5dd_f72e5ea4","line":214,"range":{"start_line":214,"start_character":56,"end_line":214,"end_character":61},"updated":"2016-02-09 17:56:58.000000000","message":"Also \u0027None\u0027","commit_id":"162f64856fb63e488229136d85d26e1056a52bb9"},{"author":{"_account_id":10063,"name":"Steve McLellan","email":"steven.j.mclellan@gmail.com","username":"sjmc7"},"change_message_id":"cdf15d278248d1bdba6519f5f60046c94c7dadf9","unresolved":false,"context_lines":[{"line_number":216,"context_line":"        role-based separation, two actions will be yielded per document,"},{"line_number":217,"context_line":"        otherwise one. _id and USER_ROLE_FIELD are set as appropriate"},{"line_number":218,"context_line":"        \"\"\""},{"line_number":219,"context_line":"        def _get_index_action(doc, version\u003dFalse, id_suffix\u003d\u0027\u0027):"},{"line_number":220,"context_line":"            \"\"\"Return an \u0027action\u0027 the ES bulk indexer understands\"\"\""},{"line_number":221,"context_line":"            action \u003d {"},{"line_number":222,"context_line":"                \u0027_id\u0027: doc[self.plugin.get_document_id_field()] + id_suffix,"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a5ae5dd_b7178653","line":219,"range":{"start_line":219,"start_character":43,"end_line":219,"end_character":48},"updated":"2016-02-09 17:56:58.000000000","message":"Also None","commit_id":"162f64856fb63e488229136d85d26e1056a52bb9"},{"author":{"_account_id":10063,"name":"Steve McLellan","email":"steven.j.mclellan@gmail.com","username":"sjmc7"},"change_message_id":"f1698cb60e55b8c8d5e5219fa816c76ad5353d68","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        else:"},{"line_number":143,"context_line":"            self.save_documents([document])"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    def save_documents(self, documents, versions\u003dNone):"},{"line_number":146,"context_line":"        \"\"\"Send list of serialized documents into search engine.\"\"\""},{"line_number":147,"context_line":"        try:"},{"line_number":148,"context_line":"            result \u003d helpers.bulk("}],"source_content_type":"text/x-python","patch_set":8,"id":"bae84128_3d0fe82f","line":145,"range":{"start_line":145,"start_character":49,"end_line":145,"end_character":53},"updated":"2016-02-24 21:36:06.000000000","message":"Looking back now, we might\u0027ve been better temporarily attaching \u0027version\u0027 to each document rather than passing it around separately but i guess that can come later","commit_id":"6cc7614fd28a6b32a16458c367dca33f66264d00"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"97b5e0cc53b06251870841ad242c6caf840e7293","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        else:"},{"line_number":143,"context_line":"            self.save_documents([document])"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    def save_documents(self, documents, versions\u003dNone):"},{"line_number":146,"context_line":"        \"\"\"Send list of serialized documents into search engine.\"\"\""},{"line_number":147,"context_line":"        try:"},{"line_number":148,"context_line":"            result \u003d helpers.bulk("}],"source_content_type":"text/x-python","patch_set":8,"id":"bae84128_8ff4ec87","line":145,"range":{"start_line":145,"start_character":49,"end_line":145,"end_character":53},"in_reply_to":"bae84128_3d0fe82f","updated":"2016-02-25 13:51:53.000000000","message":"ok, I can do it in a separate patch.","commit_id":"6cc7614fd28a6b32a16458c367dca33f66264d00"},{"author":{"_account_id":10063,"name":"Steve McLellan","email":"steven.j.mclellan@gmail.com","username":"sjmc7"},"change_message_id":"f1698cb60e55b8c8d5e5219fa816c76ad5353d68","unresolved":false,"context_lines":[{"line_number":151,"context_line":"                doc_type\u003dself.document_type,"},{"line_number":152,"context_line":"                chunk_size\u003dself.index_chunk_size,"},{"line_number":153,"context_line":"                actions\u003dself._apply_role_filtering(documents, versions))"},{"line_number":154,"context_line":"        except helpers.BulkIndexError as e:"},{"line_number":155,"context_line":"            err_msg \u003d []"},{"line_number":156,"context_line":"            for err in e.errors:"},{"line_number":157,"context_line":"                if \"VersionConflict\" not in err[\u0027index\u0027][\u0027error\u0027]:"}],"source_content_type":"text/x-python","patch_set":8,"id":"bae84128_6a6c0837","line":154,"range":{"start_line":154,"start_character":8,"end_line":154,"end_character":14},"updated":"2016-02-24 21:36:06.000000000","message":"If some documents are saved but others conflict (a partially successful update), what happens?","commit_id":"6cc7614fd28a6b32a16458c367dca33f66264d00"},{"author":{"_account_id":16150,"name":"Lei Zhang","email":"lei.a.zhang@intel.com","username":"leizhang"},"change_message_id":"97b5e0cc53b06251870841ad242c6caf840e7293","unresolved":false,"context_lines":[{"line_number":151,"context_line":"                doc_type\u003dself.document_type,"},{"line_number":152,"context_line":"                chunk_size\u003dself.index_chunk_size,"},{"line_number":153,"context_line":"                actions\u003dself._apply_role_filtering(documents, versions))"},{"line_number":154,"context_line":"        except helpers.BulkIndexError as e:"},{"line_number":155,"context_line":"            err_msg \u003d []"},{"line_number":156,"context_line":"            for err in e.errors:"},{"line_number":157,"context_line":"                if \"VersionConflict\" not in err[\u0027index\u0027][\u0027error\u0027]:"}],"source_content_type":"text/x-python","patch_set":8,"id":"bae84128_95117db2","line":154,"range":{"start_line":154,"start_character":8,"end_line":154,"end_character":14},"in_reply_to":"bae84128_6a6c0837","updated":"2016-02-25 13:51:53.000000000","message":"I should calculate index result, instead of setting it 0. If a partially successful update comes, catch the exception, log conflict and successful index, is that OK?","commit_id":"6cc7614fd28a6b32a16458c367dca33f66264d00"}]}
