)]}'
{"ceilometer/storage/impl_sqlalchemy.py":[{"author":{"_account_id":5313,"name":"David Peraza","email":"david_peraza@persistentsys.com","username":"dperaza"},"change_message_id":"a3a044bf3aaa388869736df24d227d626edc0190","unresolved":false,"context_lines":[{"line_number":173,"context_line":"                # create a nested session for the case of two call of"},{"line_number":174,"context_line":"                # record_metering_data run in parallel to not fail the"},{"line_number":175,"context_line":"                # record of this sample"},{"line_number":176,"context_line":"                # (except for sqlite, that not support nested transaction"},{"line_number":177,"context_line":"                # and don\u0027t have concurrency problem)"},{"line_number":178,"context_line":"                nested \u003d session.connection().dialect.name !\u003d \u0027sqlite\u0027"},{"line_number":179,"context_line":"                subtransactions \u003d not nested"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F%2FzkI%3D","line":176,"updated":"2013-10-28 19:38:47.000000000","message":"\"that do not support\" or \"that don\u0027t support\"","commit_id":"e8d9f52dbdf239acc69b374e0ad3d1fdd1e13c06"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"6dea9717c96e2aabe455eb3ca2a8ee0e77b7afc0","unresolved":false,"context_lines":[{"line_number":173,"context_line":"                # create a nested session for the case of two call of"},{"line_number":174,"context_line":"                # record_metering_data run in parallel to not fail the"},{"line_number":175,"context_line":"                # record of this sample"},{"line_number":176,"context_line":"                # (except for sqlite, that not support nested transaction"},{"line_number":177,"context_line":"                # and don\u0027t have concurrency problem)"},{"line_number":178,"context_line":"                nested \u003d session.connection().dialect.name !\u003d \u0027sqlite\u0027"},{"line_number":179,"context_line":"                subtransactions \u003d not nested"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F%2FLxs%3D","line":176,"in_reply_to":"AAAATn%2F%2FzkI%3D","updated":"2013-11-13 08:44:01.000000000","message":"Done","commit_id":"e8d9f52dbdf239acc69b374e0ad3d1fdd1e13c06"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"20697fa8c2dcee39da5eab43c18f9bac3bbc0413","unresolved":false,"context_lines":[{"line_number":206,"context_line":"        # look for a object in database"},{"line_number":207,"context_line":"        obj \u003d session.query(model_class).get(str(_id))"},{"line_number":208,"context_line":"        if not obj:"},{"line_number":209,"context_line":"            # it doesn\u0027t exists, create it"},{"line_number":210,"context_line":"            try:"},{"line_number":211,"context_line":"                # create a nested session for the case of two call of"},{"line_number":212,"context_line":"                # record_metering_data run in parallel to not fail the"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F%2FHKY%3D","line":209,"updated":"2013-11-14 09:54:55.000000000","message":"I don\u0027t think that makes it concurrency safe as nothing guarantee that it won\u0027t be created during the line 207 and line 209.\nIt seems to me that it\u0027ll be better to go ahead and INSERT anyway and remove that .get() code on line 207","commit_id":"6144104b06414ab17da36a9b26d2d3982499d9e2"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"6390d0580543d73514bed5d6e2fef25195372147","unresolved":false,"context_lines":[{"line_number":206,"context_line":"        # look for a object in database"},{"line_number":207,"context_line":"        obj \u003d session.query(model_class).get(str(_id))"},{"line_number":208,"context_line":"        if not obj:"},{"line_number":209,"context_line":"            # it doesn\u0027t exists, create it"},{"line_number":210,"context_line":"            try:"},{"line_number":211,"context_line":"                # create a nested session for the case of two call of"},{"line_number":212,"context_line":"                # record_metering_data run in parallel to not fail the"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F%2FFVk%3D","line":209,"in_reply_to":"AAAATn%2F%2FFZI%3D","updated":"2013-11-14 16:18:37.000000000","message":"Done","commit_id":"6144104b06414ab17da36a9b26d2d3982499d9e2"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"1c51398ec251213c4316b85e0068cd34b79f6b31","unresolved":false,"context_lines":[{"line_number":206,"context_line":"        # look for a object in database"},{"line_number":207,"context_line":"        obj \u003d session.query(model_class).get(str(_id))"},{"line_number":208,"context_line":"        if not obj:"},{"line_number":209,"context_line":"            # it doesn\u0027t exists, create it"},{"line_number":210,"context_line":"            try:"},{"line_number":211,"context_line":"                # create a nested session for the case of two call of"},{"line_number":212,"context_line":"                # record_metering_data run in parallel to not fail the"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F%2FFZI%3D","line":209,"in_reply_to":"AAAATn%2F%2FFas%3D","updated":"2013-11-14 16:04:23.000000000","message":"I think so yes.","commit_id":"6144104b06414ab17da36a9b26d2d3982499d9e2"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"0c4eeb2e0247ce41b3896521c850f1f5f8a5c789","unresolved":false,"context_lines":[{"line_number":206,"context_line":"        # look for a object in database"},{"line_number":207,"context_line":"        obj \u003d session.query(model_class).get(str(_id))"},{"line_number":208,"context_line":"        if not obj:"},{"line_number":209,"context_line":"            # it doesn\u0027t exists, create it"},{"line_number":210,"context_line":"            try:"},{"line_number":211,"context_line":"                # create a nested session for the case of two call of"},{"line_number":212,"context_line":"                # record_metering_data run in parallel to not fail the"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F%2FFas%3D","line":209,"in_reply_to":"AAAATn%2F%2FG%2Bs%3D","updated":"2013-11-14 16:03:08.000000000","message":"The other reason is that sqlite doesn\u0027t support nested transaction and concurrent transaction. So I must check the presence of the obj for sqlite.\n\nDo you prefer I isolate the sqlite case ?","commit_id":"6144104b06414ab17da36a9b26d2d3982499d9e2"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"2fbac4471988345e591470a8c01395a2b295f700","unresolved":false,"context_lines":[{"line_number":206,"context_line":"        # look for a object in database"},{"line_number":207,"context_line":"        obj \u003d session.query(model_class).get(str(_id))"},{"line_number":208,"context_line":"        if not obj:"},{"line_number":209,"context_line":"            # it doesn\u0027t exists, create it"},{"line_number":210,"context_line":"            try:"},{"line_number":211,"context_line":"                # create a nested session for the case of two call of"},{"line_number":212,"context_line":"                # record_metering_data run in parallel to not fail the"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F%2FG%2Bs%3D","line":209,"in_reply_to":"AAAATn%2F%2FHAo%3D","updated":"2013-11-14 10:33:18.000000000","message":"Can I say I prefer correct?\nIf something like the TTL expirer runs, this is going to break.","commit_id":"6144104b06414ab17da36a9b26d2d3982499d9e2"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"73f121d6b1e1f0a5b5728cedcc43820d0af798b1","unresolved":false,"context_lines":[{"line_number":206,"context_line":"        # look for a object in database"},{"line_number":207,"context_line":"        obj \u003d session.query(model_class).get(str(_id))"},{"line_number":208,"context_line":"        if not obj:"},{"line_number":209,"context_line":"            # it doesn\u0027t exists, create it"},{"line_number":210,"context_line":"            try:"},{"line_number":211,"context_line":"                # create a nested session for the case of two call of"},{"line_number":212,"context_line":"                # record_metering_data run in parallel to not fail the"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F%2FHAo%3D","line":209,"in_reply_to":"AAAATn%2F%2FHKY%3D","updated":"2013-11-14 10:27:59.000000000","message":"Yes only the line 222 guarantee the safe concurrency. But I have done this because most of the time  the \u0027User\u0027 and the \u0027Project\u0027 already exists.","commit_id":"6144104b06414ab17da36a9b26d2d3982499d9e2"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"f4c882e030e8c4595f9c33be0f85f4acd6fe894c","unresolved":false,"context_lines":[{"line_number":213,"context_line":""},{"line_number":214,"context_line":"            # raise dbexc.DBDuplicateEntry manually for sqlite"},{"line_number":215,"context_line":"            # to not break the current session"},{"line_number":216,"context_line":"            if not nested and session.query(model_class).get(str(_id)):"},{"line_number":217,"context_line":"                raise dbexc.DBDuplicateEntry()"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"            with session.begin(nested\u003dnested,"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAATn%2F%2FFQY%3D","line":216,"updated":"2013-11-14 16:33:35.000000000","message":"That\u0027ll end up doing a double get on sqlite.\n\nyou can just write:\n\nif session.connection().dialect.name \u003d\u003d \u0027sqlite\u0027:\n  obj \u003d session.query(model_class).get(str(_id))\nelse:\n   with session.begin(…):\n      […]","commit_id":"dd62f9ce0d8d5abac0fb34b0520515b6c4566c1f"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"aae1dd27ff70db531db1f10961419c88928d6b88","unresolved":false,"context_lines":[{"line_number":213,"context_line":""},{"line_number":214,"context_line":"            # raise dbexc.DBDuplicateEntry manually for sqlite"},{"line_number":215,"context_line":"            # to not break the current session"},{"line_number":216,"context_line":"            if not nested and session.query(model_class).get(str(_id)):"},{"line_number":217,"context_line":"                raise dbexc.DBDuplicateEntry()"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"            with session.begin(nested\u003dnested,"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAATn%2F%2FCkg%3D","line":216,"in_reply_to":"AAAATn%2F%2FC80%3D","updated":"2013-11-15 09:44:24.000000000","message":"Fair enough.","commit_id":"dd62f9ce0d8d5abac0fb34b0520515b6c4566c1f"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"63a0a3962ada7839918840916051af0b895f1d03","unresolved":false,"context_lines":[{"line_number":213,"context_line":""},{"line_number":214,"context_line":"            # raise dbexc.DBDuplicateEntry manually for sqlite"},{"line_number":215,"context_line":"            # to not break the current session"},{"line_number":216,"context_line":"            if not nested and session.query(model_class).get(str(_id)):"},{"line_number":217,"context_line":"                raise dbexc.DBDuplicateEntry()"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"            with session.begin(nested\u003dnested,"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAATn%2F%2FC80%3D","line":216,"in_reply_to":"AAAATn%2F%2FFP8%3D","updated":"2013-11-15 07:53:59.000000000","message":"Because sqlite is used only for unitest, I have willingly don\u0027t reuse the already existing query result, to share a maximum code path between sqlite and other backend.","commit_id":"dd62f9ce0d8d5abac0fb34b0520515b6c4566c1f"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"4296c97031f97b70501cfc24f99a3a41bdb78d8a","unresolved":false,"context_lines":[{"line_number":213,"context_line":""},{"line_number":214,"context_line":"            # raise dbexc.DBDuplicateEntry manually for sqlite"},{"line_number":215,"context_line":"            # to not break the current session"},{"line_number":216,"context_line":"            if not nested and session.query(model_class).get(str(_id)):"},{"line_number":217,"context_line":"                raise dbexc.DBDuplicateEntry()"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"            with session.begin(nested\u003dnested,"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAATn%2F%2FFP8%3D","line":216,"in_reply_to":"AAAATn%2F%2FFQY%3D","updated":"2013-11-14 16:34:54.000000000","message":"Forgot my code it\u0027s wrong, I forgot the add case. :) But I think the idea is still worth it?\n\nMaybe check that obj is None in the exception handling?","commit_id":"dd62f9ce0d8d5abac0fb34b0520515b6c4566c1f"}]}
