)]}'
{"glance/db/sqlalchemy/api.py":[{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"a1467b80a1bf98fd10dd26a560544889ce8109e5","unresolved":false,"context_lines":[{"line_number":1329,"context_line":"    # right order to avoid FK constraint violation."},{"line_number":1330,"context_line":"    t \u003d Table(\"tasks\", metadata, autoload\u003dTrue)"},{"line_number":1331,"context_line":"    ti \u003d Table(\"task_info\", metadata, autoload\u003dTrue)"},{"line_number":1332,"context_line":"    j \u003d ti.join(t, t.c.id \u003d\u003d ti.c.task_id)"},{"line_number":1333,"context_line":"    deleted_task_info \u003d sql.select([ti.c.task_id],"},{"line_number":1334,"context_line":"                                   t.c.deleted_at \u003c deleted_age).\\"},{"line_number":1335,"context_line":"        select_from(j).limit(max_rows)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_40e6ed4b","line":1332,"range":{"start_line":1332,"start_character":4,"end_line":1332,"end_character":5},"updated":"2018-11-16 04:41:32.000000000","message":"Could you please use more meaningful name here?\nLike joined_rec, or join_query etc?","commit_id":"5bb79e0c2fa8789c53775eed8229c684cc029725"},{"author":{"_account_id":28948,"name":"Liang Fang","email":"liang.a.fang@intel.com","username":"liang"},"change_message_id":"de9d3752842dff06929560bf82b0d841c48b7304","unresolved":false,"context_lines":[{"line_number":1329,"context_line":"    # right order to avoid FK constraint violation."},{"line_number":1330,"context_line":"    t \u003d Table(\"tasks\", metadata, autoload\u003dTrue)"},{"line_number":1331,"context_line":"    ti \u003d Table(\"task_info\", metadata, autoload\u003dTrue)"},{"line_number":1332,"context_line":"    j \u003d ti.join(t, t.c.id \u003d\u003d ti.c.task_id)"},{"line_number":1333,"context_line":"    deleted_task_info \u003d sql.select([ti.c.task_id],"},{"line_number":1334,"context_line":"                                   t.c.deleted_at \u003c deleted_age).\\"},{"line_number":1335,"context_line":"        select_from(j).limit(max_rows)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_e0d4d920","line":1332,"range":{"start_line":1332,"start_character":4,"end_line":1332,"end_character":5},"in_reply_to":"3f79a3b5_40e6ed4b","updated":"2018-11-16 05:14:24.000000000","message":"changed to \u0027joined_rec\u0027, thanks","commit_id":"5bb79e0c2fa8789c53775eed8229c684cc029725"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"a1467b80a1bf98fd10dd26a560544889ce8109e5","unresolved":false,"context_lines":[{"line_number":1338,"context_line":"    LOG.info(_LI(\u0027Purging deleted rows older than %(age_in_days)d day(s) \u0027"},{"line_number":1339,"context_line":"                 \u0027from table %(tbl)s\u0027),"},{"line_number":1340,"context_line":"             {\u0027age_in_days\u0027: age_in_days, \u0027tbl\u0027: ti})"},{"line_number":1341,"context_line":"    try:"},{"line_number":1342,"context_line":"        with session.begin():"},{"line_number":1343,"context_line":"            result \u003d session.execute(delete_statement)"},{"line_number":1344,"context_line":"    except (db_exception.DBError, db_exception.DBReferenceError) as ex:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_00f0f5fb","line":1341,"updated":"2018-11-16 04:41:32.000000000","message":"I have one question here, as we are deleting records from task_info table here, will it revisit the same table at line #1369, if yes then we need to avoid that.","commit_id":"5bb79e0c2fa8789c53775eed8229c684cc029725"},{"author":{"_account_id":28948,"name":"Liang Fang","email":"liang.a.fang@intel.com","username":"liang"},"change_message_id":"de9d3752842dff06929560bf82b0d841c48b7304","unresolved":false,"context_lines":[{"line_number":1338,"context_line":"    LOG.info(_LI(\u0027Purging deleted rows older than %(age_in_days)d day(s) \u0027"},{"line_number":1339,"context_line":"                 \u0027from table %(tbl)s\u0027),"},{"line_number":1340,"context_line":"             {\u0027age_in_days\u0027: age_in_days, \u0027tbl\u0027: ti})"},{"line_number":1341,"context_line":"    try:"},{"line_number":1342,"context_line":"        with session.begin():"},{"line_number":1343,"context_line":"            result \u003d session.execute(delete_statement)"},{"line_number":1344,"context_line":"    except (db_exception.DBError, db_exception.DBReferenceError) as ex:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_20b411f4","line":1341,"in_reply_to":"3f79a3b5_00f0f5fb","updated":"2018-11-16 05:14:24.000000000","message":"will not revisit table \u0027task_info\u0027 because this table don\u0027t contain column \u0027deleted\u0027, so it is not in \u0027tables\u0027, see line 1323.\n\ncolumns of task_info:\n+---------+-------------+------+-----+---------+-------+\n| Field   | Type        | Null | Key | Default | Extra |\n+---------+-------------+------+-----+---------+-------+\n| task_id | varchar(36) | NO   | PRI | NULL    |       |\n| input   | text        | YES  |     | NULL    |       |\n| result  | text        | YES  |     | NULL    |       |\n| message | text        | YES  |     | NULL    |       |\n+---------+-------------+------+-----+---------+-------+","commit_id":"5bb79e0c2fa8789c53775eed8229c684cc029725"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"2b6d25ccb9e9c557a81bfea660bad5bed2860ec2","unresolved":false,"context_lines":[{"line_number":1330,"context_line":"    t \u003d Table(\"tasks\", metadata, autoload\u003dTrue)"},{"line_number":1331,"context_line":"    ti \u003d Table(\"task_info\", metadata, autoload\u003dTrue)"},{"line_number":1332,"context_line":"    joined_rec \u003d ti.join(t, t.c.id \u003d\u003d ti.c.task_id)"},{"line_number":1333,"context_line":"    deleted_task_info \u003d sql.select([ti.c.task_id],"},{"line_number":1334,"context_line":"                                   t.c.deleted_at \u003c deleted_age).\\"},{"line_number":1335,"context_line":"        select_from(joined_rec).limit(max_rows)"},{"line_number":1336,"context_line":"    delete_statement \u003d DeleteFromSelect(ti, deleted_task_info,"},{"line_number":1337,"context_line":"                                        ti.c.task_id)"},{"line_number":1338,"context_line":"    LOG.info(_LI(\u0027Purging deleted rows older than %(age_in_days)d day(s) \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_e53f9d81","line":1335,"range":{"start_line":1333,"start_character":0,"end_line":1335,"end_character":47},"updated":"2018-12-07 00:07:30.000000000","message":"do we need an order_by in here? what I\u0027m worried about is if there are more rows than max_rows so that the limit kicks in, how do we know we\u0027ve deleted the correct ones so that we don\u0027t get a FK constraint error when we delete the tasks table rows later using the query at line 1379?","commit_id":"5a99ec8b2dc894e3b0c2fe6421e645b25b482b2d"},{"author":{"_account_id":28948,"name":"Liang Fang","email":"liang.a.fang@intel.com","username":"liang"},"change_message_id":"6fa566ed17b82a8a3a021bebb8378b69a5dc9455","unresolved":false,"context_lines":[{"line_number":1330,"context_line":"    t \u003d Table(\"tasks\", metadata, autoload\u003dTrue)"},{"line_number":1331,"context_line":"    ti \u003d Table(\"task_info\", metadata, autoload\u003dTrue)"},{"line_number":1332,"context_line":"    joined_rec \u003d ti.join(t, t.c.id \u003d\u003d ti.c.task_id)"},{"line_number":1333,"context_line":"    deleted_task_info \u003d sql.select([ti.c.task_id],"},{"line_number":1334,"context_line":"                                   t.c.deleted_at \u003c deleted_age).\\"},{"line_number":1335,"context_line":"        select_from(joined_rec).limit(max_rows)"},{"line_number":1336,"context_line":"    delete_statement \u003d DeleteFromSelect(ti, deleted_task_info,"},{"line_number":1337,"context_line":"                                        ti.c.task_id)"},{"line_number":1338,"context_line":"    LOG.info(_LI(\u0027Purging deleted rows older than %(age_in_days)d day(s) \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_de8fce74","line":1335,"range":{"start_line":1333,"start_character":0,"end_line":1335,"end_character":47},"in_reply_to":"3f79a3b5_e53f9d81","updated":"2018-12-07 03:42:59.000000000","message":"good catch, thanks Rosmaita!\n\nI reproduce this:\nglance-manage db purge --age_in_days 2 --max_rows 1\n\nThe task deleted in task_info may be not the one try to delete in table tasks. \"order_by\" solved the issue.","commit_id":"5a99ec8b2dc894e3b0c2fe6421e645b25b482b2d"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"2b6d25ccb9e9c557a81bfea660bad5bed2860ec2","unresolved":false,"context_lines":[{"line_number":1337,"context_line":"                                        ti.c.task_id)"},{"line_number":1338,"context_line":"    LOG.info(_LI(\u0027Purging deleted rows older than %(age_in_days)d day(s) \u0027"},{"line_number":1339,"context_line":"                 \u0027from table %(tbl)s\u0027),"},{"line_number":1340,"context_line":"             {\u0027age_in_days\u0027: age_in_days, \u0027tbl\u0027: ti})"},{"line_number":1341,"context_line":"    try:"},{"line_number":1342,"context_line":"        with session.begin():"},{"line_number":1343,"context_line":"            result \u003d session.execute(delete_statement)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_d264a550","line":1340,"range":{"start_line":1340,"start_character":49,"end_line":1340,"end_character":51},"updated":"2018-12-07 00:07:30.000000000","message":"This is the table object.  You might want to use ti.name here.","commit_id":"5a99ec8b2dc894e3b0c2fe6421e645b25b482b2d"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"c2749b65ad93b876e47c212406fc537ec7469cc2","unresolved":false,"context_lines":[{"line_number":1337,"context_line":"                                        ti.c.task_id)"},{"line_number":1338,"context_line":"    LOG.info(_LI(\u0027Purging deleted rows older than %(age_in_days)d day(s) \u0027"},{"line_number":1339,"context_line":"                 \u0027from table %(tbl)s\u0027),"},{"line_number":1340,"context_line":"             {\u0027age_in_days\u0027: age_in_days, \u0027tbl\u0027: ti})"},{"line_number":1341,"context_line":"    try:"},{"line_number":1342,"context_line":"        with session.begin():"},{"line_number":1343,"context_line":"            result \u003d session.execute(delete_statement)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_fe688a89","line":1340,"range":{"start_line":1340,"start_character":49,"end_line":1340,"end_character":51},"in_reply_to":"3f79a3b5_9edab674","updated":"2018-12-07 03:53:46.000000000","message":"Great! thanks for checking","commit_id":"5a99ec8b2dc894e3b0c2fe6421e645b25b482b2d"},{"author":{"_account_id":28948,"name":"Liang Fang","email":"liang.a.fang@intel.com","username":"liang"},"change_message_id":"6fa566ed17b82a8a3a021bebb8378b69a5dc9455","unresolved":false,"context_lines":[{"line_number":1337,"context_line":"                                        ti.c.task_id)"},{"line_number":1338,"context_line":"    LOG.info(_LI(\u0027Purging deleted rows older than %(age_in_days)d day(s) \u0027"},{"line_number":1339,"context_line":"                 \u0027from table %(tbl)s\u0027),"},{"line_number":1340,"context_line":"             {\u0027age_in_days\u0027: age_in_days, \u0027tbl\u0027: ti})"},{"line_number":1341,"context_line":"    try:"},{"line_number":1342,"context_line":"        with session.begin():"},{"line_number":1343,"context_line":"            result \u003d session.execute(delete_statement)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_9edab674","line":1340,"range":{"start_line":1340,"start_character":49,"end_line":1340,"end_character":51},"in_reply_to":"3f79a3b5_d264a550","updated":"2018-12-07 03:42:59.000000000","message":"object will be formatted to string here. see:\n(Pdb) pp \"%s\"%ti\n\u0027task_info\u0027\n(Pdb) pp \"%s\"%t\n\u0027tasks\u0027\n\nalso some log:\n--------------\nINFO glance.db.sqlalchemy.api [None req-a75e88ba-a4fd-4e32-b054-4b8b2ae4f451 None None] Purging deleted rows older than 2 day(s) from table task_info\nINFO glance.db.sqlalchemy.api [None req-a75e88ba-a4fd-4e32-b054-4b8b2ae4f451 None None] Deleted 1 row(s) from table task_info\nINFO glance.db.sqlalchemy.api [None req-a75e88ba-a4fd-4e32-b054-4b8b2ae4f451 None None] Purging deleted rows older than 2 day(s) from table tasks\nINFO glance.db.sqlalchemy.api [None req-a75e88ba-a4fd-4e32-b054-4b8b2ae4f451 None None] Deleted 1 row(s) from table tasks","commit_id":"5a99ec8b2dc894e3b0c2fe6421e645b25b482b2d"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"2b6d25ccb9e9c557a81bfea660bad5bed2860ec2","unresolved":false,"context_lines":[{"line_number":1344,"context_line":"    except (db_exception.DBError, db_exception.DBReferenceError) as ex:"},{"line_number":1345,"context_line":"        LOG.exception(_LE(\u0027DBError detected when force purging \u0027"},{"line_number":1346,"context_line":"                          \u0027table\u003d%(table)s: %(error)s\u0027),"},{"line_number":1347,"context_line":"                      {\u0027table\u0027: ti, \u0027error\u0027: six.text_type(ex)})"},{"line_number":1348,"context_line":"        raise"},{"line_number":1349,"context_line":""},{"line_number":1350,"context_line":"    rows \u003d result.rowcount"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_b267a94f","line":1347,"range":{"start_line":1347,"start_character":32,"end_line":1347,"end_character":34},"updated":"2018-12-07 00:07:30.000000000","message":"ti.name ?","commit_id":"5a99ec8b2dc894e3b0c2fe6421e645b25b482b2d"},{"author":{"_account_id":28948,"name":"Liang Fang","email":"liang.a.fang@intel.com","username":"liang"},"change_message_id":"6fa566ed17b82a8a3a021bebb8378b69a5dc9455","unresolved":false,"context_lines":[{"line_number":1344,"context_line":"    except (db_exception.DBError, db_exception.DBReferenceError) as ex:"},{"line_number":1345,"context_line":"        LOG.exception(_LE(\u0027DBError detected when force purging \u0027"},{"line_number":1346,"context_line":"                          \u0027table\u003d%(table)s: %(error)s\u0027),"},{"line_number":1347,"context_line":"                      {\u0027table\u0027: ti, \u0027error\u0027: six.text_type(ex)})"},{"line_number":1348,"context_line":"        raise"},{"line_number":1349,"context_line":""},{"line_number":1350,"context_line":"    rows \u003d result.rowcount"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_1ec0e67e","line":1347,"range":{"start_line":1347,"start_character":32,"end_line":1347,"end_character":34},"in_reply_to":"3f79a3b5_b267a94f","updated":"2018-12-07 03:42:59.000000000","message":"same explanation as above","commit_id":"5a99ec8b2dc894e3b0c2fe6421e645b25b482b2d"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"2b6d25ccb9e9c557a81bfea660bad5bed2860ec2","unresolved":false,"context_lines":[{"line_number":1349,"context_line":""},{"line_number":1350,"context_line":"    rows \u003d result.rowcount"},{"line_number":1351,"context_line":"    LOG.info(_LI(\u0027Deleted %(rows)d row(s) from table %(tbl)s\u0027),"},{"line_number":1352,"context_line":"             {\u0027rows\u0027: rows, \u0027tbl\u0027: ti})"},{"line_number":1353,"context_line":""},{"line_number":1354,"context_line":"    # get rid of FK constraints"},{"line_number":1355,"context_line":"    for tbl in (\u0027images\u0027, \u0027tasks\u0027):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_92438d98","line":1352,"range":{"start_line":1352,"start_character":35,"end_line":1352,"end_character":38},"updated":"2018-12-07 00:07:30.000000000","message":"ti.name ?","commit_id":"5a99ec8b2dc894e3b0c2fe6421e645b25b482b2d"},{"author":{"_account_id":28948,"name":"Liang Fang","email":"liang.a.fang@intel.com","username":"liang"},"change_message_id":"6fa566ed17b82a8a3a021bebb8378b69a5dc9455","unresolved":false,"context_lines":[{"line_number":1349,"context_line":""},{"line_number":1350,"context_line":"    rows \u003d result.rowcount"},{"line_number":1351,"context_line":"    LOG.info(_LI(\u0027Deleted %(rows)d row(s) from table %(tbl)s\u0027),"},{"line_number":1352,"context_line":"             {\u0027rows\u0027: rows, \u0027tbl\u0027: ti})"},{"line_number":1353,"context_line":""},{"line_number":1354,"context_line":"    # get rid of FK constraints"},{"line_number":1355,"context_line":"    for tbl in (\u0027images\u0027, \u0027tasks\u0027):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_3ec5a28f","line":1352,"range":{"start_line":1352,"start_character":35,"end_line":1352,"end_character":38},"in_reply_to":"3f79a3b5_92438d98","updated":"2018-12-07 03:42:59.000000000","message":"same explanation as above","commit_id":"5a99ec8b2dc894e3b0c2fe6421e645b25b482b2d"}]}
