)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"30ff7649159d1e35efa14e42d3647295de405073","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Make entities (Resource, User, Project) able to store lists"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When one Resource contains several meters we should store all of them."},{"line_number":10,"context_line":"The same is truth about User, Project and Resource regarding sources."},{"line_number":11,"context_line":"To make it possible it is needed to change the way we store data in Hbase."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Now Resource, User and Project may contain several sources. Besides, Resource may contain several meters."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"AAAAWH%2F9Vs0%3D","line":10,"updated":"2014-04-06 15:07:47.000000000","message":"s/truth/true/","commit_id":"50585b234843aadbaa2039aded81236f89cf6339"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"3c7ce0b3f868c2811917837f971148429e4f90a0","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Make entities (Resource, User, Project) able to store lists"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When one Resource contains several meters we should store all of them."},{"line_number":10,"context_line":"The same is truth about User, Project and Resource regarding sources."},{"line_number":11,"context_line":"To make it possible it is needed to change the way we store data in Hbase."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Now Resource, User and Project may contain several sources. Besides, Resource may contain several meters."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"AAAAW3%2F%2Fxho%3D","line":10,"in_reply_to":"AAAAWH%2F9Vs0%3D","updated":"2014-04-10 13:57:02.000000000","message":"Done","commit_id":"50585b234843aadbaa2039aded81236f89cf6339"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"30ff7649159d1e35efa14e42d3647295de405073","unresolved":false,"context_lines":[{"line_number":23,"context_line":"In this commit new ColumnFamily \u0027m\u0027 and \u0027s\u0027 are introduced."},{"line_number":24,"context_line":"To update entries in these column families we may use safe put() method."},{"line_number":25,"context_line":"All meters in Resource and sources in User, Project, Resource are"},{"line_number":26,"context_line":"stored as columns with stub value\u003d1 to make filtering simplier."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Closes bug 1288284"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"AAAAWH%2F9Vsw%3D","line":26,"updated":"2014-04-06 15:07:47.000000000","message":"s/simplier/simpler/","commit_id":"50585b234843aadbaa2039aded81236f89cf6339"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"3c7ce0b3f868c2811917837f971148429e4f90a0","unresolved":false,"context_lines":[{"line_number":23,"context_line":"In this commit new ColumnFamily \u0027m\u0027 and \u0027s\u0027 are introduced."},{"line_number":24,"context_line":"To update entries in these column families we may use safe put() method."},{"line_number":25,"context_line":"All meters in Resource and sources in User, Project, Resource are"},{"line_number":26,"context_line":"stored as columns with stub value\u003d1 to make filtering simplier."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Closes bug 1288284"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"AAAAW3%2F%2Fxhg%3D","line":26,"in_reply_to":"AAAAWH%2F9Vsw%3D","updated":"2014-04-10 13:57:02.000000000","message":"Done","commit_id":"50585b234843aadbaa2039aded81236f89cf6339"}],"ceilometer/storage/impl_hbase.py":[{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"34dd8d338787d43a60ee73802cb59f83068ca9e0","unresolved":false,"context_lines":[{"line_number":281,"context_line":"        flatten_result, sources, meters, metadata \u003d \\"},{"line_number":282,"context_line":"            deserialize_entry(resource_table.row(data[\u0027resource_id\u0027]))"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"        # Update if resource has new information. If resource is new then all"},{"line_number":285,"context_line":"        # of the ifs will be True. Here there is an assumption that resource"},{"line_number":286,"context_line":"        # may not change user_id or project_id and may have only one source"},{"line_number":287,"context_line":"        if (data[\u0027source\u0027] not in sources) or (new_meter not in meters) or ("}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVn%2F%2FiA8%3D","line":284,"updated":"2014-03-05 15:50:51.000000000","message":"s/resource/meter/","commit_id":"5e837a8c57f5b424fb01d7a807266f6996754e3d"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"2778f6b6489fa000458cab68dc1510b48b51e46f","unresolved":false,"context_lines":[{"line_number":281,"context_line":"        flatten_result, sources, meters, metadata \u003d \\"},{"line_number":282,"context_line":"            deserialize_entry(resource_table.row(data[\u0027resource_id\u0027]))"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"        # Update if resource has new information. If resource is new then all"},{"line_number":285,"context_line":"        # of the ifs will be True. Here there is an assumption that resource"},{"line_number":286,"context_line":"        # may not change user_id or project_id and may have only one source"},{"line_number":287,"context_line":"        if (data[\u0027source\u0027] not in sources) or (new_meter not in meters) or ("}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVn%2F%2FZS4%3D","line":284,"in_reply_to":"AAAAVn%2F%2FZ3k%3D","updated":"2014-03-06 11:23:20.000000000","message":"Ok, thanks for clarification, I was concentrating on the \u0027if\u0027s part and from that PoV \u0027meter\u0027 was logical to me.","commit_id":"5e837a8c57f5b424fb01d7a807266f6996754e3d"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"7c042ba34d6d48d6d668a05e175973c48964280a","unresolved":false,"context_lines":[{"line_number":281,"context_line":"        flatten_result, sources, meters, metadata \u003d \\"},{"line_number":282,"context_line":"            deserialize_entry(resource_table.row(data[\u0027resource_id\u0027]))"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"        # Update if resource has new information. If resource is new then all"},{"line_number":285,"context_line":"        # of the ifs will be True. Here there is an assumption that resource"},{"line_number":286,"context_line":"        # may not change user_id or project_id and may have only one source"},{"line_number":287,"context_line":"        if (data[\u0027source\u0027] not in sources) or (new_meter not in meters) or ("}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVn%2F%2FZ3k%3D","line":284,"in_reply_to":"AAAAVn%2F%2FiA8%3D","updated":"2014-03-06 10:10:57.000000000","message":"No, comment is related to resource. We get sample here (data is actually Sample) and if Sample refers to new Resource we add it to db or update in db (if it\u0027s metadata was changed or new meter appeared)","commit_id":"5e837a8c57f5b424fb01d7a807266f6996754e3d"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"34dd8d338787d43a60ee73802cb59f83068ca9e0","unresolved":false,"context_lines":[{"line_number":284,"context_line":"        # Update if resource has new information. If resource is new then all"},{"line_number":285,"context_line":"        # of the ifs will be True. Here there is an assumption that resource"},{"line_number":286,"context_line":"        # may not change user_id or project_id and may have only one source"},{"line_number":287,"context_line":"        if (data[\u0027source\u0027] not in sources) or (new_meter not in meters) or ("},{"line_number":288,"context_line":"                metadata !\u003d resource_metadata):"},{"line_number":289,"context_line":"            if new_meter not in meters:"},{"line_number":290,"context_line":"                meters.append(new_meter)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVn%2F%2Fh%2BI%3D","line":287,"updated":"2014-03-05 15:50:51.000000000","message":"Why do we need the (data[\u0027source\u0027] not in sources) check, if we assume that there is only one source and it will not change?","commit_id":"5e837a8c57f5b424fb01d7a807266f6996754e3d"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"7c042ba34d6d48d6d668a05e175973c48964280a","unresolved":false,"context_lines":[{"line_number":284,"context_line":"        # Update if resource has new information. If resource is new then all"},{"line_number":285,"context_line":"        # of the ifs will be True. Here there is an assumption that resource"},{"line_number":286,"context_line":"        # may not change user_id or project_id and may have only one source"},{"line_number":287,"context_line":"        if (data[\u0027source\u0027] not in sources) or (new_meter not in meters) or ("},{"line_number":288,"context_line":"                metadata !\u003d resource_metadata):"},{"line_number":289,"context_line":"            if new_meter not in meters:"},{"line_number":290,"context_line":"                meters.append(new_meter)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVn%2F%2FZ2c%3D","line":287,"in_reply_to":"AAAAVn%2F%2Fh%2BI%3D","updated":"2014-03-06 10:10:57.000000000","message":"Yep, I will remove it. The only thing I\u0027m afraid of is that this assumption is not validated anywhere. Anyway, I will investigate this issue further. Will be a separate cr if needed.","commit_id":"5e837a8c57f5b424fb01d7a807266f6996754e3d"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"f6a93445a4b5f7b6ee4e07e0fd12edf020749630","unresolved":false,"context_lines":[{"line_number":287,"context_line":"        if (data[\u0027source\u0027] not in sources) or (new_meter not in meters) or ("},{"line_number":288,"context_line":"                metadata !\u003d resource_metadata):"},{"line_number":289,"context_line":"            if new_meter not in meters:"},{"line_number":290,"context_line":"                meters.append(new_meter)"},{"line_number":291,"context_line":"            resource_table.put(data[\u0027resource_id\u0027],"},{"line_number":292,"context_line":"                               serialize_entry("},{"line_number":293,"context_line":"                                   **{\u0027sources\u0027: [data[\u0027source\u0027]],"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVn%2F%2FhuA%3D","line":290,"updated":"2014-03-05 15:52:45.000000000","message":"this seems like there\u0027s a race condition here","commit_id":"5e837a8c57f5b424fb01d7a807266f6996754e3d"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"7c042ba34d6d48d6d668a05e175973c48964280a","unresolved":false,"context_lines":[{"line_number":287,"context_line":"        if (data[\u0027source\u0027] not in sources) or (new_meter not in meters) or ("},{"line_number":288,"context_line":"                metadata !\u003d resource_metadata):"},{"line_number":289,"context_line":"            if new_meter not in meters:"},{"line_number":290,"context_line":"                meters.append(new_meter)"},{"line_number":291,"context_line":"            resource_table.put(data[\u0027resource_id\u0027],"},{"line_number":292,"context_line":"                               serialize_entry("},{"line_number":293,"context_line":"                                   **{\u0027sources\u0027: [data[\u0027source\u0027]],"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVn%2F%2FZzc%3D","line":290,"in_reply_to":"AAAAVn%2F%2FhuA%3D","updated":"2014-03-06 10:10:57.000000000","message":"Done","commit_id":"5e837a8c57f5b424fb01d7a807266f6996754e3d"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"34dd8d338787d43a60ee73802cb59f83068ca9e0","unresolved":false,"context_lines":[{"line_number":423,"context_line":""},{"line_number":424,"context_line":"        gen \u003d resource_table.scan(filter\u003dq)"},{"line_number":425,"context_line":""},{"line_number":426,"context_line":"        for ignored, data in gen:"},{"line_number":427,"context_line":"            flatten_result, s, m, md \u003d deserialize_entry(data)"},{"line_number":428,"context_line":"            if not m:"},{"line_number":429,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVn%2F%2Fh5M%3D","line":426,"updated":"2014-03-05 15:50:51.000000000","message":"You could use \u0027_\u0027 instead of \u0027ignored\u0027, it is a common way of marking unused items.","commit_id":"5e837a8c57f5b424fb01d7a807266f6996754e3d"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"2778f6b6489fa000458cab68dc1510b48b51e46f","unresolved":false,"context_lines":[{"line_number":423,"context_line":""},{"line_number":424,"context_line":"        gen \u003d resource_table.scan(filter\u003dq)"},{"line_number":425,"context_line":""},{"line_number":426,"context_line":"        for ignored, data in gen:"},{"line_number":427,"context_line":"            flatten_result, s, m, md \u003d deserialize_entry(data)"},{"line_number":428,"context_line":"            if not m:"},{"line_number":429,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVn%2F%2FZTg%3D","line":426,"in_reply_to":"AAAAVn%2F%2FZyU%3D","updated":"2014-03-06 11:23:20.000000000","message":"Yes, you\u0027re right, I wanted to write \u0027__\u0027, but it\u0027s not a major issue anyway, it was just a suggestion. Thanks for the quick reply.","commit_id":"5e837a8c57f5b424fb01d7a807266f6996754e3d"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"7c042ba34d6d48d6d668a05e175973c48964280a","unresolved":false,"context_lines":[{"line_number":423,"context_line":""},{"line_number":424,"context_line":"        gen \u003d resource_table.scan(filter\u003dq)"},{"line_number":425,"context_line":""},{"line_number":426,"context_line":"        for ignored, data in gen:"},{"line_number":427,"context_line":"            flatten_result, s, m, md \u003d deserialize_entry(data)"},{"line_number":428,"context_line":"            if not m:"},{"line_number":429,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVn%2F%2FZyU%3D","line":426,"in_reply_to":"AAAAVn%2F%2Fh5M%3D","updated":"2014-03-06 10:10:57.000000000","message":"I cannot because _ is occupied by translations. But I don\u0027t understand why I can use _ in _update_sources...","commit_id":"5e837a8c57f5b424fb01d7a807266f6996754e3d"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"34dd8d338787d43a60ee73802cb59f83068ca9e0","unresolved":false,"context_lines":[{"line_number":424,"context_line":"        gen \u003d resource_table.scan(filter\u003dq)"},{"line_number":425,"context_line":""},{"line_number":426,"context_line":"        for ignored, data in gen:"},{"line_number":427,"context_line":"            flatten_result, s, m, md \u003d deserialize_entry(data)"},{"line_number":428,"context_line":"            if not m:"},{"line_number":429,"context_line":"                continue"},{"line_number":430,"context_line":"            # Resource table may have several \"meter\" and one \"source\""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVn%2F%2Fh3k%3D","line":427,"updated":"2014-03-05 15:50:51.000000000","message":"It would be good to change the \u0027s\u0027 to \u0027sources\u0027 and \u0027m\u0027 to \u0027meters\u0027, as it is more readable. It would be also good to change \u0027md\u0027 to \u0027_\u0027, like above, as it seems to be an unused variable.","commit_id":"5e837a8c57f5b424fb01d7a807266f6996754e3d"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"2778f6b6489fa000458cab68dc1510b48b51e46f","unresolved":false,"context_lines":[{"line_number":424,"context_line":"        gen \u003d resource_table.scan(filter\u003dq)"},{"line_number":425,"context_line":""},{"line_number":426,"context_line":"        for ignored, data in gen:"},{"line_number":427,"context_line":"            flatten_result, s, m, md \u003d deserialize_entry(data)"},{"line_number":428,"context_line":"            if not m:"},{"line_number":429,"context_line":"                continue"},{"line_number":430,"context_line":"            # Resource table may have several \"meter\" and one \"source\""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVn%2F%2FZTM%3D","line":427,"in_reply_to":"AAAAVn%2F%2FZxo%3D","updated":"2014-03-06 11:23:20.000000000","message":"Same as above.","commit_id":"5e837a8c57f5b424fb01d7a807266f6996754e3d"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"7c042ba34d6d48d6d668a05e175973c48964280a","unresolved":false,"context_lines":[{"line_number":424,"context_line":"        gen \u003d resource_table.scan(filter\u003dq)"},{"line_number":425,"context_line":""},{"line_number":426,"context_line":"        for ignored, data in gen:"},{"line_number":427,"context_line":"            flatten_result, s, m, md \u003d deserialize_entry(data)"},{"line_number":428,"context_line":"            if not m:"},{"line_number":429,"context_line":"                continue"},{"line_number":430,"context_line":"            # Resource table may have several \"meter\" and one \"source\""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVn%2F%2FZxo%3D","line":427,"in_reply_to":"AAAAVn%2F%2Fh3k%3D","updated":"2014-03-06 10:10:57.000000000","message":"Almost done except _","commit_id":"5e837a8c57f5b424fb01d7a807266f6996754e3d"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"7dede10ff27e270d10edb22310575563bc7b2315","unresolved":false,"context_lines":[{"line_number":282,"context_line":"            deserialize_entry(resource_table.row(data[\u0027resource_id\u0027]))"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"        # Update if resource has new information. If resource is new then all"},{"line_number":285,"context_line":"        # of the ifs will be True. Here there is an assumption that resource"},{"line_number":286,"context_line":"        # may not change user_id or project_id and may have only one source"},{"line_number":287,"context_line":"        if (new_meter not in meters) or (metadata !\u003d resource_metadata):"},{"line_number":288,"context_line":"            new_meters \u003d copy.copy(meters)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAVn%2F%2FZko%3D","line":285,"updated":"2014-03-06 10:40:30.000000000","message":"s/ifs/conditions/","commit_id":"95ca340b6953a4188578a6a7273b7485bda596b2"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"32c29e44bb91a0d3c2d555506fca59426f3f79de","unresolved":false,"context_lines":[{"line_number":282,"context_line":"            deserialize_entry(resource_table.row(data[\u0027resource_id\u0027]))"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"        # Update if resource has new information. If resource is new then all"},{"line_number":285,"context_line":"        # of the ifs will be True. Here there is an assumption that resource"},{"line_number":286,"context_line":"        # may not change user_id or project_id and may have only one source"},{"line_number":287,"context_line":"        if (new_meter not in meters) or (metadata !\u003d resource_metadata):"},{"line_number":288,"context_line":"            new_meters \u003d copy.copy(meters)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAVn%2F%2FZcE%3D","line":285,"in_reply_to":"AAAAVn%2F%2FZe4%3D","updated":"2014-03-06 11:01:00.000000000","message":"Yes, it would have been my next suggestion, after your answer on my previous one in this sentence. :) Now it looks good.","commit_id":"95ca340b6953a4188578a6a7273b7485bda596b2"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"2da7af3a2070bc7900c6af2c77ed1156d0d7c3c2","unresolved":false,"context_lines":[{"line_number":282,"context_line":"            deserialize_entry(resource_table.row(data[\u0027resource_id\u0027]))"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"        # Update if resource has new information. If resource is new then all"},{"line_number":285,"context_line":"        # of the ifs will be True. Here there is an assumption that resource"},{"line_number":286,"context_line":"        # may not change user_id or project_id and may have only one source"},{"line_number":287,"context_line":"        if (new_meter not in meters) or (metadata !\u003d resource_metadata):"},{"line_number":288,"context_line":"            new_meters \u003d copy.copy(meters)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAVn%2F%2FZe4%3D","line":285,"in_reply_to":"AAAAVn%2F%2FZko%3D","updated":"2014-03-06 10:54:16.000000000","message":"Done","commit_id":"95ca340b6953a4188578a6a7273b7485bda596b2"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"00fc992e66288a9e69cbf0c483ed5c4caf22b600","unresolved":false,"context_lines":[{"line_number":288,"context_line":"        if (new_meter not in meters) or (metadata !\u003d resource_metadata):"},{"line_number":289,"context_line":"            new_meters \u003d copy.copy(meters)"},{"line_number":290,"context_line":"            if new_meter not in meters:"},{"line_number":291,"context_line":"                new_meters.append(new_meter)"},{"line_number":292,"context_line":"            resource_table.put(data[\u0027resource_id\u0027],"},{"line_number":293,"context_line":"                               serialize_entry("},{"line_number":294,"context_line":"                                   **{\u0027sources\u0027: [data[\u0027source\u0027]],"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAVn%2F%2FXwU%3D","line":291,"updated":"2014-03-06 15:22:43.000000000","message":"i can\u0027t shake the feeling that this will break during high load.\n\nie. if two records come in, they both grab row from resource table. they will both have their own copy of meters list and add new_meters to their own copy but when we get to put statement, only one of the meter lists will persist, meaning we\u0027ll lose the new_meter in the other list.\n\nsee suggestion below.","commit_id":"ce46fd4ec3f29b90eb05f99e4948122de5945a3c"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"de56067ce47ab86073000206ec79634079f6d80a","unresolved":false,"context_lines":[{"line_number":288,"context_line":"        if (new_meter not in meters) or (metadata !\u003d resource_metadata):"},{"line_number":289,"context_line":"            new_meters \u003d copy.copy(meters)"},{"line_number":290,"context_line":"            if new_meter not in meters:"},{"line_number":291,"context_line":"                new_meters.append(new_meter)"},{"line_number":292,"context_line":"            resource_table.put(data[\u0027resource_id\u0027],"},{"line_number":293,"context_line":"                               serialize_entry("},{"line_number":294,"context_line":"                                   **{\u0027sources\u0027: [data[\u0027source\u0027]],"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAWH%2F%2BxFU%3D","line":291,"in_reply_to":"AAAAVn%2F%2FN1M%3D","updated":"2014-03-24 14:26:24.000000000","message":"Gordon, we\u0027ve investigated an HBase\u0027s ability to work in multi-process(thread) environment. And the result that it doesn\u0027t work :( And the problem is not in this code but in the Thrift that is used by happybase library. So I propose to keep this fix and create a new one \"make HBase able to work in  multi-process(thread) environment\". This fix is needed to make one-thread scenario work correct. And looks like I need to add a document about HBase limitations. What do you think about it?","commit_id":"ce46fd4ec3f29b90eb05f99e4948122de5945a3c"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"0c0e7b8f59bc9ea91434d4ae19a1b0703f479685","unresolved":false,"context_lines":[{"line_number":288,"context_line":"        if (new_meter not in meters) or (metadata !\u003d resource_metadata):"},{"line_number":289,"context_line":"            new_meters \u003d copy.copy(meters)"},{"line_number":290,"context_line":"            if new_meter not in meters:"},{"line_number":291,"context_line":"                new_meters.append(new_meter)"},{"line_number":292,"context_line":"            resource_table.put(data[\u0027resource_id\u0027],"},{"line_number":293,"context_line":"                               serialize_entry("},{"line_number":294,"context_line":"                                   **{\u0027sources\u0027: [data[\u0027source\u0027]],"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAVn%2F%2FN1M%3D","line":291,"in_reply_to":"AAAAVn%2F%2FN34%3D","updated":"2014-03-07 15:19:33.000000000","message":"cool. i don\u0027t know if problem exists in other backends... we use addToSet in mongo so i assume that handles any conflicts (removing duplicates and what not)\n\nin sql, we don\u0027t store meter in Resource... we query meter table and then query resource table as i described below (so maybe not a good solution for hbase)","commit_id":"ce46fd4ec3f29b90eb05f99e4948122de5945a3c"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"15f47913eca93905deb00c5981d45ec10ad7d042","unresolved":false,"context_lines":[{"line_number":288,"context_line":"        if (new_meter not in meters) or (metadata !\u003d resource_metadata):"},{"line_number":289,"context_line":"            new_meters \u003d copy.copy(meters)"},{"line_number":290,"context_line":"            if new_meter not in meters:"},{"line_number":291,"context_line":"                new_meters.append(new_meter)"},{"line_number":292,"context_line":"            resource_table.put(data[\u0027resource_id\u0027],"},{"line_number":293,"context_line":"                               serialize_entry("},{"line_number":294,"context_line":"                                   **{\u0027sources\u0027: [data[\u0027source\u0027]],"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAVn%2F%2FN34%3D","line":291,"in_reply_to":"AAAAVn%2F%2FP4Y%3D","updated":"2014-03-07 15:15:03.000000000","message":"Gordon, I\u0027ve understood the case I guess. It may happen even in different processes, not threads. And I suspect that we\u0027ve already faced with the issue. Not sure that the fix should be as a part of this fix... I will keep you posted","commit_id":"ce46fd4ec3f29b90eb05f99e4948122de5945a3c"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"f2cbae4dc995b5e76189e50320d6a64156dbe1d7","unresolved":false,"context_lines":[{"line_number":288,"context_line":"        if (new_meter not in meters) or (metadata !\u003d resource_metadata):"},{"line_number":289,"context_line":"            new_meters \u003d copy.copy(meters)"},{"line_number":290,"context_line":"            if new_meter not in meters:"},{"line_number":291,"context_line":"                new_meters.append(new_meter)"},{"line_number":292,"context_line":"            resource_table.put(data[\u0027resource_id\u0027],"},{"line_number":293,"context_line":"                               serialize_entry("},{"line_number":294,"context_line":"                                   **{\u0027sources\u0027: [data[\u0027source\u0027]],"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAVn%2F%2FP4Y%3D","line":291,"in_reply_to":"AAAAVn%2F%2FXwU%3D","updated":"2014-03-07 09:39:13.000000000","message":"This situation may take place when \"get\" happens during \"put\".  Besides, I cannot imagine situation when we put entries simultaneously. record_metering_data may be called in different threads? The code as it is cannot be shared across the threads, I absolutely agree. The \"update\" transaction should be finished in one thread. In all other backends we don\u0027t have this problem?","commit_id":"ce46fd4ec3f29b90eb05f99e4948122de5945a3c"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"f96942c96755016fddefa20b5f44c95e5ba26089","unresolved":false,"context_lines":[{"line_number":288,"context_line":"        if (new_meter not in meters) or (metadata !\u003d resource_metadata):"},{"line_number":289,"context_line":"            new_meters \u003d copy.copy(meters)"},{"line_number":290,"context_line":"            if new_meter not in meters:"},{"line_number":291,"context_line":"                new_meters.append(new_meter)"},{"line_number":292,"context_line":"            resource_table.put(data[\u0027resource_id\u0027],"},{"line_number":293,"context_line":"                               serialize_entry("},{"line_number":294,"context_line":"                                   **{\u0027sources\u0027: [data[\u0027source\u0027]],"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAWH%2F%2Bo7k%3D","line":291,"in_reply_to":"AAAAWH%2F%2BwAM%3D","updated":"2014-03-25 11:18:17.000000000","message":"Yes, the second will fail :( We are working on this, hope will find a solution soon","commit_id":"ce46fd4ec3f29b90eb05f99e4948122de5945a3c"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"1df0a0486966f6f5345b9025e0ac5ff0e515cbd3","unresolved":false,"context_lines":[{"line_number":288,"context_line":"        if (new_meter not in meters) or (metadata !\u003d resource_metadata):"},{"line_number":289,"context_line":"            new_meters \u003d copy.copy(meters)"},{"line_number":290,"context_line":"            if new_meter not in meters:"},{"line_number":291,"context_line":"                new_meters.append(new_meter)"},{"line_number":292,"context_line":"            resource_table.put(data[\u0027resource_id\u0027],"},{"line_number":293,"context_line":"                               serialize_entry("},{"line_number":294,"context_line":"                                   **{\u0027sources\u0027: [data[\u0027source\u0027]],"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAWH%2F%2BwAM%3D","line":291,"in_reply_to":"AAAAWH%2F%2BxFU%3D","updated":"2014-03-24 16:27:28.000000000","message":"so if we have two collectors, the second one will fail?\n\ni guess if it\u0027s not possible to ever have two threads this is ok... please add a TODO to make sure this logic doesn\u0027t really work in multiple collector/thread case.","commit_id":"ce46fd4ec3f29b90eb05f99e4948122de5945a3c"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"00fc992e66288a9e69cbf0c483ed5c4caf22b600","unresolved":false,"context_lines":[{"line_number":422,"context_line":"                       resource_id\u003dresource, source\u003dsource)"},{"line_number":423,"context_line":"        LOG.debug(_(\"Query Resource table: %s\") % q)"},{"line_number":424,"context_line":""},{"line_number":425,"context_line":"        gen \u003d resource_table.scan(filter\u003dq)"},{"line_number":426,"context_line":""},{"line_number":427,"context_line":"        for ignored, data in gen:"},{"line_number":428,"context_line":"            flatten_result, sources, meters, md \u003d deserialize_entry(data)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAVn%2F%2FXvc%3D","line":425,"updated":"2014-03-06 15:22:43.000000000","message":"does it make more sense to scan meter_table here, and then do another scan of resource_table for project_id, user_id, source?","commit_id":"ce46fd4ec3f29b90eb05f99e4948122de5945a3c"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"f2cbae4dc995b5e76189e50320d6a64156dbe1d7","unresolved":false,"context_lines":[{"line_number":422,"context_line":"                       resource_id\u003dresource, source\u003dsource)"},{"line_number":423,"context_line":"        LOG.debug(_(\"Query Resource table: %s\") % q)"},{"line_number":424,"context_line":""},{"line_number":425,"context_line":"        gen \u003d resource_table.scan(filter\u003dq)"},{"line_number":426,"context_line":""},{"line_number":427,"context_line":"        for ignored, data in gen:"},{"line_number":428,"context_line":"            flatten_result, sources, meters, md \u003d deserialize_entry(data)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAVn%2F%2FPyY%3D","line":425,"in_reply_to":"AAAAVn%2F%2FXvc%3D","updated":"2014-03-07 09:39:13.000000000","message":"It is definitely out of the patch\u0027s scope. I like how it done here. We scan only resources. Is is much more faster then scanning all samples in meter table.","commit_id":"ce46fd4ec3f29b90eb05f99e4948122de5945a3c"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"e868847ecb5580201fa0637a46effda6261dfa6f","unresolved":false,"context_lines":[{"line_number":272,"context_line":"        alarm_history_table.put(alarm_change.get(\u0027alarm_id\u0027) + \"_\" + str(rts),"},{"line_number":273,"context_line":"                                alarm_change_dict)"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"    # TODO(nprivalova): this method works ok only in single-thread environment."},{"line_number":276,"context_line":"    def record_metering_data(self, data):"},{"line_number":277,"context_line":"        \"\"\"Write the data to the backend storage system."},{"line_number":278,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F%2BWGA%3D","line":275,"updated":"2014-03-27 13:51:59.000000000","message":"Scary comment! ;)\n\nBut the outcome of an interleaved update (i.e. not the most recent metadata being stored against the resource) should be resolved once the next in-order sample for this resource is ingested, right?\n\nSo not that scary after all?","commit_id":"fd3e467a5babcbabdd20b6a747a0bbc90cffae4f"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"b0f1dd415c9cf0f6dd7f822857c1902db7ec474b","unresolved":false,"context_lines":[{"line_number":272,"context_line":"        alarm_history_table.put(alarm_change.get(\u0027alarm_id\u0027) + \"_\" + str(rts),"},{"line_number":273,"context_line":"                                alarm_change_dict)"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"    # TODO(nprivalova): this method works ok only in single-thread environment."},{"line_number":276,"context_line":"    def record_metering_data(self, data):"},{"line_number":277,"context_line":"        \"\"\"Write the data to the backend storage system."},{"line_number":278,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F%2BL3U%3D","line":275,"in_reply_to":"AAAAWH%2F%2BL7s%3D","updated":"2014-03-28 15:10:15.000000000","message":"Yep, but the main change is pool-usage. Still need to think more about consistency... But anyway these problems are outside of this patch I guess. What do you think?","commit_id":"fd3e467a5babcbabdd20b6a747a0bbc90cffae4f"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"ad7a7986c4265e9d1335e97fbd3a89e60a64b482","unresolved":false,"context_lines":[{"line_number":272,"context_line":"        alarm_history_table.put(alarm_change.get(\u0027alarm_id\u0027) + \"_\" + str(rts),"},{"line_number":273,"context_line":"                                alarm_change_dict)"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"    # TODO(nprivalova): this method works ok only in single-thread environment."},{"line_number":276,"context_line":"    def record_metering_data(self, data):"},{"line_number":277,"context_line":"        \"\"\"Write the data to the backend storage system."},{"line_number":278,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F%2BL7s%3D","line":275,"in_reply_to":"AAAAWH%2F%2BVSM%3D","updated":"2014-03-28 15:05:11.000000000","message":"Just to be clear, by a new fix coming up, did you mean the monkey patching to eliminate true concurrency?\n\n  https://review.openstack.org/#/c/83435/3/ceilometer/cli.py","commit_id":"fd3e467a5babcbabdd20b6a747a0bbc90cffae4f"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"0945d52bb09b3823b9f3091211c7a4216cf24837","unresolved":false,"context_lines":[{"line_number":272,"context_line":"        alarm_history_table.put(alarm_change.get(\u0027alarm_id\u0027) + \"_\" + str(rts),"},{"line_number":273,"context_line":"                                alarm_change_dict)"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"    # TODO(nprivalova): this method works ok only in single-thread environment."},{"line_number":276,"context_line":"    def record_metering_data(self, data):"},{"line_number":277,"context_line":"        \"\"\"Write the data to the backend storage system."},{"line_number":278,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F%2BVSM%3D","line":275,"in_reply_to":"AAAAWH%2F%2BWGA%3D","updated":"2014-03-27 15:19:23.000000000","message":"yep. Actually I hope that this TODO comment will be resolved today... A new fix is comming up :)","commit_id":"fd3e467a5babcbabdd20b6a747a0bbc90cffae4f"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"e868847ecb5580201fa0637a46effda6261dfa6f","unresolved":false,"context_lines":[{"line_number":301,"context_line":"        # Update if resource has new information. If resource is new then all"},{"line_number":302,"context_line":"        # of the conditions will be True. Here there is an assumption that"},{"line_number":303,"context_line":"        # resource may not change user_id or project_id and may have only"},{"line_number":304,"context_line":"        # one source"},{"line_number":305,"context_line":"        if (new_meter not in meters) or (metadata !\u003d resource_metadata):"},{"line_number":306,"context_line":"            new_meters \u003d copy.copy(meters)"},{"line_number":307,"context_line":"            if new_meter not in meters:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F%2BWHE%3D","line":304,"updated":"2014-03-27 13:51:59.000000000","message":"I think that\u0027s a valid assumption and one that we rely on in mongo also.","commit_id":"fd3e467a5babcbabdd20b6a747a0bbc90cffae4f"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"e868847ecb5580201fa0637a46effda6261dfa6f","unresolved":false,"context_lines":[{"line_number":303,"context_line":"        # resource may not change user_id or project_id and may have only"},{"line_number":304,"context_line":"        # one source"},{"line_number":305,"context_line":"        if (new_meter not in meters) or (metadata !\u003d resource_metadata):"},{"line_number":306,"context_line":"            new_meters \u003d copy.copy(meters)"},{"line_number":307,"context_line":"            if new_meter not in meters:"},{"line_number":308,"context_line":"                new_meters.append(new_meter)"},{"line_number":309,"context_line":"            resource_table.put(data[\u0027resource_id\u0027],"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F%2BWGM%3D","line":306,"updated":"2014-03-27 13:51:59.000000000","message":"Do the meters need to be copied if only the resource metadata has changed?\n\nShould the order of lines 306 and 307 be inverted?","commit_id":"fd3e467a5babcbabdd20b6a747a0bbc90cffae4f"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"b344b8a120f2e3b7dd31dcd4371916b10f229a48","unresolved":false,"context_lines":[{"line_number":303,"context_line":"        # resource may not change user_id or project_id and may have only"},{"line_number":304,"context_line":"        # one source"},{"line_number":305,"context_line":"        if (new_meter not in meters) or (metadata !\u003d resource_metadata):"},{"line_number":306,"context_line":"            new_meters \u003d copy.copy(meters)"},{"line_number":307,"context_line":"            if new_meter not in meters:"},{"line_number":308,"context_line":"                new_meters.append(new_meter)"},{"line_number":309,"context_line":"            resource_table.put(data[\u0027resource_id\u0027],"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F%2BL1o%3D","line":306,"in_reply_to":"AAAAWH%2F%2BUds%3D","updated":"2014-03-28 15:13:58.000000000","message":"won\u0027t this fail if the connection pool patch works? we can\u0027t really merge both (it\u0027s sort of a one or the other type deal)","commit_id":"fd3e467a5babcbabdd20b6a747a0bbc90cffae4f"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"13553325949f5d6326a3f85a0288a71341153c71","unresolved":false,"context_lines":[{"line_number":303,"context_line":"        # resource may not change user_id or project_id and may have only"},{"line_number":304,"context_line":"        # one source"},{"line_number":305,"context_line":"        if (new_meter not in meters) or (metadata !\u003d resource_metadata):"},{"line_number":306,"context_line":"            new_meters \u003d copy.copy(meters)"},{"line_number":307,"context_line":"            if new_meter not in meters:"},{"line_number":308,"context_line":"                new_meters.append(new_meter)"},{"line_number":309,"context_line":"            resource_table.put(data[\u0027resource_id\u0027],"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F%2BUds%3D","line":306,"in_reply_to":"AAAAWH%2F%2BVbg%3D","updated":"2014-03-27 16:38:15.000000000","message":"Yep, sorry, I was just nitpicking on whether the copy was really needed if you didn\u0027t need to append the new meter to the list.","commit_id":"fd3e467a5babcbabdd20b6a747a0bbc90cffae4f"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"5b14c245f5c43b07df4bf5a380d22412663f7fb7","unresolved":false,"context_lines":[{"line_number":303,"context_line":"        # resource may not change user_id or project_id and may have only"},{"line_number":304,"context_line":"        # one source"},{"line_number":305,"context_line":"        if (new_meter not in meters) or (metadata !\u003d resource_metadata):"},{"line_number":306,"context_line":"            new_meters \u003d copy.copy(meters)"},{"line_number":307,"context_line":"            if new_meter not in meters:"},{"line_number":308,"context_line":"                new_meters.append(new_meter)"},{"line_number":309,"context_line":"            resource_table.put(data[\u0027resource_id\u0027],"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F%2BVbg%3D","line":306,"in_reply_to":"AAAAWH%2F%2BWGM%3D","updated":"2014-03-27 15:01:25.000000000","message":"hm, there is \u0027or\u0027 operation. So if metadata is not changed but there is a new meter we will update resource","commit_id":"fd3e467a5babcbabdd20b6a747a0bbc90cffae4f"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"30ff7649159d1e35efa14e42d3647295de405073","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    - user"},{"line_number":51,"context_line":"      - row_key: user_id"},{"line_number":52,"context_line":"      - CFs:"},{"line_number":53,"context_line":"          f: contains user_id"},{"line_number":54,"context_line":"          s: contains all sources for user"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAWH%2F9Vtw%3D","line":52,"updated":"2014-04-06 15:07:47.000000000","message":"Could you please clarify the abbreviations like \u0027CFs\u0027, \u0027f\u0027, \u0027s\u0027, \u0027m\u0027? It is good in a note before the model description also, if you would like to use this shorter format here.","commit_id":"50585b234843aadbaa2039aded81236f89cf6339"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"431e637d8a78e0d34c8a617f5e33abc21ae17963","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    - user"},{"line_number":51,"context_line":"      - row_key: user_id"},{"line_number":52,"context_line":"      - CFs:"},{"line_number":53,"context_line":"          f: contains user_id"},{"line_number":54,"context_line":"          s: contains all sources for user"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAWH%2F9Qmk%3D","line":52,"in_reply_to":"AAAAWH%2F9Qys%3D","updated":"2014-04-07 15:36:53.000000000","message":"Hmm, that looks interesting... Thanks for the link, I have no more questions here. :)","commit_id":"50585b234843aadbaa2039aded81236f89cf6339"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"5031527bf3557f67c02e3ac37509ecc777f19b98","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    - user"},{"line_number":51,"context_line":"      - row_key: user_id"},{"line_number":52,"context_line":"      - CFs:"},{"line_number":53,"context_line":"          f: contains user_id"},{"line_number":54,"context_line":"          s: contains all sources for user"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAWH%2F9Qys%3D","line":52,"in_reply_to":"AAAAWH%2F9RBg%3D","updated":"2014-04-07 15:11:10.000000000","message":"It\u0027s because cf-name appends to column-name actually. You may take a look here http://hbase.apache.org/book/rowkey.design.html 6.3.2.1. Column Families","commit_id":"50585b234843aadbaa2039aded81236f89cf6339"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"b910cdea2ec234b01dff2ff67b4b90f2f8518756","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    - user"},{"line_number":51,"context_line":"      - row_key: user_id"},{"line_number":52,"context_line":"      - CFs:"},{"line_number":53,"context_line":"          f: contains user_id"},{"line_number":54,"context_line":"          s: contains all sources for user"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAWH%2F9RBg%3D","line":52,"in_reply_to":"AAAAWH%2F9Tx8%3D","updated":"2014-04-07 14:46:17.000000000","message":"Thanks for the explanation, I found the solution for CFs finally, but it will be good to have the longer version here. I was just automatically trying to find the appropriate words for these letters, like I assume \u0027s\u0027 stands for \u0027source\u0027. Is there any concrete reason, because of which these CF names are this short?","commit_id":"50585b234843aadbaa2039aded81236f89cf6339"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"d7b1e98f415a949a80ceaaf5c08dcad4348f54b8","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    - user"},{"line_number":51,"context_line":"      - row_key: user_id"},{"line_number":52,"context_line":"      - CFs:"},{"line_number":53,"context_line":"          f: contains user_id"},{"line_number":54,"context_line":"          s: contains all sources for user"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAWH%2F9Tx8%3D","line":52,"in_reply_to":"AAAAWH%2F9Vtw%3D","updated":"2014-04-07 08:08:15.000000000","message":"CF - it\u0027s column family. It is HBase term. \u0027f\u0027, \u0027s\u0027 and \u0027m\u0027 are just the names of column families. It\u0027s better to keep cf\u0027s names as short as posible. I will replace CF to \"column families\" in next patch","commit_id":"50585b234843aadbaa2039aded81236f89cf6339"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"30ff7649159d1e35efa14e42d3647295de405073","unresolved":false,"context_lines":[{"line_number":63,"context_line":"      - row-key: consists of reversed timestamp, meter and an md5 of"},{"line_number":64,"context_line":"                 user+resource+project for purposes of uniqueness"},{"line_number":65,"context_line":"      - CFs:"},{"line_number":66,"context_line":"          f: contains all parsed stuff. Columns:"},{"line_number":67,"context_line":"               -counter_name : \u003cname of counter\u003e"},{"line_number":68,"context_line":"               -counter_type : \u003ctype of counter\u003e"},{"line_number":69,"context_line":"               -counter_unit : \u003cunit of counter\u003e"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAWH%2F9Vts%3D","line":66,"updated":"2014-04-06 15:07:47.000000000","message":"This explanation is not too informative here. Could you please add a more detailed description?","commit_id":"50585b234843aadbaa2039aded81236f89cf6339"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"5031527bf3557f67c02e3ac37509ecc777f19b98","unresolved":false,"context_lines":[{"line_number":63,"context_line":"      - row-key: consists of reversed timestamp, meter and an md5 of"},{"line_number":64,"context_line":"                 user+resource+project for purposes of uniqueness"},{"line_number":65,"context_line":"      - CFs:"},{"line_number":66,"context_line":"          f: contains all parsed stuff. Columns:"},{"line_number":67,"context_line":"               -counter_name : \u003cname of counter\u003e"},{"line_number":68,"context_line":"               -counter_type : \u003ctype of counter\u003e"},{"line_number":69,"context_line":"               -counter_unit : \u003cunit of counter\u003e"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAWH%2F9Q0s%3D","line":66,"in_reply_to":"AAAAWH%2F9RGI%3D","updated":"2014-04-07 15:11:10.000000000","message":"Ok, will fix that","commit_id":"50585b234843aadbaa2039aded81236f89cf6339"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"b910cdea2ec234b01dff2ff67b4b90f2f8518756","unresolved":false,"context_lines":[{"line_number":63,"context_line":"      - row-key: consists of reversed timestamp, meter and an md5 of"},{"line_number":64,"context_line":"                 user+resource+project for purposes of uniqueness"},{"line_number":65,"context_line":"      - CFs:"},{"line_number":66,"context_line":"          f: contains all parsed stuff. Columns:"},{"line_number":67,"context_line":"               -counter_name : \u003cname of counter\u003e"},{"line_number":68,"context_line":"               -counter_type : \u003ctype of counter\u003e"},{"line_number":69,"context_line":"               -counter_unit : \u003cunit of counter\u003e"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAWH%2F9RGI%3D","line":66,"in_reply_to":"AAAAWH%2F9TxA%3D","updated":"2014-04-07 14:46:17.000000000","message":"It sounds good to me, I mean to explain \u0027f\u0027 as a column family, which contains the columns, listed below, instead of the \u0027all parsed stuff\u0027.","commit_id":"50585b234843aadbaa2039aded81236f89cf6339"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"d7b1e98f415a949a80ceaaf5c08dcad4348f54b8","unresolved":false,"context_lines":[{"line_number":63,"context_line":"      - row-key: consists of reversed timestamp, meter and an md5 of"},{"line_number":64,"context_line":"                 user+resource+project for purposes of uniqueness"},{"line_number":65,"context_line":"      - CFs:"},{"line_number":66,"context_line":"          f: contains all parsed stuff. Columns:"},{"line_number":67,"context_line":"               -counter_name : \u003cname of counter\u003e"},{"line_number":68,"context_line":"               -counter_type : \u003ctype of counter\u003e"},{"line_number":69,"context_line":"               -counter_unit : \u003cunit of counter\u003e"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAWH%2F9TxA%3D","line":66,"in_reply_to":"AAAAWH%2F9Vts%3D","updated":"2014-04-07 08:08:15.000000000","message":"hmm... I thought it\u0027s as detailed as possible :) Column family \u0027f\u0027 contains all the columns which are listed here. So \"all parsed stuff\" is the list below.","commit_id":"50585b234843aadbaa2039aded81236f89cf6339"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"30ff7649159d1e35efa14e42d3647295de405073","unresolved":false,"context_lines":[{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    def upgrade(self):"},{"line_number":170,"context_line":"        with self.conn_pool.connection() as conn:"},{"line_number":171,"context_line":"            conn.create_table(self.PROJECT_TABLE, {\u0027f\u0027: dict(max_versions\u003d1),"},{"line_number":172,"context_line":"                                                   \u0027s\u0027: dict(max_versions\u003d1)})"},{"line_number":173,"context_line":"            conn.create_table(self.USER_TABLE, {\u0027f\u0027: dict(max_versions\u003d1),"},{"line_number":174,"context_line":"                                                \u0027s\u0027: dict(max_versions\u003d1)})"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAWH%2F9Vs8%3D","line":171,"updated":"2014-04-06 15:07:47.000000000","message":"What is \u0027max_versions\u0027 used for?","commit_id":"50585b234843aadbaa2039aded81236f89cf6339"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"431e637d8a78e0d34c8a617f5e33abc21ae17963","unresolved":false,"context_lines":[{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    def upgrade(self):"},{"line_number":170,"context_line":"        with self.conn_pool.connection() as conn:"},{"line_number":171,"context_line":"            conn.create_table(self.PROJECT_TABLE, {\u0027f\u0027: dict(max_versions\u003d1),"},{"line_number":172,"context_line":"                                                   \u0027s\u0027: dict(max_versions\u003d1)})"},{"line_number":173,"context_line":"            conn.create_table(self.USER_TABLE, {\u0027f\u0027: dict(max_versions\u003d1),"},{"line_number":174,"context_line":"                                                \u0027s\u0027: dict(max_versions\u003d1)})"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAWH%2F9Qo0%3D","line":171,"in_reply_to":"AAAAWH%2F9Qx0%3D","updated":"2014-04-07 15:36:53.000000000","message":"A-ha, ok, I thought I miss something HBase related thing here again. :)","commit_id":"50585b234843aadbaa2039aded81236f89cf6339"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"5031527bf3557f67c02e3ac37509ecc777f19b98","unresolved":false,"context_lines":[{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    def upgrade(self):"},{"line_number":170,"context_line":"        with self.conn_pool.connection() as conn:"},{"line_number":171,"context_line":"            conn.create_table(self.PROJECT_TABLE, {\u0027f\u0027: dict(max_versions\u003d1),"},{"line_number":172,"context_line":"                                                   \u0027s\u0027: dict(max_versions\u003d1)})"},{"line_number":173,"context_line":"            conn.create_table(self.USER_TABLE, {\u0027f\u0027: dict(max_versions\u003d1),"},{"line_number":174,"context_line":"                                                \u0027s\u0027: dict(max_versions\u003d1)})"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAWH%2F9Qx0%3D","line":171,"in_reply_to":"AAAAWH%2F9RIA%3D","updated":"2014-04-07 15:11:10.000000000","message":"Just because I didn\u0027t want to touch alarm-stuff in this patch :)","commit_id":"50585b234843aadbaa2039aded81236f89cf6339"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"b910cdea2ec234b01dff2ff67b4b90f2f8518756","unresolved":false,"context_lines":[{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    def upgrade(self):"},{"line_number":170,"context_line":"        with self.conn_pool.connection() as conn:"},{"line_number":171,"context_line":"            conn.create_table(self.PROJECT_TABLE, {\u0027f\u0027: dict(max_versions\u003d1),"},{"line_number":172,"context_line":"                                                   \u0027s\u0027: dict(max_versions\u003d1)})"},{"line_number":173,"context_line":"            conn.create_table(self.USER_TABLE, {\u0027f\u0027: dict(max_versions\u003d1),"},{"line_number":174,"context_line":"                                                \u0027s\u0027: dict(max_versions\u003d1)})"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAWH%2F9RIA%3D","line":171,"in_reply_to":"AAAAWH%2F9Tvg%3D","updated":"2014-04-07 14:46:17.000000000","message":"Thanks for the details, it\u0027s more clear now. Just one additional question. Why didn\u0027t you add this max_versions\u003d1 to the ALARM_TABLE and the ALARM_HISTORY_TABLE?","commit_id":"50585b234843aadbaa2039aded81236f89cf6339"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"d7b1e98f415a949a80ceaaf5c08dcad4348f54b8","unresolved":false,"context_lines":[{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    def upgrade(self):"},{"line_number":170,"context_line":"        with self.conn_pool.connection() as conn:"},{"line_number":171,"context_line":"            conn.create_table(self.PROJECT_TABLE, {\u0027f\u0027: dict(max_versions\u003d1),"},{"line_number":172,"context_line":"                                                   \u0027s\u0027: dict(max_versions\u003d1)})"},{"line_number":173,"context_line":"            conn.create_table(self.USER_TABLE, {\u0027f\u0027: dict(max_versions\u003d1),"},{"line_number":174,"context_line":"                                                \u0027s\u0027: dict(max_versions\u003d1)})"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAWH%2F9Tvg%3D","line":171,"in_reply_to":"AAAAWH%2F9Vs8%3D","updated":"2014-04-07 08:08:15.000000000","message":"\"max_versions\" - how many versions of the data should be stored. E.g. we have resource and we store it\u0027s metadata. Metadata is stored in column-family \u0027f\u0027 and column \u0027resource_metadata\u0027. By default HBase stores 3 latest versions of metadata, but we don\u0027t need it. We use only the latest one. And the same far all data we work with. So here I change default 3 to more suitable 1","commit_id":"50585b234843aadbaa2039aded81236f89cf6339"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"029674cac75bdb442bad16f882704c91c6541a3b","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    - resource"},{"line_number":85,"context_line":"      - row_key: uuid of resource"},{"line_number":86,"context_line":"      - Column Families:"},{"line_number":87,"context_line":"          f: contains all parsed stuff. Columns:"},{"line_number":88,"context_line":"               -resource_metadata: raw metadata for corresponding resource"},{"line_number":89,"context_line":"               -project_id: \u003cid of project\u003e"},{"line_number":90,"context_line":"               -resource_id: \u003cid of resource\u003e"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAW3%2F%2FpVU%3D","line":87,"updated":"2014-04-11 13:08:12.000000000","message":"you could probably change this to \u0027normalised resource data\u0027 instead of \u0027contains all parsed stuff\u0027","commit_id":"59cb22f1a64372e8e1a351dfdd3eec9adbc8d125"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"37b2518443eeb43d74e8dcb6cf05a8f18cc05f65","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    - resource"},{"line_number":85,"context_line":"      - row_key: uuid of resource"},{"line_number":86,"context_line":"      - Column Families:"},{"line_number":87,"context_line":"          f: contains all parsed stuff. Columns:"},{"line_number":88,"context_line":"               -resource_metadata: raw metadata for corresponding resource"},{"line_number":89,"context_line":"               -project_id: \u003cid of project\u003e"},{"line_number":90,"context_line":"               -resource_id: \u003cid of resource\u003e"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAW3%2F%2FefE%3D","line":87,"in_reply_to":"AAAAW3%2F%2FpVU%3D","updated":"2014-04-14 12:32:26.000000000","message":"Will change to \"f: contains the following qualifiers:\"","commit_id":"59cb22f1a64372e8e1a351dfdd3eec9adbc8d125"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"029674cac75bdb442bad16f882704c91c6541a3b","unresolved":false,"context_lines":[{"line_number":92,"context_line":"               -flattened metadata with prefix r_metadata. e.g."},{"line_number":93,"context_line":"                f:r_metadata.display_name or f:r_metadata.tag"},{"line_number":94,"context_line":"               -sources for all corresponding meters with prefix \u0027s\u0027"},{"line_number":95,"context_line":"               -all meters for this resource in format"},{"line_number":96,"context_line":"                \"%s!%s!%s+%s\" % (counter_name, counter_type, counter_unit,"},{"line_number":97,"context_line":"                source)"},{"line_number":98,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAW3%2F%2FpVo%3D","line":95,"updated":"2014-04-11 13:08:12.000000000","message":"is it correct that this creates a qualifier for each meter? that\u0027s pretty cool.","commit_id":"59cb22f1a64372e8e1a351dfdd3eec9adbc8d125"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"37b2518443eeb43d74e8dcb6cf05a8f18cc05f65","unresolved":false,"context_lines":[{"line_number":92,"context_line":"               -flattened metadata with prefix r_metadata. e.g."},{"line_number":93,"context_line":"                f:r_metadata.display_name or f:r_metadata.tag"},{"line_number":94,"context_line":"               -sources for all corresponding meters with prefix \u0027s\u0027"},{"line_number":95,"context_line":"               -all meters for this resource in format"},{"line_number":96,"context_line":"                \"%s!%s!%s+%s\" % (counter_name, counter_type, counter_unit,"},{"line_number":97,"context_line":"                source)"},{"line_number":98,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAW3%2F%2Feek%3D","line":95,"in_reply_to":"AAAAW3%2F%2FpVo%3D","updated":"2014-04-14 12:32:26.000000000","message":"Yes, it\u0027s correct","commit_id":"59cb22f1a64372e8e1a351dfdd3eec9adbc8d125"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"029674cac75bdb442bad16f882704c91c6541a3b","unresolved":false,"context_lines":[{"line_number":307,"context_line":""},{"line_number":308,"context_line":"            if data[\u0027user_id\u0027]:"},{"line_number":309,"context_line":"                user_table.put(data[\u0027user_id\u0027], serialize_entry("},{"line_number":310,"context_line":"                    **{\u0027source\u0027: data[\u0027source\u0027], \u0027user_id\u0027: data[\u0027user_id\u0027]}))"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"            project_table.put(data[\u0027project_id\u0027], serialize_entry("},{"line_number":313,"context_line":"                **{\u0027source\u0027: data[\u0027source\u0027], \u0027project_id\u0027: data[\u0027project_id\u0027]})"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAW3%2F%2FpVI%3D","line":310,"updated":"2014-04-11 13:08:12.000000000","message":"do we really need a user_id column if it\u0027s already the rowkey\n\nmight be out of scope but maybe add a todo?","commit_id":"59cb22f1a64372e8e1a351dfdd3eec9adbc8d125"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"37b2518443eeb43d74e8dcb6cf05a8f18cc05f65","unresolved":false,"context_lines":[{"line_number":307,"context_line":""},{"line_number":308,"context_line":"            if data[\u0027user_id\u0027]:"},{"line_number":309,"context_line":"                user_table.put(data[\u0027user_id\u0027], serialize_entry("},{"line_number":310,"context_line":"                    **{\u0027source\u0027: data[\u0027source\u0027], \u0027user_id\u0027: data[\u0027user_id\u0027]}))"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"            project_table.put(data[\u0027project_id\u0027], serialize_entry("},{"line_number":313,"context_line":"                **{\u0027source\u0027: data[\u0027source\u0027], \u0027project_id\u0027: data[\u0027project_id\u0027]})"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAW3%2F%2FdzU%3D","line":310,"in_reply_to":"AAAAW3%2F%2FpVI%3D","updated":"2014-04-14 12:32:26.000000000","message":"Looks like it\u0027s not difficult to remove. I\u0027ll try to test it to be sure that it doesn\u0027t break anything","commit_id":"59cb22f1a64372e8e1a351dfdd3eec9adbc8d125"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"029674cac75bdb442bad16f882704c91c6541a3b","unresolved":false,"context_lines":[{"line_number":309,"context_line":"                user_table.put(data[\u0027user_id\u0027], serialize_entry("},{"line_number":310,"context_line":"                    **{\u0027source\u0027: data[\u0027source\u0027], \u0027user_id\u0027: data[\u0027user_id\u0027]}))"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"            project_table.put(data[\u0027project_id\u0027], serialize_entry("},{"line_number":313,"context_line":"                **{\u0027source\u0027: data[\u0027source\u0027], \u0027project_id\u0027: data[\u0027project_id\u0027]})"},{"line_number":314,"context_line":"            )"},{"line_number":315,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAW3%2F%2FpU8%3D","line":312,"updated":"2014-04-11 13:08:12.000000000","message":"same as above","commit_id":"59cb22f1a64372e8e1a351dfdd3eec9adbc8d125"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"029674cac75bdb442bad16f882704c91c6541a3b","unresolved":false,"context_lines":[{"line_number":322,"context_line":"            resource \u003d serialize_entry(**{"},{"line_number":323,"context_line":"                \u0027source\u0027: data[\u0027source\u0027], \u0027meter\u0027: new_meter,"},{"line_number":324,"context_line":"                \u0027resource_metadata\u0027: resource_metadata,"},{"line_number":325,"context_line":"                \u0027resource_id\u0027: data[\u0027resource_id\u0027],"},{"line_number":326,"context_line":"                \u0027project_id\u0027: data[\u0027project_id\u0027], \u0027user_id\u0027: data[\u0027user_id\u0027]})"},{"line_number":327,"context_line":"            resource_table.put(data[\u0027resource_id\u0027], resource)"},{"line_number":328,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAW3%2F%2FpU4%3D","line":325,"updated":"2014-04-11 13:08:12.000000000","message":"same as above","commit_id":"59cb22f1a64372e8e1a351dfdd3eec9adbc8d125"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"029674cac75bdb442bad16f882704c91c6541a3b","unresolved":false,"context_lines":[{"line_number":335,"context_line":"            # We use reverse timestamps in rowkeys as they are sorted"},{"line_number":336,"context_line":"            # alphabetically."},{"line_number":337,"context_line":"            rts \u003d reverse_timestamp(data[\u0027timestamp\u0027])"},{"line_number":338,"context_line":"            row \u003d \"%s_%d_%s\" % (data[\u0027counter_name\u0027], rts, m.hexdigest())"},{"line_number":339,"context_line":"            record \u003d serialize_entry(data, **{\u0027source\u0027: data[\u0027source\u0027],"},{"line_number":340,"context_line":"                                              \u0027rts\u0027: rts,"},{"line_number":341,"context_line":"                                              \u0027message\u0027: data,"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAW3%2F%2FpU0%3D","line":338,"updated":"2014-04-11 13:08:12.000000000","message":"is this actually unique? is it not possible to get multiple occasions where the same meter,(resource/user/project), appear with same time?\n\nalso, might be out of scope but could you add todo if valid?","commit_id":"59cb22f1a64372e8e1a351dfdd3eec9adbc8d125"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"37b2518443eeb43d74e8dcb6cf05a8f18cc05f65","unresolved":false,"context_lines":[{"line_number":335,"context_line":"            # We use reverse timestamps in rowkeys as they are sorted"},{"line_number":336,"context_line":"            # alphabetically."},{"line_number":337,"context_line":"            rts \u003d reverse_timestamp(data[\u0027timestamp\u0027])"},{"line_number":338,"context_line":"            row \u003d \"%s_%d_%s\" % (data[\u0027counter_name\u0027], rts, m.hexdigest())"},{"line_number":339,"context_line":"            record \u003d serialize_entry(data, **{\u0027source\u0027: data[\u0027source\u0027],"},{"line_number":340,"context_line":"                                              \u0027rts\u0027: rts,"},{"line_number":341,"context_line":"                                              \u0027message\u0027: data,"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAW3%2F%2Fd0I%3D","line":338,"in_reply_to":"AAAAW3%2F%2FpU0%3D","updated":"2014-04-14 12:32:26.000000000","message":"rts operates with milliseconds. One counter from the same (user, resource, project) seems impossible to me. But who knows... I will add a note about it. Maybe it\u0027s better to use \u0027message_signature\u0027 here","commit_id":"59cb22f1a64372e8e1a351dfdd3eec9adbc8d125"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"029674cac75bdb442bad16f882704c91c6541a3b","unresolved":false,"context_lines":[{"line_number":969,"context_line":"            flattened_meta \u003d dump_metadata(v)"},{"line_number":970,"context_line":"            for k, m in flattened_meta.items():"},{"line_number":971,"context_line":"                result[\u0027f:r_metadata.\u0027 + k] \u003d dump(m)"},{"line_number":972,"context_line":"            result[\u0027f:resource_metadata\u0027] \u003d dump(v)"},{"line_number":973,"context_line":"        else:"},{"line_number":974,"context_line":"            result[\u0027f:\u0027 + k] \u003d dump(v)"},{"line_number":975,"context_line":"    return result"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAW3%2F%2FpO0%3D","line":972,"updated":"2014-04-11 13:08:12.000000000","message":"do we have concerns here about backward compatibility? i assume on all old data, this column won\u0027t exist.","commit_id":"59cb22f1a64372e8e1a351dfdd3eec9adbc8d125"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"6f93022af91c53df34542ef797f465253fce0864","unresolved":false,"context_lines":[{"line_number":969,"context_line":"            flattened_meta \u003d dump_metadata(v)"},{"line_number":970,"context_line":"            for k, m in flattened_meta.items():"},{"line_number":971,"context_line":"                result[\u0027f:r_metadata.\u0027 + k] \u003d dump(m)"},{"line_number":972,"context_line":"            result[\u0027f:resource_metadata\u0027] \u003d dump(v)"},{"line_number":973,"context_line":"        else:"},{"line_number":974,"context_line":"            result[\u0027f:\u0027 + k] \u003d dump(v)"},{"line_number":975,"context_line":"    return result"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAW3%2F%2FTZw%3D","line":972,"in_reply_to":"AAAAW3%2F%2FpO0%3D","updated":"2014-04-15 13:33:58.000000000","message":"no one has \u0027old data\u0027 in HBase+Ceilometer now :) I think it\u0027s ok to change signatures now. What do you think?","commit_id":"59cb22f1a64372e8e1a351dfdd3eec9adbc8d125"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"58d3f00c14e07ba5e110ae33064b375b71670ec3","unresolved":false,"context_lines":[{"line_number":471,"context_line":"                    if frozen_meter in result:"},{"line_number":472,"context_line":"                        continue"},{"line_number":473,"context_line":"                    result.add(frozen_meter)"},{"line_number":474,"context_line":"                    meter_dict.update({\u0027source\u0027:"},{"line_number":475,"context_line":"                                       m_source if m_source else None})"},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"                    yield models.Meter(**meter_dict)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAXH%2F%2FA14%3D","line":474,"updated":"2014-04-24 17:01:55.000000000","message":"somewhat torn on this. does a meter represent different things between sources? to me, a meter is the metric definition... the source seems more in line as an attribute of a sample of meter...","commit_id":"b938f10c320ec5a8c110299a4146334a40c6a773"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"eb5fa306cc2ef4ed4df6b9b0bfe8407e2d69e543","unresolved":false,"context_lines":[{"line_number":471,"context_line":"                    if frozen_meter in result:"},{"line_number":472,"context_line":"                        continue"},{"line_number":473,"context_line":"                    result.add(frozen_meter)"},{"line_number":474,"context_line":"                    meter_dict.update({\u0027source\u0027:"},{"line_number":475,"context_line":"                                       m_source if m_source else None})"},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"                    yield models.Meter(**meter_dict)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAXX%2F%2F4iU%3D","line":474,"in_reply_to":"AAAAXH%2F%2FA14%3D","updated":"2014-04-25 15:13:29.000000000","message":"Absolutely agree with you. Please take a look on the bug I added above. The problem here is that in our model Meter *has* source argument. The second inconsistency is that Resource has only one source in it\u0027s constructor. I will prepare smth like a doc with such model-description","commit_id":"b938f10c320ec5a8c110299a4146334a40c6a773"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"a1ec4fdf822253c218ec9534012cf30415c566b1","unresolved":false,"context_lines":[{"line_number":471,"context_line":"                    if frozen_meter in result:"},{"line_number":472,"context_line":"                        continue"},{"line_number":473,"context_line":"                    result.add(frozen_meter)"},{"line_number":474,"context_line":"                    meter_dict.update({\u0027source\u0027:"},{"line_number":475,"context_line":"                                       m_source if m_source else None})"},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"                    yield models.Meter(**meter_dict)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAXX%2F%2F4VQ%3D","line":474,"in_reply_to":"AAAAXX%2F%2F4iU%3D","updated":"2014-04-25 15:38:57.000000000","message":"cool. if you can, please add link/info to https://etherpad.openstack.org/p/ceilometer-schema\n\njust so we can discuss it during summit","commit_id":"b938f10c320ec5a8c110299a4146334a40c6a773"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"58d3f00c14e07ba5e110ae33064b375b71670ec3","unresolved":false,"context_lines":[{"line_number":930,"context_line":"            sources.append(k[4:])"},{"line_number":931,"context_line":"        elif k.startswith(\u0027f:r_metadata.\u0027):"},{"line_number":932,"context_line":"            metadata_flattened[k[len(\u0027f:r_metadata.\u0027):]] \u003d load(v)"},{"line_number":933,"context_line":"        elif k.startswith(\u0027f:m_\u0027):"},{"line_number":934,"context_line":"            meters.append(k[4:])"},{"line_number":935,"context_line":"        else:"},{"line_number":936,"context_line":"            flatten_result[k[2:]] \u003d load(v)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAXH%2F%2FA8M%3D","line":933,"updated":"2014-04-24 17:01:55.000000000","message":"was there a reason for moving this (not that there\u0027s any logical difference)","commit_id":"b938f10c320ec5a8c110299a4146334a40c6a773"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"eb5fa306cc2ef4ed4df6b9b0bfe8407e2d69e543","unresolved":false,"context_lines":[{"line_number":930,"context_line":"            sources.append(k[4:])"},{"line_number":931,"context_line":"        elif k.startswith(\u0027f:r_metadata.\u0027):"},{"line_number":932,"context_line":"            metadata_flattened[k[len(\u0027f:r_metadata.\u0027):]] \u003d load(v)"},{"line_number":933,"context_line":"        elif k.startswith(\u0027f:m_\u0027):"},{"line_number":934,"context_line":"            meters.append(k[4:])"},{"line_number":935,"context_line":"        else:"},{"line_number":936,"context_line":"            flatten_result[k[2:]] \u003d load(v)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAXX%2F%2F4oQ%3D","line":933,"in_reply_to":"AAAAXH%2F%2FA8M%3D","updated":"2014-04-25 15:13:29.000000000","message":"Because I changed this line several times and eventually decided not to change the logic. Forgive me please :) I may upload a new change if it\u0027s needed","commit_id":"b938f10c320ec5a8c110299a4146334a40c6a773"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"a1ec4fdf822253c218ec9534012cf30415c566b1","unresolved":false,"context_lines":[{"line_number":930,"context_line":"            sources.append(k[4:])"},{"line_number":931,"context_line":"        elif k.startswith(\u0027f:r_metadata.\u0027):"},{"line_number":932,"context_line":"            metadata_flattened[k[len(\u0027f:r_metadata.\u0027):]] \u003d load(v)"},{"line_number":933,"context_line":"        elif k.startswith(\u0027f:m_\u0027):"},{"line_number":934,"context_line":"            meters.append(k[4:])"},{"line_number":935,"context_line":"        else:"},{"line_number":936,"context_line":"            flatten_result[k[2:]] \u003d load(v)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAXX%2F%2F4VA%3D","line":933,"in_reply_to":"AAAAXX%2F%2F4oQ%3D","updated":"2014-04-25 15:38:57.000000000","message":"not critical... i guess it\u0027d be better to change it back if you do need another patch.","commit_id":"b938f10c320ec5a8c110299a4146334a40c6a773"}],"ceilometer/tests/api/v2/test_list_meters_scenarios.py":[{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"e868847ecb5580201fa0637a46effda6261dfa6f","unresolved":false,"context_lines":[{"line_number":98,"context_line":"                    \u0027user-id\u0027,"},{"line_number":99,"context_line":"                    \u0027project-id\u0027,"},{"line_number":100,"context_line":"                    \u0027resource-id\u0027,"},{"line_number":101,"context_line":"                    timestamp\u003ddatetime.datetime(2012, 7, 2, 10, 40),"},{"line_number":102,"context_line":"                    resource_metadata\u003d{},"},{"line_number":103,"context_line":"                    source\u003d\u0027test_source\u0027),"},{"line_number":104,"context_line":"                sample.Sample("}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F%2BWEA%3D","line":101,"updated":"2014-03-27 13:51:59.000000000","message":"Better to have a later timestamp for the additional sample?","commit_id":"fd3e467a5babcbabdd20b6a747a0bbc90cffae4f"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"13553325949f5d6326a3f85a0288a71341153c71","unresolved":false,"context_lines":[{"line_number":98,"context_line":"                    \u0027user-id\u0027,"},{"line_number":99,"context_line":"                    \u0027project-id\u0027,"},{"line_number":100,"context_line":"                    \u0027resource-id\u0027,"},{"line_number":101,"context_line":"                    timestamp\u003ddatetime.datetime(2012, 7, 2, 10, 40),"},{"line_number":102,"context_line":"                    resource_metadata\u003d{},"},{"line_number":103,"context_line":"                    source\u003d\u0027test_source\u0027),"},{"line_number":104,"context_line":"                sample.Sample("}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F%2BUdM%3D","line":101,"in_reply_to":"AAAAWH%2F%2BVQ8%3D","updated":"2014-03-27 16:38:15.000000000","message":"k.","commit_id":"fd3e467a5babcbabdd20b6a747a0bbc90cffae4f"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"0945d52bb09b3823b9f3091211c7a4216cf24837","unresolved":false,"context_lines":[{"line_number":98,"context_line":"                    \u0027user-id\u0027,"},{"line_number":99,"context_line":"                    \u0027project-id\u0027,"},{"line_number":100,"context_line":"                    \u0027resource-id\u0027,"},{"line_number":101,"context_line":"                    timestamp\u003ddatetime.datetime(2012, 7, 2, 10, 40),"},{"line_number":102,"context_line":"                    resource_metadata\u003d{},"},{"line_number":103,"context_line":"                    source\u003d\u0027test_source\u0027),"},{"line_number":104,"context_line":"                sample.Sample("}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F%2BVQ8%3D","line":101,"in_reply_to":"AAAAWH%2F%2BWEA%3D","updated":"2014-03-27 15:19:23.000000000","message":"I don\u0027t think it\u0027s important... I test here that if there are two samples with the same resource_id all the samples will be stored. Metadata and timestamp are not important...","commit_id":"fd3e467a5babcbabdd20b6a747a0bbc90cffae4f"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"e868847ecb5580201fa0637a46effda6261dfa6f","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                    \u0027project-id\u0027,"},{"line_number":100,"context_line":"                    \u0027resource-id\u0027,"},{"line_number":101,"context_line":"                    timestamp\u003ddatetime.datetime(2012, 7, 2, 10, 40),"},{"line_number":102,"context_line":"                    resource_metadata\u003d{},"},{"line_number":103,"context_line":"                    source\u003d\u0027test_source\u0027),"},{"line_number":104,"context_line":"                sample.Sample("},{"line_number":105,"context_line":"                    \u0027meter.test\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F%2BWDs%3D","line":102,"updated":"2014-03-27 13:51:59.000000000","message":"Is the empty resource metadata realistic here?","commit_id":"fd3e467a5babcbabdd20b6a747a0bbc90cffae4f"}],"ceilometer/tests/api/v2/test_list_resources_scenarios.py":[{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"34dd8d338787d43a60ee73802cb59f83068ca9e0","unresolved":false,"context_lines":[{"line_number":520,"context_line":""},{"line_number":521,"context_line":"    def test_with_several_meters_per_resource(self):"},{"line_number":522,"context_line":"        sample1 \u003d sample.Sample("},{"line_number":523,"context_line":"            \u0027instance1\u0027,"},{"line_number":524,"context_line":"            \u0027cumulative\u0027,"},{"line_number":525,"context_line":"            \u0027\u0027,"},{"line_number":526,"context_line":"            1,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVn%2F%2Fhyc%3D","line":523,"updated":"2014-03-05 15:50:51.000000000","message":"It would be good to use something like \u0027counter_name_1\u0027 as counter name, it would make the test code more readable.","commit_id":"5e837a8c57f5b424fb01d7a807266f6996754e3d"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"7c042ba34d6d48d6d668a05e175973c48964280a","unresolved":false,"context_lines":[{"line_number":520,"context_line":""},{"line_number":521,"context_line":"    def test_with_several_meters_per_resource(self):"},{"line_number":522,"context_line":"        sample1 \u003d sample.Sample("},{"line_number":523,"context_line":"            \u0027instance1\u0027,"},{"line_number":524,"context_line":"            \u0027cumulative\u0027,"},{"line_number":525,"context_line":"            \u0027\u0027,"},{"line_number":526,"context_line":"            1,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVn%2F%2FZwc%3D","line":523,"in_reply_to":"AAAAVn%2F%2Fhyc%3D","updated":"2014-03-06 10:10:57.000000000","message":"Done","commit_id":"5e837a8c57f5b424fb01d7a807266f6996754e3d"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"34dd8d338787d43a60ee73802cb59f83068ca9e0","unresolved":false,"context_lines":[{"line_number":540,"context_line":"        self.conn.record_metering_data(msg)"},{"line_number":541,"context_line":""},{"line_number":542,"context_line":"        sample2 \u003d sample.Sample("},{"line_number":543,"context_line":"            \u0027instance2\u0027,"},{"line_number":544,"context_line":"            \u0027cumulative\u0027,"},{"line_number":545,"context_line":"            \u0027\u0027,"},{"line_number":546,"context_line":"            1,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVn%2F%2Fhxk%3D","line":543,"updated":"2014-03-05 15:50:51.000000000","message":"Just like above, it would be good to change this to \u0027counter_name_2\u0027, as it is a bit confusing to use \u0027instance1\u0027 and \u0027instance2\u0027 as names with the same resource_id.","commit_id":"5e837a8c57f5b424fb01d7a807266f6996754e3d"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"7c042ba34d6d48d6d668a05e175973c48964280a","unresolved":false,"context_lines":[{"line_number":540,"context_line":"        self.conn.record_metering_data(msg)"},{"line_number":541,"context_line":""},{"line_number":542,"context_line":"        sample2 \u003d sample.Sample("},{"line_number":543,"context_line":"            \u0027instance2\u0027,"},{"line_number":544,"context_line":"            \u0027cumulative\u0027,"},{"line_number":545,"context_line":"            \u0027\u0027,"},{"line_number":546,"context_line":"            1,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVn%2F%2FZwY%3D","line":543,"in_reply_to":"AAAAVn%2F%2Fhxk%3D","updated":"2014-03-06 10:10:57.000000000","message":"Done","commit_id":"5e837a8c57f5b424fb01d7a807266f6996754e3d"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"00fc992e66288a9e69cbf0c483ed5c4caf22b600","unresolved":false,"context_lines":[{"line_number":518,"context_line":"                         \u0027q.field\u003dresource_id\u0026q.value\u003dresource-id\u0027)"},{"line_number":519,"context_line":"                        in links[1][\u0027href\u0027])"},{"line_number":520,"context_line":""},{"line_number":521,"context_line":"    def test_with_several_meters_per_resource(self):"},{"line_number":522,"context_line":"        sample1 \u003d sample.Sample("},{"line_number":523,"context_line":"            \u0027counter_name_1\u0027,"},{"line_number":524,"context_line":"            \u0027cumulative\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAVn%2F%2FXz8%3D","line":521,"updated":"2014-03-06 15:22:43.000000000","message":"might be better to have this in test_list_meters_scenarios as it\u0027s ultimately testing get_meters","commit_id":"ce46fd4ec3f29b90eb05f99e4948122de5945a3c"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"1df0a0486966f6f5345b9025e0ac5ff0e515cbd3","unresolved":false,"context_lines":[{"line_number":518,"context_line":"                         \u0027q.field\u003dresource_id\u0026q.value\u003dresource-id\u0027)"},{"line_number":519,"context_line":"                        in links[1][\u0027href\u0027])"},{"line_number":520,"context_line":""},{"line_number":521,"context_line":"    def test_with_several_meters_per_resource(self):"},{"line_number":522,"context_line":"        sample1 \u003d sample.Sample("},{"line_number":523,"context_line":"            \u0027counter_name_1\u0027,"},{"line_number":524,"context_line":"            \u0027cumulative\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAWH%2F%2BwAw%3D","line":521,"in_reply_to":"AAAAVn%2F%2FPxM%3D","updated":"2014-03-24 16:27:28.000000000","message":"let\u0027s move this to test_list_meters_scenario... ultimately it\u0027s testing get_json(\u0027/meters\u0027)... not all backends search resource model for this information and we should hide this fact.","commit_id":"ce46fd4ec3f29b90eb05f99e4948122de5945a3c"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"f2cbae4dc995b5e76189e50320d6a64156dbe1d7","unresolved":false,"context_lines":[{"line_number":518,"context_line":"                         \u0027q.field\u003dresource_id\u0026q.value\u003dresource-id\u0027)"},{"line_number":519,"context_line":"                        in links[1][\u0027href\u0027])"},{"line_number":520,"context_line":""},{"line_number":521,"context_line":"    def test_with_several_meters_per_resource(self):"},{"line_number":522,"context_line":"        sample1 \u003d sample.Sample("},{"line_number":523,"context_line":"            \u0027counter_name_1\u0027,"},{"line_number":524,"context_line":"            \u0027cumulative\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAVn%2F%2FPxM%3D","line":521,"in_reply_to":"AAAAVn%2F%2FXz8%3D","updated":"2014-03-07 09:39:13.000000000","message":"I will move if you want. Don\u0027t think that it\u0027s very important. For HBase we test that resource table is populated correctly, that\u0027s why I put it here.","commit_id":"ce46fd4ec3f29b90eb05f99e4948122de5945a3c"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"f96942c96755016fddefa20b5f44c95e5ba26089","unresolved":false,"context_lines":[{"line_number":518,"context_line":"                         \u0027q.field\u003dresource_id\u0026q.value\u003dresource-id\u0027)"},{"line_number":519,"context_line":"                        in links[1][\u0027href\u0027])"},{"line_number":520,"context_line":""},{"line_number":521,"context_line":"    def test_with_several_meters_per_resource(self):"},{"line_number":522,"context_line":"        sample1 \u003d sample.Sample("},{"line_number":523,"context_line":"            \u0027counter_name_1\u0027,"},{"line_number":524,"context_line":"            \u0027cumulative\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAWH%2F%2Bo8I%3D","line":521,"in_reply_to":"AAAAWH%2F%2BwAw%3D","updated":"2014-03-25 11:18:17.000000000","message":"Done","commit_id":"ce46fd4ec3f29b90eb05f99e4948122de5945a3c"}]}
