{"action":"created","issue":{"url":"https://api.github.com/repos/hyperledger/fabric/issues/1941","repository_url":"https://api.github.com/repos/hyperledger/fabric","labels_url":"https://api.github.com/repos/hyperledger/fabric/issues/1941/labels{/name}","comments_url":"https://api.github.com/repos/hyperledger/fabric/issues/1941/comments","events_url":"https://api.github.com/repos/hyperledger/fabric/issues/1941/events","html_url":"https://github.com/hyperledger/fabric/pull/1941","id":161526022,"number":1941,"title":"Deduplicate requests based on last execution time","user":{"login":"jyellick","id":7431583,"avatar_url":"https://avatars.githubusercontent.com/u/7431583?v=3","gravatar_id":"","url":"https://api.github.com/users/jyellick","html_url":"https://github.com/jyellick","followers_url":"https://api.github.com/users/jyellick/followers","following_url":"https://api.github.com/users/jyellick/following{/other_user}","gists_url":"https://api.github.com/users/jyellick/gists{/gist_id}","starred_url":"https://api.github.com/users/jyellick/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jyellick/subscriptions","organizations_url":"https://api.github.com/users/jyellick/orgs","repos_url":"https://api.github.com/users/jyellick/repos","events_url":"https://api.github.com/users/jyellick/events{/privacy}","received_events_url":"https://api.github.com/users/jyellick/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"milestone":null,"comments":3,"created_at":"2016-06-21T20:00:59Z","updated_at":"2016-06-21T20:38:16Z","closed_at":null,"pull_request":{"url":"https://api.github.com/repos/hyperledger/fabric/pulls/1941","html_url":"https://github.com/hyperledger/fabric/pull/1941","diff_url":"https://github.com/hyperledger/fabric/pull/1941.diff","patch_url":"https://github.com/hyperledger/fabric/pull/1941.patch"},"body":"## Description\r\nThis changeset adds back in a portion of the deduplication logic which was removed.  Specifically, it will cause a replica to ignore any requests from a peer which are timestamped prior to the timestamp of the most recently executed request from that peer.\r\n\r\nNote, there is only one new commit here, but it is built upon some other outstanding PRs.\r\n\r\n## Motivation and Context\r\nThis is a stopgap measure, designed to fix #1931 until a more permanent solution can be found.\r\n\r\nThe problem is that deduplicating in this manner allows request censorship by the primary.  A malicious primary may choose to execute a later request from a replica to effectively censor the request from before it.  This problem is solved in the paper by having only one outstanding request per client (and consequently, no second later request can be executed).  This is not practical for the fabric, as VPs are clients.  A better solution is being actively pursued.\r\n\r\nI'm unsure whether we wish to include this in the 0.5 release or not.  Maybe @corecode @kchristidis @bcbrock @tuand27613 could weigh in quickly with their opinions.\r\n\r\n## How Has This Been Tested?\r\nThis has been tested against the busywork stress2b test.  CI will cover additionally.\r\n\r\n## Checklist:\r\n<!-- To check a box, and an 'x': [x] -->\r\n<!-- To uncheck box, add a space: [ ] -->\r\n<!-- If you're unsure about any of these, don't hesitate to ask. We're here to help! -->\r\n- [X] I have added a [Signed-off-by](https://github.com/hyperledger/fabric/blob/master/CONTRIBUTING.md#legal-stuff).\r\n- [X] I have either added documentation to cover my changes or this change requires no new documentation.\r\n- [X] I have either added unit tests to cover my changes or this change requires no new tests.\r\n- [X] I have run [golint](https://github.com/golang/lint) and have fixed valid warnings in code I have added or modified. This tool generates false positives so you may choose to ignore some warnings. The goal is clean, consistent, and readable code.\r\n\r\nThe continuous integration build process will run [make checks](https://github.com/hyperledger/fabric/blob/master/Makefile#L22) to confirm that tests pass and that code quality meets minimum standards. You may optionally run this locally as PRs will not be accepted until they pass.\r\n\r\nSigned-off-by: Jason Yellick <jyellick@us.ibm.com>"},"comment":{"url":"https://api.github.com/repos/hyperledger/fabric/issues/comments/227564205","html_url":"https://github.com/hyperledger/fabric/pull/1941#issuecomment-227564205","issue_url":"https://api.github.com/repos/hyperledger/fabric/issues/1941","id":227564205,"user":{"login":"jyellick","id":7431583,"avatar_url":"https://avatars.githubusercontent.com/u/7431583?v=3","gravatar_id":"","url":"https://api.github.com/users/jyellick","html_url":"https://github.com/jyellick","followers_url":"https://api.github.com/users/jyellick/followers","following_url":"https://api.github.com/users/jyellick/following{/other_user}","gists_url":"https://api.github.com/users/jyellick/gists{/gist_id}","starred_url":"https://api.github.com/users/jyellick/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jyellick/subscriptions","organizations_url":"https://api.github.com/users/jyellick/orgs","repos_url":"https://api.github.com/users/jyellick/repos","events_url":"https://api.github.com/users/jyellick/events{/privacy}","received_events_url":"https://api.github.com/users/jyellick/received_events","type":"User","site_admin":false},"created_at":"2016-06-21T20:38:16Z","updated_at":"2016-06-21T20:38:16Z","body":"@bcbrock I'm inclined to agree, censorship is a byzantine behavior we should prevent, but duplicating in a non-byzantine case is a problem."}}
{"actor":{"display_login":"jyellick"}}