)]}'
{"cinder/db/api.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"256dfd380d9f74b3f134e1127e07dc58f8c5607b","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    A possible filter is is_up\u003dTrue and it will filter nodes that are down."},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    :param service_id: Id of the sevice."},{"line_number":107,"context_line":"    :param node_summary: Retrieve num_nods and num_down_nodes information."},{"line_number":108,"context_line":"    :param get_nodes: To retrieve all nodes from this service."},{"line_number":109,"context_line":"    :param filters: Filters for the query in the form of key/value."},{"line_number":110,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"fa0719c6_b27a8275","line":107,"range":{"start_line":107,"start_character":34,"end_line":107,"end_character":42},"updated":"2016-03-23 13:06:36.000000000","message":"s/num_nods/num_nodes","commit_id":"a06f77bf1ed5b67b75152bf29c4c5c85dd109752"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"052fe8f126333ff4229fea832c776fb8cd8a6076","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    A possible filter is is_up\u003dTrue and it will filter nodes that are down."},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    :param service_id: Id of the sevice."},{"line_number":107,"context_line":"    :param node_summary: Retrieve num_nods and num_down_nodes information."},{"line_number":108,"context_line":"    :param get_nodes: To retrieve all nodes from this service."},{"line_number":109,"context_line":"    :param filters: Filters for the query in the form of key/value."},{"line_number":110,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"da0c15f0_1748b02c","line":107,"range":{"start_line":107,"start_character":34,"end_line":107,"end_character":42},"in_reply_to":"fa0719c6_b27a8275","updated":"2016-03-28 11:10:44.000000000","message":"Done","commit_id":"a06f77bf1ed5b67b75152bf29c4c5c85dd109752"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"256dfd380d9f74b3f134e1127e07dc58f8c5607b","unresolved":false,"context_lines":[{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    A possible filter is is_up\u003dTrue and it will filter nodes that are down."},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    :param node_summary: Retrieve num_nods and num_down_nodes information."},{"line_number":123,"context_line":"    :param get_nodes: To retrieve all nodes from this service."},{"line_number":124,"context_line":"    :param filters: Filters for the query in the form of key/value arguments."},{"line_number":125,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"fa0719c6_128c0e7e","line":122,"range":{"start_line":122,"start_character":34,"end_line":122,"end_character":42},"updated":"2016-03-23 13:06:36.000000000","message":"ditto","commit_id":"a06f77bf1ed5b67b75152bf29c4c5c85dd109752"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"052fe8f126333ff4229fea832c776fb8cd8a6076","unresolved":false,"context_lines":[{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    A possible filter is is_up\u003dTrue and it will filter nodes that are down."},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    :param node_summary: Retrieve num_nods and num_down_nodes information."},{"line_number":123,"context_line":"    :param get_nodes: To retrieve all nodes from this service."},{"line_number":124,"context_line":"    :param filters: Filters for the query in the form of key/value arguments."},{"line_number":125,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"da0c15f0_b72d8448","line":122,"range":{"start_line":122,"start_character":34,"end_line":122,"end_character":42},"in_reply_to":"fa0719c6_128c0e7e","updated":"2016-03-28 11:10:44.000000000","message":"Done","commit_id":"a06f77bf1ed5b67b75152bf29c4c5c85dd109752"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"256dfd380d9f74b3f134e1127e07dc58f8c5607b","unresolved":false,"context_lines":[{"line_number":151,"context_line":"                     disabled\u003dNone, **filters):"},{"line_number":152,"context_line":"    \"\"\"Get a service node or raise if it does not exist."},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    Allows filtering by some related service fields -host, binary, and"},{"line_number":155,"context_line":"    disabled- as well as by any service node field."},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    Raises ServiceNodeNotFound if service node doesn\u0027t exist."},{"line_number":158,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"fa0719c6_121c0ec0","line":155,"range":{"start_line":154,"start_character":0,"end_line":155,"end_character":51},"updated":"2016-03-23 13:06:36.000000000","message":"What happens if there are multiple results? I don\u0027t think we have a set of filters that will produce a single results besides id?","commit_id":"a06f77bf1ed5b67b75152bf29c4c5c85dd109752"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"052fe8f126333ff4229fea832c776fb8cd8a6076","unresolved":false,"context_lines":[{"line_number":151,"context_line":"                     disabled\u003dNone, **filters):"},{"line_number":152,"context_line":"    \"\"\"Get a service node or raise if it does not exist."},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    Allows filtering by some related service fields -host, binary, and"},{"line_number":155,"context_line":"    disabled- as well as by any service node field."},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    Raises ServiceNodeNotFound if service node doesn\u0027t exist."},{"line_number":158,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"da0c15f0_b7a2a4ac","line":155,"range":{"start_line":154,"start_character":0,"end_line":155,"end_character":51},"in_reply_to":"fa0719c6_121c0ec0","updated":"2016-03-28 11:10:44.000000000","message":"Like many other get methods we have, we return only the first element.\n\nThe idea is for example to get a service node from a specific host but only if is up, for example.","commit_id":"a06f77bf1ed5b67b75152bf29c4c5c85dd109752"}],"cinder/db/sqlalchemy/api.py":[{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"35fcb826c4bb8fbdc19c220ebe2bc2bf01001c0d","unresolved":false,"context_lines":[{"line_number":468,"context_line":"    session \u003d get_session()"},{"line_number":469,"context_line":"    with session.begin():"},{"line_number":470,"context_line":"        query \u003d _service_query(context, session\u003dsession, id\u003dservice_id)"},{"line_number":471,"context_line":"        query.filter(models.Service.num_nodes !\u003d 0)"},{"line_number":472,"context_line":"        # If the update doesn\u0027t suceed we don\u0027t know if it\u0027s because the"},{"line_number":473,"context_line":"        # service doesn\u0027t exist or because the Service has ServiceNodes"},{"line_number":474,"context_line":"        if not query.update(models.Service.delete_values()):"}],"source_content_type":"text/x-python","patch_set":19,"id":"1a122d0e_19d78224","line":471,"updated":"2016-04-22 08:33:33.000000000","message":"Should it be query.filter(models.Service.num_nodes \u003d\u003d 0)? \n\nI understand it as we can delete a service when no service nodes with the service id exist.\n\nMeanwhile, it seems that in the design spec no way is provided to delete a service node in db. If service node can\u0027t be deleted, the corresponding service can\u0027t be deleted.","commit_id":"8ac3e5a00a1fa022c44de0cc395e71723b61a417"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"bc4b757f2743ea60d6dae26ad3de9776ff4556e4","unresolved":false,"context_lines":[{"line_number":468,"context_line":"    session \u003d get_session()"},{"line_number":469,"context_line":"    with session.begin():"},{"line_number":470,"context_line":"        query \u003d _service_query(context, session\u003dsession, id\u003dservice_id)"},{"line_number":471,"context_line":"        query.filter(models.Service.num_nodes !\u003d 0)"},{"line_number":472,"context_line":"        # If the update doesn\u0027t suceed we don\u0027t know if it\u0027s because the"},{"line_number":473,"context_line":"        # service doesn\u0027t exist or because the Service has ServiceNodes"},{"line_number":474,"context_line":"        if not query.update(models.Service.delete_values()):"}],"source_content_type":"text/x-python","patch_set":19,"id":"1a122d0e_123754e4","line":471,"in_reply_to":"1a122d0e_19d78224","updated":"2016-04-22 14:15:36.000000000","message":"It should be, good catch!!\n\nFunny thing is that unittests are passing because the filter is not being used in the code, since I didn\u0027t assign it to query.  %-D\n\nAs for service_destroy, you are correct, manage command needs to be updated to allow it, but that goes in another patch.  So I\u0027ll add it to the appropriate patch and add in this one the possibility to delete all service nodes for a specific service.","commit_id":"8ac3e5a00a1fa022c44de0cc395e71723b61a417"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"41adab084a2db3bbe8c7cee44e2758debee33b96","unresolved":false,"context_lines":[{"line_number":506,"context_line":"    if filters and not is_valid_model_filters(models.ServiceNode, filters):"},{"line_number":507,"context_line":"        return None"},{"line_number":508,"context_line":""},{"line_number":509,"context_line":"    query \u003d model_query(context, models.ServiceNode)"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":"    # If we need to filter by Service table"},{"line_number":512,"context_line":"    if host or binary or disabled is not None:"}],"source_content_type":"text/x-python","patch_set":19,"id":"1a122d0e_ab2358a6","line":509,"updated":"2016-04-25 05:54:32.000000000","message":"Here it has a parameter session, but doesn\u0027t use it. Should be\nquery \u003d model_query(context, models.ServiceNode, session\u003dsession)?\n\nSame for read_deleted.","commit_id":"8ac3e5a00a1fa022c44de0cc395e71723b61a417"}],"cinder/db/sqlalchemy/migrate_repo/versions/074_add_node_heartbeats.py":[{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"41adab084a2db3bbe8c7cee44e2758debee33b96","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"        # ServiceNode specific fields"},{"line_number":35,"context_line":"        Column(\u0027id\u0027, Integer, primary_key\u003dTrue),"},{"line_number":36,"context_line":"        Column(\u0027name\u0027, String(255), nullable\u003dFalse),"},{"line_number":37,"context_line":"        Column(\u0027report_count\u0027, Integer(), nullable\u003dFalse, default\u003d0),"},{"line_number":38,"context_line":"        Column(\u0027service_id\u0027, Integer, nullable\u003dFalse),"},{"line_number":39,"context_line":"        Column(\u0027rpc_version\u0027, String(36)),"}],"source_content_type":"text/x-python","patch_set":19,"id":"1a122d0e_4be604b5","line":36,"updated":"2016-04-25 05:54:32.000000000","message":"From the spec https://review.openstack.org/#/c/232595/13/specs/newton/ha-aa-job-distribution.rst, name should be primary key. Should name here be set to primary key?","commit_id":"8ac3e5a00a1fa022c44de0cc395e71723b61a417"}],"cinder/db/sqlalchemy/models.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"256dfd380d9f74b3f134e1127e07dc58f8c5607b","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    # We want to overwrite default updated_at definition so we timestamp at"},{"line_number":68,"context_line":"    # creation as well"},{"line_number":69,"context_line":"    updated_at \u003d Column(DateTime, default\u003dtimeutils.utcnow,"},{"line_number":70,"context_line":"                        onupdate\u003dtimeutils.utcnow)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa0719c6_2d8f3376","line":69,"updated":"2016-03-23 13:06:36.000000000","message":"Should this also have timezone\u003dFalse?","commit_id":"a06f77bf1ed5b67b75152bf29c4c5c85dd109752"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"052fe8f126333ff4229fea832c776fb8cd8a6076","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    # We want to overwrite default updated_at definition so we timestamp at"},{"line_number":68,"context_line":"    # creation as well"},{"line_number":69,"context_line":"    updated_at \u003d Column(DateTime, default\u003dtimeutils.utcnow,"},{"line_number":70,"context_line":"                        onupdate\u003dtimeutils.utcnow)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":13,"id":"da0c15f0_77ddac0d","line":69,"in_reply_to":"fa0719c6_2d8f3376","updated":"2016-03-28 11:10:44.000000000","message":"This is exactly how oslo defines it without the timezone as well (although they do it a little weirdly and create a lambda): https://github.com/openstack/oslo.db/blob/master/oslo_db/sqlalchemy/models.py#L137","commit_id":"a06f77bf1ed5b67b75152bf29c4c5c85dd109752"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"256dfd380d9f74b3f134e1127e07dc58f8c5607b","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    updated_at \u003d Column(DateTime, default\u003dtimeutils.utcnow,"},{"line_number":70,"context_line":"                        onupdate\u003dtimeutils.utcnow)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue)"},{"line_number":73,"context_line":"    name \u003d Column(String(255), nullable\u003dFalse)"},{"line_number":74,"context_line":"    report_count \u003d Column(Integer, nullable\u003dFalse, default\u003d0)"},{"line_number":75,"context_line":"    service_id \u003d Column(Integer, nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa0719c6_edc6db98","line":72,"updated":"2016-03-23 13:06:36.000000000","message":"Is this nullable? It isn\u0027t in DB migration…?","commit_id":"a06f77bf1ed5b67b75152bf29c4c5c85dd109752"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"052fe8f126333ff4229fea832c776fb8cd8a6076","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    updated_at \u003d Column(DateTime, default\u003dtimeutils.utcnow,"},{"line_number":70,"context_line":"                        onupdate\u003dtimeutils.utcnow)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue)"},{"line_number":73,"context_line":"    name \u003d Column(String(255), nullable\u003dFalse)"},{"line_number":74,"context_line":"    report_count \u003d Column(Integer, nullable\u003dFalse, default\u003d0)"},{"line_number":75,"context_line":"    service_id \u003d Column(Integer, nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":13,"id":"da0c15f0_17239006","line":72,"in_reply_to":"fa0719c6_edc6db98","updated":"2016-03-28 11:10:44.000000000","message":"Well, an Integer primary_key is by default unique, not nullable and auto incremented, but I\u0027ll remove the explicit nullable definition on the migration to avoid misunderstandings.","commit_id":"a06f77bf1ed5b67b75152bf29c4c5c85dd109752"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"256dfd380d9f74b3f134e1127e07dc58f8c5607b","unresolved":false,"context_lines":[{"line_number":70,"context_line":"                        onupdate\u003dtimeutils.utcnow)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue)"},{"line_number":73,"context_line":"    name \u003d Column(String(255), nullable\u003dFalse)"},{"line_number":74,"context_line":"    report_count \u003d Column(Integer, nullable\u003dFalse, default\u003d0)"},{"line_number":75,"context_line":"    service_id \u003d Column(Integer, nullable\u003dFalse)"},{"line_number":76,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"fa0719c6_ad3fc385","line":73,"range":{"start_line":73,"start_character":4,"end_line":73,"end_character":46},"updated":"2016-03-23 13:06:36.000000000","message":"And name is nullable in DB migration.","commit_id":"a06f77bf1ed5b67b75152bf29c4c5c85dd109752"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"052fe8f126333ff4229fea832c776fb8cd8a6076","unresolved":false,"context_lines":[{"line_number":70,"context_line":"                        onupdate\u003dtimeutils.utcnow)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    id \u003d Column(Integer, primary_key\u003dTrue)"},{"line_number":73,"context_line":"    name \u003d Column(String(255), nullable\u003dFalse)"},{"line_number":74,"context_line":"    report_count \u003d Column(Integer, nullable\u003dFalse, default\u003d0)"},{"line_number":75,"context_line":"    service_id \u003d Column(Integer, nullable\u003dFalse)"},{"line_number":76,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"da0c15f0_f7e9bc81","line":73,"range":{"start_line":73,"start_character":4,"end_line":73,"end_character":46},"in_reply_to":"fa0719c6_ad3fc385","updated":"2016-03-28 11:10:44.000000000","message":"Done","commit_id":"a06f77bf1ed5b67b75152bf29c4c5c85dd109752"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"256dfd380d9f74b3f134e1127e07dc58f8c5607b","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    # TODO(geguileo): In O - drop these version fields in post upgrade"},{"line_number":114,"context_line":"    # Version columns to support rolling upgrade."},{"line_number":115,"context_line":"    # Current version is what the service is running now (i.e. minimum)."},{"line_number":116,"context_line":"    # Available version is what the service can support (i.e. max)."},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    # Version columns to support rolling upgrade. These report the max RPC API"},{"line_number":119,"context_line":"    # and objects versions that the manager of the service is able to support."}],"source_content_type":"text/x-python","patch_set":13,"id":"fa0719c6_cdcdd786","line":116,"range":{"start_line":115,"start_character":0,"end_line":116,"end_character":67},"updated":"2016-03-23 13:06:36.000000000","message":"I think this is inaccurate now?","commit_id":"a06f77bf1ed5b67b75152bf29c4c5c85dd109752"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"052fe8f126333ff4229fea832c776fb8cd8a6076","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    # TODO(geguileo): In O - drop these version fields in post upgrade"},{"line_number":114,"context_line":"    # Version columns to support rolling upgrade."},{"line_number":115,"context_line":"    # Current version is what the service is running now (i.e. minimum)."},{"line_number":116,"context_line":"    # Available version is what the service can support (i.e. max)."},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    # Version columns to support rolling upgrade. These report the max RPC API"},{"line_number":119,"context_line":"    # and objects versions that the manager of the service is able to support."}],"source_content_type":"text/x-python","patch_set":13,"id":"da0c15f0_577ea8ae","line":116,"range":{"start_line":115,"start_character":0,"end_line":116,"end_character":67},"in_reply_to":"fa0719c6_cdcdd786","updated":"2016-03-28 11:10:44.000000000","message":"I\u0027ll add a sentence to try and clarify it.","commit_id":"a06f77bf1ed5b67b75152bf29c4c5c85dd109752"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"aee8a07ede4d26772f704f40a5030e6b7616a05a","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    # TODO(geguileo): In O - drop these version fields in post upgrade"},{"line_number":114,"context_line":"    # Version columns to support rolling upgrade."},{"line_number":115,"context_line":"    # Current version is what the service is running now (i.e. minimum)."},{"line_number":116,"context_line":"    # Available version is what the service can support (i.e. max)."},{"line_number":117,"context_line":"    # These fields are only used by services that are still running M, O will"},{"line_number":118,"context_line":"    # report on the service_nodes table."},{"line_number":119,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"ba0121b8_390f5d89","line":116,"range":{"start_line":115,"start_character":0,"end_line":116,"end_character":67},"updated":"2016-03-31 12:41:26.000000000","message":"What I\u0027ve meant with these lines is that now we only have \"current_version\" here, without \"available_version\".","commit_id":"7c73f5311bfea6d4c36d06c92f2247b46644efdb"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"473023485fe3510af16b8b3c742ab492aacf6617","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    # TODO(geguileo): In O - drop these version fields in post upgrade"},{"line_number":114,"context_line":"    # Version columns to support rolling upgrade."},{"line_number":115,"context_line":"    # Current version is what the service is running now (i.e. minimum)."},{"line_number":116,"context_line":"    # Available version is what the service can support (i.e. max)."},{"line_number":117,"context_line":"    # These fields are only used by services that are still running M, O will"},{"line_number":118,"context_line":"    # report on the service_nodes table."},{"line_number":119,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"ba0121b8_b3989a6b","line":116,"range":{"start_line":115,"start_character":0,"end_line":116,"end_character":67},"in_reply_to":"ba0121b8_390f5d89","updated":"2016-03-31 16:35:59.000000000","message":"Ooooh, one of the rebases must have gotten that back in, because I remember your patch removing them.\n\nI\u0027ll fix it and submit on next rebase.","commit_id":"7c73f5311bfea6d4c36d06c92f2247b46644efdb"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"41adab084a2db3bbe8c7cee44e2758debee33b96","unresolved":false,"context_lines":[{"line_number":121,"context_line":"    # Last heartbeat reported by any of the nodes of this host set.  This is"},{"line_number":122,"context_line":"    # not deferred since we always want to load this field."},{"line_number":123,"context_line":"    last_heartbeat \u003d column_property("},{"line_number":124,"context_line":"        select([func.max(ServiceNode.updated_at)])."},{"line_number":125,"context_line":"        where(and_(ServiceNode.service_id \u003d\u003d id, ~ServiceNode.deleted))."},{"line_number":126,"context_line":"        correlate_except(ServiceNode), deferred\u003dFalse)"},{"line_number":127,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"1a122d0e_2b2bc895","line":124,"updated":"2016-04-25 05:54:32.000000000","message":"Should we consider the beginning time when a service node is just created? That is updated_at is null and only created_at not null.","commit_id":"8ac3e5a00a1fa022c44de0cc395e71723b61a417"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"0e2bb073a825ffefeb25f622c0760d521d2a4e51","unresolved":false,"context_lines":[{"line_number":121,"context_line":"    # Last heartbeat reported by any of the nodes of this host set.  This is"},{"line_number":122,"context_line":"    # not deferred since we always want to load this field."},{"line_number":123,"context_line":"    last_heartbeat \u003d column_property("},{"line_number":124,"context_line":"        select([func.max(ServiceNode.updated_at)])."},{"line_number":125,"context_line":"        where(and_(ServiceNode.service_id \u003d\u003d id, ~ServiceNode.deleted))."},{"line_number":126,"context_line":"        correlate_except(ServiceNode), deferred\u003dFalse)"},{"line_number":127,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"1a122d0e_1e5e0812","line":124,"in_reply_to":"1a122d0e_2b2bc895","updated":"2016-04-25 06:15:26.000000000","message":"Please ignore this comments, and I checked the codes, new created service is updated soon later.","commit_id":"8ac3e5a00a1fa022c44de0cc395e71723b61a417"}],"cinder/tests/unit/test_db_api.py":[{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"41adab084a2db3bbe8c7cee44e2758debee33b96","unresolved":false,"context_lines":[{"line_number":211,"context_line":"        self.assertEqual(now, service.last_heartbeat)"},{"line_number":212,"context_line":"        self._assertEqualListsOfObjects(nodes[service.id], service.nodes)"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"    def test_service_destroy(self):"},{"line_number":215,"context_line":"        service1 \u003d utils.create_service(self.ctxt)"},{"line_number":216,"context_line":"        service2 \u003d utils.create_service(self.ctxt, {\u0027host\u0027: \u0027fake_host2\u0027})"},{"line_number":217,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"1a122d0e_fe134c5a","line":214,"updated":"2016-04-25 05:54:32.000000000","message":"No ServiceHasNodes case is tested.","commit_id":"8ac3e5a00a1fa022c44de0cc395e71723b61a417"}]}
