{"action":"created","comment":{"url":"https://api.github.com/repos/Azure/sonic-swss/pulls/comments/215445799","pull_request_review_id":152713497,"id":215445799,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIxNTQ0NTc5OQ==","diff_hunk":"@@ -9,14 +9,276 @@\n #include \"ipaddress.h\"\n #include \"netmsg.h\"\n #include \"linkcache.h\"\n+#include \"select.h\"\n \n #include \"neighsync.h\"\n+#include \"warm_restart.h\"\n \n using namespace std;\n using namespace swss;\n \n-NeighSync::NeighSync(DBConnector *db) :\n-    m_neighTable(db, APP_NEIGH_TABLE_NAME)\n+const AppRestartAssist::cache_state_map AppRestartAssist::cacheStateMap =\n+{\n+    {STALE,     \"STALE\"},\n+    {SAME,      \"SAME\"},\n+    {NEW,       \"NEW\"},\n+    {DELETE,    \"DELETE\"},\n+    {UNKNOWN,   \"UNKNOWN\"}\n+};\n+\n+AppRestartAssist::AppRestartAssist(RedisPipeline *pipelineAppDB,\n+    const std::string &app_name, const std::string &docker_name,\n+    ProducerStateTable *ps_table, const uint32_t defaultWarmStartTimerValue):\n+    m_appTable(pipelineAppDB, APP_NEIGH_TABLE_NAME, false),\n+    m_appName(app_name),\n+    m_dockerName(docker_name),\n+    m_psTable(ps_table),\n+    warmStartTimer(timespec{0, 0})\n+{\n+    WarmStart::checkWarmStart(m_appName, m_dockerName);\n+\n+    m_appTableName = m_appTable.getTableName();\n+\n+    // set the default timer value\n+    if (defaultWarmStartTimerValue != 0)\n+    {\n+        m_reconcileTimer = defaultWarmStartTimerValue;\n+    }\n+\n+    if (!WarmStart::isWarmStart())\n+    {\n+        m_warmStartInProgress = false;\n+    }\n+    else\n+    {\n+        m_warmStartInProgress = true;\n+        uint32_t temp_value = WarmStart::getWarmStartTimer(m_appName, m_dockerName);\n+        if (temp_value != 0)\n+        {\n+            m_reconcileTimer = temp_value;\n+        }\n+\n+        warmStartTimer.setInterval(timespec{m_reconcileTimer, 0});\n+\n+        // Clear the producerstate table to make sure no pending data for the AppTable\n+        m_psTable->clear();\n+\n+        WarmStart::setWarmStartState(m_appName, WarmStart::INIT);\n+    }\n+}\n+\n+AppRestartAssist::~AppRestartAssist()\n+{\n+}\n+\n+/* join the field-value strings for straight printing */\n+string AppRestartAssist::joinVectorString(const vector<FieldValueTuple> &fv)\n+{\n+    string s;\n+    for (const auto &temps : fv )\n+    {\n+\t   s += temps.first + \":\" + temps.second + \", \";\n+    }\n+    return s;\n+}\n+\n+void AppRestartAssist::setCacheEntryState(std::vector<FieldValueTuple> &fvVector,\n+    cache_state_t state)\n+{\n+    fvVector.back().second = cacheStateMap.at(state);\n+}\n+\n+AppRestartAssist::cache_state_t AppRestartAssist::getCacheEntryState(const std::vector<FieldValueTuple> &fvVector)\n+{\n+    for (auto &iter : cacheStateMap)\n+    {\n+        if (fvVector.back().second == iter.second)\n+        {\n+            return iter.first;\n+        }\n+    }\n+    throw std::logic_error(\"cache entry state is invalid\");\n+    return UNKNOWN;\n+}\n+\n+/* Read table from APPDB and append stale flag then insert to cachemap */\n+void AppRestartAssist::readTableToMap()\n+{\n+    vector<string> keys;\n+\n+    m_appTable.getKeys(keys);\n+    FieldValueTuple state(CACHE_STATE_FIELD, \"\");\n+\n+    for (const auto &key: keys)\n+    {\n+        vector<FieldValueTuple> fv;\n+\n+\t    /* if the fieldvalue is empty, skip */\n+        if (!m_appTable.get(key, fv))\n+        {\n+            continue;\n+        }\n+\n+        fv.push_back(state);\n+        setCacheEntryState(fv, STALE);\n+\n+        string s = \"\";\n+        s = joinVectorString(fv);\n+\n+        SWSS_LOG_INFO(\"write to cachemap: %s, key: %s, \"\n+               \"%s\", m_appTableName.c_str(), key.c_str(), s.c_str());","path":"neighsyncd/neighsync.cpp","position":123,"original_position":123,"commit_id":"98df73b80f147fb3c632b908252b49c9539e123e","original_commit_id":"98df73b80f147fb3c632b908252b49c9539e123e","user":{"login":"jipanyang","id":29779499,"node_id":"MDQ6VXNlcjI5Nzc5NDk5","avatar_url":"https://avatars3.githubusercontent.com/u/29779499?v=4","gravatar_id":"","url":"https://api.github.com/users/jipanyang","html_url":"https://github.com/jipanyang","followers_url":"https://api.github.com/users/jipanyang/followers","following_url":"https://api.github.com/users/jipanyang/following{/other_user}","gists_url":"https://api.github.com/users/jipanyang/gists{/gist_id}","starred_url":"https://api.github.com/users/jipanyang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jipanyang/subscriptions","organizations_url":"https://api.github.com/users/jipanyang/orgs","repos_url":"https://api.github.com/users/jipanyang/repos","events_url":"https://api.github.com/users/jipanyang/events{/privacy}","received_events_url":"https://api.github.com/users/jipanyang/received_events","type":"User","site_admin":false},"body":"s = joinVectorString(fv); is used for LOG_INFO only.\r\ns._c_str() could be replaced with joinVectorString(fv).c_str(),   ","created_at":"2018-09-05T22:31:38Z","updated_at":"2018-09-05T22:38:17Z","html_url":"https://github.com/Azure/sonic-swss/pull/599#discussion_r215445799","pull_request_url":"https://api.github.com/repos/Azure/sonic-swss/pulls/599","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/Azure/sonic-swss/pulls/comments/215445799"},"html":{"href":"https://github.com/Azure/sonic-swss/pull/599#discussion_r215445799"},"pull_request":{"href":"https://api.github.com/repos/Azure/sonic-swss/pulls/599"}}},"pull_request":{"url":"https://api.github.com/repos/Azure/sonic-swss/pulls/599","id":210939308,"node_id":"MDExOlB1bGxSZXF1ZXN0MjEwOTM5MzA4","html_url":"https://github.com/Azure/sonic-swss/pull/599","diff_url":"https://github.com/Azure/sonic-swss/pull/599.diff","patch_url":"https://github.com/Azure/sonic-swss/pull/599.patch","issue_url":"https://api.github.com/repos/Azure/sonic-swss/issues/599","number":599,"state":"open","locked":false,"title":"Support warm-restart for neighsyncd","user":{"login":"zhenggen-xu","id":17014390,"node_id":"MDQ6VXNlcjE3MDE0Mzkw","avatar_url":"https://avatars0.githubusercontent.com/u/17014390?v=4","gravatar_id":"","url":"https://api.github.com/users/zhenggen-xu","html_url":"https://github.com/zhenggen-xu","followers_url":"https://api.github.com/users/zhenggen-xu/followers","following_url":"https://api.github.com/users/zhenggen-xu/following{/other_user}","gists_url":"https://api.github.com/users/zhenggen-xu/gists{/gist_id}","starred_url":"https://api.github.com/users/zhenggen-xu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zhenggen-xu/subscriptions","organizations_url":"https://api.github.com/users/zhenggen-xu/orgs","repos_url":"https://api.github.com/users/zhenggen-xu/repos","events_url":"https://api.github.com/users/zhenggen-xu/events{/privacy}","received_events_url":"https://api.github.com/users/zhenggen-xu/received_events","type":"User","site_admin":false},"body":"- No function changes if warm-restart is disabled.\r\n\r\nIn case warm-restart is enabled, below is done in the process to make sure the ARP/NDP is up-to-date:\r\n- ARP/NDP will be restored from App-DB marked with stale.\r\n- new/changed ARP/DNP during the warm-restart marked as new\r\n- deleted ARP/NDP during the warm-restart marked as delete\r\n- same ARP/NDP entries marked as same\r\n- reconciliation is done after timer-out of a timer\r\n- delta (including stale, new, delete) during the warm-restart would be pushed to App-DB and then to HW.\r\n\r\nAdd vs test cases to cover:\r\n- No changes during the warm-restart\r\n- ADD/DELETE/CHANGE/SAME neighbors during the warm-restart\r\n- verify the timer changes taking effect for neighsyncd\r\n\r\n<!--\r\nPlease make sure you have read and understood the contribution guildlines:\r\nhttps://github.com/Azure/SONiC/blob/gh-pages/CONTRIBUTING.md\r\n\r\n1. Make sure your commit includes a signature generted with `git commit -s`\r\n2. Make sure your commit title follows the correct format: [component]: description\r\n3. Make sure your commit message contains enough details about the change and related tests\r\n4. Make sure your pull request adds related reviewers, asignees, labels\r\n\r\nPlease also provide the following information in this pull request:\r\n-->\r\n\r\n**What I did**\r\nAdd support for warm-restart for neighbor table\r\n\r\n**Why I did it**\r\nTo fully support warm-restart for SWSS and make sure neighbor table (ARP/NDP) are reconciled after warm-restart.\r\n\r\n**How I verified it**\r\nvs test cases and HW tests.\r\n\r\nsudo pytest -v --dvsname=vs test_warm_reboot.py                                                                                                 \r\n============================================================================================== test session starts ==============================================================================================\r\nplatform linux2 -- Python 2.7.12, pytest-3.3.0, py-1.5.4, pluggy-0.6.0 -- /usr/bin/python\r\ncachedir: .cache\r\n\r\nrootdir: ~/SONIC/sonic-buildimage/src/sonic-swss/tests, inifile:\r\ncollected 3 items                                                                                                                                                                                               \r\n\r\ntest_warm_reboot.py::test_PortSyncdWarmRestart PASSED                                                                                                                                                     [ 33%]\r\ntest_warm_reboot.py::test_VlanMgrdWarmRestart PASSED                                                                                                                                                      [ 66%]\r\ntest_warm_reboot.py::test_swss_neighbor_syncup PASSED           \r\n\r\n**Details if related**\r\n","created_at":"2018-08-26T07:47:44Z","updated_at":"2018-09-05T22:38:17Z","closed_at":null,"merged_at":null,"merge_commit_sha":"906e520314a7c8a4ec814a7030f1a6cf7e8e8ea5","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":338891657,"node_id":"MDU6TGFiZWwzMzg4OTE2NTc=","url":"https://api.github.com/repos/Azure/sonic-swss/labels/enhancement","name":"enhancement","color":"84b6eb","default":true}],"milestone":null,"commits_url":"https://api.github.com/repos/Azure/sonic-swss/pulls/599/commits","review_comments_url":"https://api.github.com/repos/Azure/sonic-swss/pulls/599/comments","review_comment_url":"https://api.github.com/repos/Azure/sonic-swss/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Azure/sonic-swss/issues/599/comments","statuses_url":"https://api.github.com/repos/Azure/sonic-swss/statuses/98df73b80f147fb3c632b908252b49c9539e123e","head":{"label":"zhenggen-xu:neighborsync-merge","ref":"neighborsync-merge","sha":"98df73b80f147fb3c632b908252b49c9539e123e","user":{"login":"zhenggen-xu","id":17014390,"node_id":"MDQ6VXNlcjE3MDE0Mzkw","avatar_url":"https://avatars0.githubusercontent.com/u/17014390?v=4","gravatar_id":"","url":"https://api.github.com/users/zhenggen-xu","html_url":"https://github.com/zhenggen-xu","followers_url":"https://api.github.com/users/zhenggen-xu/followers","following_url":"https://api.github.com/users/zhenggen-xu/following{/other_user}","gists_url":"https://api.github.com/users/zhenggen-xu/gists{/gist_id}","starred_url":"https://api.github.com/users/zhenggen-xu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zhenggen-xu/subscriptions","organizations_url":"https://api.github.com/users/zhenggen-xu/orgs","repos_url":"https://api.github.com/users/zhenggen-xu/repos","events_url":"https://api.github.com/users/zhenggen-xu/events{/privacy}","received_events_url":"https://api.github.com/users/zhenggen-xu/received_events","type":"User","site_admin":false},"repo":{"id":98849176,"node_id":"MDEwOlJlcG9zaXRvcnk5ODg0OTE3Ng==","name":"sonic-swss","full_name":"zhenggen-xu/sonic-swss","owner":{"login":"zhenggen-xu","id":17014390,"node_id":"MDQ6VXNlcjE3MDE0Mzkw","avatar_url":"https://avatars0.githubusercontent.com/u/17014390?v=4","gravatar_id":"","url":"https://api.github.com/users/zhenggen-xu","html_url":"https://github.com/zhenggen-xu","followers_url":"https://api.github.com/users/zhenggen-xu/followers","following_url":"https://api.github.com/users/zhenggen-xu/following{/other_user}","gists_url":"https://api.github.com/users/zhenggen-xu/gists{/gist_id}","starred_url":"https://api.github.com/users/zhenggen-xu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zhenggen-xu/subscriptions","organizations_url":"https://api.github.com/users/zhenggen-xu/orgs","repos_url":"https://api.github.com/users/zhenggen-xu/repos","events_url":"https://api.github.com/users/zhenggen-xu/events{/privacy}","received_events_url":"https://api.github.com/users/zhenggen-xu/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/zhenggen-xu/sonic-swss","description":"SONiC Switch State Service (SwSS)","fork":true,"url":"https://api.github.com/repos/zhenggen-xu/sonic-swss","forks_url":"https://api.github.com/repos/zhenggen-xu/sonic-swss/forks","keys_url":"https://api.github.com/repos/zhenggen-xu/sonic-swss/keys{/key_id}","collaborators_url":"https://api.github.com/repos/zhenggen-xu/sonic-swss/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/zhenggen-xu/sonic-swss/teams","hooks_url":"https://api.github.com/repos/zhenggen-xu/sonic-swss/hooks","issue_events_url":"https://api.github.com/repos/zhenggen-xu/sonic-swss/issues/events{/number}","events_url":"https://api.github.com/repos/zhenggen-xu/sonic-swss/events","assignees_url":"https://api.github.com/repos/zhenggen-xu/sonic-swss/assignees{/user}","branches_url":"https://api.github.com/repos/zhenggen-xu/sonic-swss/branches{/branch}","tags_url":"https://api.github.com/repos/zhenggen-xu/sonic-swss/tags","blobs_url":"https://api.github.com/repos/zhenggen-xu/sonic-swss/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/zhenggen-xu/sonic-swss/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/zhenggen-xu/sonic-swss/git/refs{/sha}","trees_url":"https://api.github.com/repos/zhenggen-xu/sonic-swss/git/trees{/sha}","statuses_url":"https://api.github.com/repos/zhenggen-xu/sonic-swss/statuses/{sha}","languages_url":"https://api.github.com/repos/zhenggen-xu/sonic-swss/languages","stargazers_url":"https://api.github.com/repos/zhenggen-xu/sonic-swss/stargazers","contributors_url":"https://api.github.com/repos/zhenggen-xu/sonic-swss/contributors","subscribers_url":"https://api.github.com/repos/zhenggen-xu/sonic-swss/subscribers","subscription_url":"https://api.github.com/repos/zhenggen-xu/sonic-swss/subscription","commits_url":"https://api.github.com/repos/zhenggen-xu/sonic-swss/commits{/sha}","git_commits_url":"https://api.github.com/repos/zhenggen-xu/sonic-swss/git/commits{/sha}","comments_url":"https://api.github.com/repos/zhenggen-xu/sonic-swss/comments{/number}","issue_comment_url":"https://api.github.com/repos/zhenggen-xu/sonic-swss/issues/comments{/number}","contents_url":"https://api.github.com/repos/zhenggen-xu/sonic-swss/contents/{+path}","compare_url":"https://api.github.com/repos/zhenggen-xu/sonic-swss/compare/{base}...{head}","merges_url":"https://api.github.com/repos/zhenggen-xu/sonic-swss/merges","archive_url":"https://api.github.com/repos/zhenggen-xu/sonic-swss/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/zhenggen-xu/sonic-swss/downloads","issues_url":"https://api.github.com/repos/zhenggen-xu/sonic-swss/issues{/number}","pulls_url":"https://api.github.com/repos/zhenggen-xu/sonic-swss/pulls{/number}","milestones_url":"https://api.github.com/repos/zhenggen-xu/sonic-swss/milestones{/number}","notifications_url":"https://api.github.com/repos/zhenggen-xu/sonic-swss/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/zhenggen-xu/sonic-swss/labels{/name}","releases_url":"https://api.github.com/repos/zhenggen-xu/sonic-swss/releases{/id}","deployments_url":"https://api.github.com/repos/zhenggen-xu/sonic-swss/deployments","created_at":"2017-07-31T04:50:09Z","updated_at":"2018-08-21T06:01:33Z","pushed_at":"2018-09-05T22:11:21Z","git_url":"git://github.com/zhenggen-xu/sonic-swss.git","ssh_url":"git@github.com:zhenggen-xu/sonic-swss.git","clone_url":"https://github.com/zhenggen-xu/sonic-swss.git","svn_url":"https://github.com/zhenggen-xu/sonic-swss","homepage":"https://azure.github.io/SONiC","size":1917,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":1,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"Azure:master","ref":"master","sha":"e2e35e39c196fe30bf1e3dd281547d91455cfb7a","user":{"login":"Azure","id":6844498,"node_id":"MDEyOk9yZ2FuaXphdGlvbjY4NDQ0OTg=","avatar_url":"https://avatars0.githubusercontent.com/u/6844498?v=4","gravatar_id":"","url":"https://api.github.com/users/Azure","html_url":"https://github.com/Azure","followers_url":"https://api.github.com/users/Azure/followers","following_url":"https://api.github.com/users/Azure/following{/other_user}","gists_url":"https://api.github.com/users/Azure/gists{/gist_id}","starred_url":"https://api.github.com/users/Azure/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Azure/subscriptions","organizations_url":"https://api.github.com/users/Azure/orgs","repos_url":"https://api.github.com/users/Azure/repos","events_url":"https://api.github.com/users/Azure/events{/privacy}","received_events_url":"https://api.github.com/users/Azure/received_events","type":"Organization","site_admin":false},"repo":{"id":53515475,"node_id":"MDEwOlJlcG9zaXRvcnk1MzUxNTQ3NQ==","name":"sonic-swss","full_name":"Azure/sonic-swss","owner":{"login":"Azure","id":6844498,"node_id":"MDEyOk9yZ2FuaXphdGlvbjY4NDQ0OTg=","avatar_url":"https://avatars0.githubusercontent.com/u/6844498?v=4","gravatar_id":"","url":"https://api.github.com/users/Azure","html_url":"https://github.com/Azure","followers_url":"https://api.github.com/users/Azure/followers","following_url":"https://api.github.com/users/Azure/following{/other_user}","gists_url":"https://api.github.com/users/Azure/gists{/gist_id}","starred_url":"https://api.github.com/users/Azure/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Azure/subscriptions","organizations_url":"https://api.github.com/users/Azure/orgs","repos_url":"https://api.github.com/users/Azure/repos","events_url":"https://api.github.com/users/Azure/events{/privacy}","received_events_url":"https://api.github.com/users/Azure/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Azure/sonic-swss","description":"SONiC Switch State Service (SwSS)","fork":false,"url":"https://api.github.com/repos/Azure/sonic-swss","forks_url":"https://api.github.com/repos/Azure/sonic-swss/forks","keys_url":"https://api.github.com/repos/Azure/sonic-swss/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Azure/sonic-swss/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Azure/sonic-swss/teams","hooks_url":"https://api.github.com/repos/Azure/sonic-swss/hooks","issue_events_url":"https://api.github.com/repos/Azure/sonic-swss/issues/events{/number}","events_url":"https://api.github.com/repos/Azure/sonic-swss/events","assignees_url":"https://api.github.com/repos/Azure/sonic-swss/assignees{/user}","branches_url":"https://api.github.com/repos/Azure/sonic-swss/branches{/branch}","tags_url":"https://api.github.com/repos/Azure/sonic-swss/tags","blobs_url":"https://api.github.com/repos/Azure/sonic-swss/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Azure/sonic-swss/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Azure/sonic-swss/git/refs{/sha}","trees_url":"https://api.github.com/repos/Azure/sonic-swss/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Azure/sonic-swss/statuses/{sha}","languages_url":"https://api.github.com/repos/Azure/sonic-swss/languages","stargazers_url":"https://api.github.com/repos/Azure/sonic-swss/stargazers","contributors_url":"https://api.github.com/repos/Azure/sonic-swss/contributors","subscribers_url":"https://api.github.com/repos/Azure/sonic-swss/subscribers","subscription_url":"https://api.github.com/repos/Azure/sonic-swss/subscription","commits_url":"https://api.github.com/repos/Azure/sonic-swss/commits{/sha}","git_commits_url":"https://api.github.com/repos/Azure/sonic-swss/git/commits{/sha}","comments_url":"https://api.github.com/repos/Azure/sonic-swss/comments{/number}","issue_comment_url":"https://api.github.com/repos/Azure/sonic-swss/issues/comments{/number}","contents_url":"https://api.github.com/repos/Azure/sonic-swss/contents/{+path}","compare_url":"https://api.github.com/repos/Azure/sonic-swss/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Azure/sonic-swss/merges","archive_url":"https://api.github.com/repos/Azure/sonic-swss/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Azure/sonic-swss/downloads","issues_url":"https://api.github.com/repos/Azure/sonic-swss/issues{/number}","pulls_url":"https://api.github.com/repos/Azure/sonic-swss/pulls{/number}","milestones_url":"https://api.github.com/repos/Azure/sonic-swss/milestones{/number}","notifications_url":"https://api.github.com/repos/Azure/sonic-swss/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Azure/sonic-swss/labels{/name}","releases_url":"https://api.github.com/repos/Azure/sonic-swss/releases{/id}","deployments_url":"https://api.github.com/repos/Azure/sonic-swss/deployments","created_at":"2016-03-09T17:01:09Z","updated_at":"2018-09-05T22:28:03Z","pushed_at":"2018-09-05T22:27:58Z","git_url":"git://github.com/Azure/sonic-swss.git","ssh_url":"git@github.com:Azure/sonic-swss.git","clone_url":"https://github.com/Azure/sonic-swss.git","svn_url":"https://github.com/Azure/sonic-swss","homepage":"https://azure.github.io/SONiC","size":1845,"stargazers_count":35,"watchers_count":35,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":67,"mirror_url":null,"archived":false,"open_issues_count":61,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":67,"open_issues":61,"watchers":35,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Azure/sonic-swss/pulls/599"},"html":{"href":"https://github.com/Azure/sonic-swss/pull/599"},"issue":{"href":"https://api.github.com/repos/Azure/sonic-swss/issues/599"},"comments":{"href":"https://api.github.com/repos/Azure/sonic-swss/issues/599/comments"},"review_comments":{"href":"https://api.github.com/repos/Azure/sonic-swss/pulls/599/comments"},"review_comment":{"href":"https://api.github.com/repos/Azure/sonic-swss/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Azure/sonic-swss/pulls/599/commits"},"statuses":{"href":"https://api.github.com/repos/Azure/sonic-swss/statuses/98df73b80f147fb3c632b908252b49c9539e123e"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"jipanyang"}}