)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":39181,"name":"huangjs3","display_name":"huangjs3","email":"huangjs3@lenovo.com","username":"huangjs3"},"change_message_id":"b7ae4af21fffa4b16d2a024c2e48c6916a5c9816","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"e6d9b9a9_f81fe6ab","updated":"2026-06-14 16:29:41.000000000","message":"Hi @gibi (and reviewers),\nThanks for the reviews — the fix correctly guards against division by zero when cputime_delta ≤ 0, which can occur during host pause, container restart, or counter rollback.\nThe change is well-scoped: minimal logic update + unit test coverage + release note. CI is green (Verified +1).\nCould you please add a Workflow+1 when you have a moment? This would allow merging into master.\nAppreciate your time and guidance! 🙇","commit_id":"8e512ed08d271be74a92396ed6475c0d2cd0219b"},{"author":{"_account_id":39181,"name":"huangjs3","display_name":"huangjs3","email":"huangjs3@lenovo.com","username":"huangjs3"},"change_message_id":"332d56d734dcd3582ab2aca92adb1a050dd686ce","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"3a9c6fdf_1eaa1a37","updated":"2026-06-14 11:12:16.000000000","message":"recheck","commit_id":"8e512ed08d271be74a92396ed6475c0d2cd0219b"},{"author":{"_account_id":39181,"name":"huangjs3","display_name":"huangjs3","email":"huangjs3@lenovo.com","username":"huangjs3"},"change_message_id":"a7aef19fb7ec66ca8d73bf0b35ae3f055108ee77","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"56501d04_205bc7f8","updated":"2026-06-13 13:01:34.000000000","message":"recheck","commit_id":"8e512ed08d271be74a92396ed6475c0d2cd0219b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"4f3cfcf9d74216470800eeb360155a9e707055aa","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"f530b6ef_f9668ca6","updated":"2026-06-15 14:08:17.000000000","message":"the bug i think is vaild but i think there is a cleaner fix","commit_id":"8e512ed08d271be74a92396ed6475c0d2cd0219b"},{"author":{"_account_id":39181,"name":"huangjs3","display_name":"huangjs3","email":"huangjs3@lenovo.com","username":"huangjs3"},"change_message_id":"924610910791eb03bad0a0f5fcf8d73b3c479326","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"fecf55da_8456dc7f","updated":"2026-06-15 16:01:53.000000000","message":"recheck","commit_id":"7fb2cd952cdeb9f80aaf84d6ff40139f18d45228"}],"nova/compute/monitors/cpu/virt_driver.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"4f3cfcf9d74216470800eeb360155a9e707055aa","unresolved":true,"context_lines":[{"line_number":52,"context_line":"    def _update_data(self):"},{"line_number":53,"context_line":"        self._data \u003d {}"},{"line_number":54,"context_line":"        self._data[\"timestamp\"] \u003d timeutils.utcnow()"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        # Extract node\u0027s CPU statistics."},{"line_number":57,"context_line":"        try:"},{"line_number":58,"context_line":"            stats \u003d self.driver.get_host_cpu_stats()"},{"line_number":59,"context_line":"            self._data[\"cpu.user.time\"] \u003d stats[\"user\"]"},{"line_number":60,"context_line":"            self._data[\"cpu.kernel.time\"] \u003d stats[\"kernel\"]"},{"line_number":61,"context_line":"            self._data[\"cpu.idle.time\"] \u003d stats[\"idle\"]"}],"source_content_type":"text/x-python","patch_set":1,"id":"a43d1296_64b45248","line":58,"range":{"start_line":55,"start_character":1,"end_line":58,"end_character":52},"updated":"2026-06-15 14:08:17.000000000","message":"a better soltuion may be to do this\n\n\n```suggestion\n        cpu_time\u003d -1\n        # Extract node\u0027s CPU statistics.\n        try:\n            stats \u003d self.driver.get_host_cpu_stats()\n            cputime \u003d float(stats[\"total\"] - self._cpu_stats.get(\"total\", 0))\n            if cputime \u003c 0:\n             LOG.warning(\"time went backwards, skipping stat update.\")\n             return\n            \n```","commit_id":"8e512ed08d271be74a92396ed6475c0d2cd0219b"},{"author":{"_account_id":39181,"name":"huangjs3","display_name":"huangjs3","email":"huangjs3@lenovo.com","username":"huangjs3"},"change_message_id":"924610910791eb03bad0a0f5fcf8d73b3c479326","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    def _update_data(self):"},{"line_number":53,"context_line":"        self._data \u003d {}"},{"line_number":54,"context_line":"        self._data[\"timestamp\"] \u003d timeutils.utcnow()"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        # Extract node\u0027s CPU statistics."},{"line_number":57,"context_line":"        try:"},{"line_number":58,"context_line":"            stats \u003d self.driver.get_host_cpu_stats()"},{"line_number":59,"context_line":"            self._data[\"cpu.user.time\"] \u003d stats[\"user\"]"},{"line_number":60,"context_line":"            self._data[\"cpu.kernel.time\"] \u003d stats[\"kernel\"]"},{"line_number":61,"context_line":"            self._data[\"cpu.idle.time\"] \u003d stats[\"idle\"]"}],"source_content_type":"text/x-python","patch_set":1,"id":"a70dc9e7_b14020e7","line":58,"range":{"start_line":55,"start_character":1,"end_line":58,"end_character":52},"in_reply_to":"a43d1296_64b45248","updated":"2026-06-15 16:01:53.000000000","message":"Done. Implemented the safe delta calculation with backward-time detection in the latest patch set. Please take a look.","commit_id":"8e512ed08d271be74a92396ed6475c0d2cd0219b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"4f3cfcf9d74216470800eeb360155a9e707055aa","unresolved":true,"context_lines":[{"line_number":82,"context_line":"        # computing per-state percentages would either divide by"},{"line_number":83,"context_line":"        # zero or yield negative numbers. Report 0% for the percent"},{"line_number":84,"context_line":"        # metrics and update the cached stats so the next sample can"},{"line_number":85,"context_line":"        # compute deltas."},{"line_number":86,"context_line":"        if cputime \u003c\u003d 0:"},{"line_number":87,"context_line":"            self._data[\"cpu.user.percent\"] \u003d 0"},{"line_number":88,"context_line":"            self._data[\"cpu.kernel.percent\"] \u003d 0"}],"source_content_type":"text/x-python","patch_set":1,"id":"4294cf6b_0acf2a9b","line":85,"updated":"2026-06-15 14:08:17.000000000","message":"i guess it can go backword if you refesh the time with ntpdate or depending on how youru timesouce trates daylight saving ectra so ok.","commit_id":"8e512ed08d271be74a92396ed6475c0d2cd0219b"},{"author":{"_account_id":39181,"name":"huangjs3","display_name":"huangjs3","email":"huangjs3@lenovo.com","username":"huangjs3"},"change_message_id":"924610910791eb03bad0a0f5fcf8d73b3c479326","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        # computing per-state percentages would either divide by"},{"line_number":83,"context_line":"        # zero or yield negative numbers. Report 0% for the percent"},{"line_number":84,"context_line":"        # metrics and update the cached stats so the next sample can"},{"line_number":85,"context_line":"        # compute deltas."},{"line_number":86,"context_line":"        if cputime \u003c\u003d 0:"},{"line_number":87,"context_line":"            self._data[\"cpu.user.percent\"] \u003d 0"},{"line_number":88,"context_line":"            self._data[\"cpu.kernel.percent\"] \u003d 0"}],"source_content_type":"text/x-python","patch_set":1,"id":"45dd135d_4c653e06","line":85,"in_reply_to":"4294cf6b_0acf2a9b","updated":"2026-06-15 16:01:53.000000000","message":"Acknowledged","commit_id":"8e512ed08d271be74a92396ed6475c0d2cd0219b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"4f3cfcf9d74216470800eeb360155a9e707055aa","unresolved":true,"context_lines":[{"line_number":84,"context_line":"        # metrics and update the cached stats so the next sample can"},{"line_number":85,"context_line":"        # compute deltas."},{"line_number":86,"context_line":"        if cputime \u003c\u003d 0:"},{"line_number":87,"context_line":"            self._data[\"cpu.user.percent\"] \u003d 0"},{"line_number":88,"context_line":"            self._data[\"cpu.kernel.percent\"] \u003d 0"},{"line_number":89,"context_line":"            self._data[\"cpu.idle.percent\"] \u003d 0"},{"line_number":90,"context_line":"            self._data[\"cpu.iowait.percent\"] \u003d 0"},{"line_number":91,"context_line":"            self._data[\"cpu.percent\"] \u003d 0"},{"line_number":92,"context_line":"            self._cpu_stats \u003d stats.copy()"},{"line_number":93,"context_line":"            return"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        # NOTE(jwcroppe): Convert all the `perc` values to their integer forms"}],"source_content_type":"text/x-python","patch_set":1,"id":"9d9b27da_e742b15a","line":92,"range":{"start_line":87,"start_character":4,"end_line":92,"end_character":42},"updated":"2026-06-15 14:08:17.000000000","message":"reporting 0 ios an option i guess i would have reported the last know stats\ninstead.\n\n\n\n```suggestion\n            self._data[\"cpu.user.percent\"] \u003d stats[\"cpu.user.percent\"]\n            self._data[\"cpu.kernel.percent\"] \u003d stats[\"cpu.kernel.percent\"]\n            self._data[\"cpu.idle.percent\"] \u003d stats[\"cpu.idle.percent\"]\n            self._data[\"cpu.iowait.percent\"] \u003d stats[\"cpu.iowait.percent\"]\n            self._data[\"cpu.percent\"] \u003d stats[\"cpu.percent\"]\n            self._cpu_stats \u003d stats.copy()\n```","commit_id":"8e512ed08d271be74a92396ed6475c0d2cd0219b"},{"author":{"_account_id":39181,"name":"huangjs3","display_name":"huangjs3","email":"huangjs3@lenovo.com","username":"huangjs3"},"change_message_id":"924610910791eb03bad0a0f5fcf8d73b3c479326","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        # metrics and update the cached stats so the next sample can"},{"line_number":85,"context_line":"        # compute deltas."},{"line_number":86,"context_line":"        if cputime \u003c\u003d 0:"},{"line_number":87,"context_line":"            self._data[\"cpu.user.percent\"] \u003d 0"},{"line_number":88,"context_line":"            self._data[\"cpu.kernel.percent\"] \u003d 0"},{"line_number":89,"context_line":"            self._data[\"cpu.idle.percent\"] \u003d 0"},{"line_number":90,"context_line":"            self._data[\"cpu.iowait.percent\"] \u003d 0"},{"line_number":91,"context_line":"            self._data[\"cpu.percent\"] \u003d 0"},{"line_number":92,"context_line":"            self._cpu_stats \u003d stats.copy()"},{"line_number":93,"context_line":"            return"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        # NOTE(jwcroppe): Convert all the `perc` values to their integer forms"}],"source_content_type":"text/x-python","patch_set":1,"id":"95944521_8be3ed85","line":92,"range":{"start_line":87,"start_character":4,"end_line":92,"end_character":42},"in_reply_to":"9d9b27da_e742b15a","updated":"2026-06-15 16:01:53.000000000","message":"Done","commit_id":"8e512ed08d271be74a92396ed6475c0d2cd0219b"}]}
