{"action":"created","comment":{"url":"https://api.github.com/repos/apache/beam/pulls/comments/151193909","pull_request_review_id":76862446,"id":151193909,"diff_hunk":"@@ -568,6 +568,29 @@ public Duration getAllowedTimestampSkew() {\n   public @interface ProcessElement {}\n \n   /**\n+   * <b><i>Experimental - no backwards compatibility guarantees. The exact name or usage of this\n+   * feature may change.</i></b>\n+   *\n+   * <p>Annotation that may be added to a {@link ProcessElement} or {@link OnTimer} method to\n+   * indicate that the observable contents of the input {@link PCollection} or mutable state must be\n+   * stable upon retries.\n+   *\n+   * <p>This is important for exactly-once semantics when writing to a storage medium outside of\n+   * your pipeline. The general pattern is to establish an idempotent protocol for writing the data,\n+   * and then require stable input. Combined, these allow the write to be freely retried until\n+   * success.\n+   *\n+   * <p>An example of an unstable input would be anything computed using nondeterministic logic. In\n+   * Beam, any user-defined function is permitted to be nondeterministic, and any {@link\n+   * PCollection} is permitted to be recomputed in any manner.\n+   */\n+  @Documented\n+  @Experimental\n+  @Retention(RetentionPolicy.RUNTIME)\n+  @Target(ElementType.METHOD)\n+  public @interface RequiresStableInput {}","path":"sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/DoFn.java","position":24,"original_position":24,"commit_id":"9713b1d63a395db9893ab9447d9cc81a6ff239aa","original_commit_id":"9713b1d63a395db9893ab9447d9cc81a6ff239aa","user":{"login":"swegner","id":674021,"avatar_url":"https://avatars0.githubusercontent.com/u/674021?v=4","gravatar_id":"","url":"https://api.github.com/users/swegner","html_url":"https://github.com/swegner","followers_url":"https://api.github.com/users/swegner/followers","following_url":"https://api.github.com/users/swegner/following{/other_user}","gists_url":"https://api.github.com/users/swegner/gists{/gist_id}","starred_url":"https://api.github.com/users/swegner/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/swegner/subscriptions","organizations_url":"https://api.github.com/users/swegner/orgs","repos_url":"https://api.github.com/users/swegner/repos","events_url":"https://api.github.com/users/swegner/events{/privacy}","received_events_url":"https://api.github.com/users/swegner/received_events","type":"User","site_admin":false},"body":"The naming '`RequiresStableInput`' makes it sound like the consumer must ensure stable input. But my understanding is that this requirement is pushed onto runners to ensure stability via checkpointing, correct?\r\n\r\nIf there's some mechanism for transform authors to `@CreateStableInput`/`@PreserveStableInput`, it should be noted here. Otherwise consider adding a comment that this requirement is targeted towards runners.","created_at":"2017-11-15T17:17:59Z","updated_at":"2017-11-15T17:24:40Z","html_url":"https://github.com/apache/beam/pull/4135#discussion_r151193909","pull_request_url":"https://api.github.com/repos/apache/beam/pulls/4135","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/apache/beam/pulls/comments/151193909"},"html":{"href":"https://github.com/apache/beam/pull/4135#discussion_r151193909"},"pull_request":{"href":"https://api.github.com/repos/apache/beam/pulls/4135"}}},"pull_request":{"url":"https://api.github.com/repos/apache/beam/pulls/4135","id":152769031,"html_url":"https://github.com/apache/beam/pull/4135","diff_url":"https://github.com/apache/beam/pull/4135.diff","patch_url":"https://github.com/apache/beam/pull/4135.patch","issue_url":"https://api.github.com/repos/apache/beam/issues/4135","number":4135,"state":"open","locked":false,"title":"[BEAM-3194] Add @RequiresStableInput annotation","user":{"login":"kennknowles","id":575353,"avatar_url":"https://avatars0.githubusercontent.com/u/575353?v=4","gravatar_id":"","url":"https://api.github.com/users/kennknowles","html_url":"https://github.com/kennknowles","followers_url":"https://api.github.com/users/kennknowles/followers","following_url":"https://api.github.com/users/kennknowles/following{/other_user}","gists_url":"https://api.github.com/users/kennknowles/gists{/gist_id}","starred_url":"https://api.github.com/users/kennknowles/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kennknowles/subscriptions","organizations_url":"https://api.github.com/users/kennknowles/orgs","repos_url":"https://api.github.com/users/kennknowles/repos","events_url":"https://api.github.com/users/kennknowles/events{/privacy}","received_events_url":"https://api.github.com/users/kennknowles/received_events","type":"User","site_admin":false},"body":"Follow this checklist to help us incorporate your contribution quickly and easily:\r\n\r\n - [ ] Make sure there is a [JIRA issue](https://issues.apache.org/jira/projects/BEAM/issues/) filed for the change (usually before you start working on it).  Trivial changes like typos do not require a JIRA issue.  Your pull request should address just this issue, without pulling in other changes.\r\n - [ ] Each commit in the pull request should have a meaningful subject line and body.\r\n - [ ] Format the pull request title like `[BEAM-XXX] Fixes bug in ApproximateQuantiles`, where you replace `BEAM-XXX` with the appropriate JIRA issue.\r\n - [ ] Write a pull request description that is detailed enough to understand what the pull request does, how, and why.\r\n - [ ] Run `mvn clean verify` to make sure basic checks pass. A more thorough check will be performed on your pull request automatically.\r\n - [ ] If this contribution is large, please file an Apache [Individual Contributor License Agreement](https://www.apache.org/licenses/icla.pdf).\r\n\r\n---\r\n\r\nThis is a quick mock up of the very basics of the Java infrastructure for this annotation. I did not plug in the annotation to any runner. We can bikeshed on the name.","created_at":"2017-11-15T13:04:05Z","updated_at":"2017-11-15T17:24:41Z","closed_at":null,"merged_at":null,"merge_commit_sha":"815ccc1f1570c5dbef435721f8dfad06164a5db1","assignee":null,"assignees":[],"requested_reviewers":[],"milestone":null,"commits_url":"https://api.github.com/repos/apache/beam/pulls/4135/commits","review_comments_url":"https://api.github.com/repos/apache/beam/pulls/4135/comments","review_comment_url":"https://api.github.com/repos/apache/beam/pulls/comments{/number}","comments_url":"https://api.github.com/repos/apache/beam/issues/4135/comments","statuses_url":"https://api.github.com/repos/apache/beam/statuses/9713b1d63a395db9893ab9447d9cc81a6ff239aa","head":{"label":"kennknowles:RequiresStableInput","ref":"RequiresStableInput","sha":"9713b1d63a395db9893ab9447d9cc81a6ff239aa","user":{"login":"kennknowles","id":575353,"avatar_url":"https://avatars0.githubusercontent.com/u/575353?v=4","gravatar_id":"","url":"https://api.github.com/users/kennknowles","html_url":"https://github.com/kennknowles","followers_url":"https://api.github.com/users/kennknowles/followers","following_url":"https://api.github.com/users/kennknowles/following{/other_user}","gists_url":"https://api.github.com/users/kennknowles/gists{/gist_id}","starred_url":"https://api.github.com/users/kennknowles/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kennknowles/subscriptions","organizations_url":"https://api.github.com/users/kennknowles/orgs","repos_url":"https://api.github.com/users/kennknowles/repos","events_url":"https://api.github.com/users/kennknowles/events{/privacy}","received_events_url":"https://api.github.com/users/kennknowles/received_events","type":"User","site_admin":false},"repo":{"id":52646147,"name":"beam","full_name":"kennknowles/beam","owner":{"login":"kennknowles","id":575353,"avatar_url":"https://avatars0.githubusercontent.com/u/575353?v=4","gravatar_id":"","url":"https://api.github.com/users/kennknowles","html_url":"https://github.com/kennknowles","followers_url":"https://api.github.com/users/kennknowles/followers","following_url":"https://api.github.com/users/kennknowles/following{/other_user}","gists_url":"https://api.github.com/users/kennknowles/gists{/gist_id}","starred_url":"https://api.github.com/users/kennknowles/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kennknowles/subscriptions","organizations_url":"https://api.github.com/users/kennknowles/orgs","repos_url":"https://api.github.com/users/kennknowles/repos","events_url":"https://api.github.com/users/kennknowles/events{/privacy}","received_events_url":"https://api.github.com/users/kennknowles/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/kennknowles/beam","description":"Mirror of Apache Beam (Incubating)","fork":true,"url":"https://api.github.com/repos/kennknowles/beam","forks_url":"https://api.github.com/repos/kennknowles/beam/forks","keys_url":"https://api.github.com/repos/kennknowles/beam/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kennknowles/beam/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kennknowles/beam/teams","hooks_url":"https://api.github.com/repos/kennknowles/beam/hooks","issue_events_url":"https://api.github.com/repos/kennknowles/beam/issues/events{/number}","events_url":"https://api.github.com/repos/kennknowles/beam/events","assignees_url":"https://api.github.com/repos/kennknowles/beam/assignees{/user}","branches_url":"https://api.github.com/repos/kennknowles/beam/branches{/branch}","tags_url":"https://api.github.com/repos/kennknowles/beam/tags","blobs_url":"https://api.github.com/repos/kennknowles/beam/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kennknowles/beam/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kennknowles/beam/git/refs{/sha}","trees_url":"https://api.github.com/repos/kennknowles/beam/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kennknowles/beam/statuses/{sha}","languages_url":"https://api.github.com/repos/kennknowles/beam/languages","stargazers_url":"https://api.github.com/repos/kennknowles/beam/stargazers","contributors_url":"https://api.github.com/repos/kennknowles/beam/contributors","subscribers_url":"https://api.github.com/repos/kennknowles/beam/subscribers","subscription_url":"https://api.github.com/repos/kennknowles/beam/subscription","commits_url":"https://api.github.com/repos/kennknowles/beam/commits{/sha}","git_commits_url":"https://api.github.com/repos/kennknowles/beam/git/commits{/sha}","comments_url":"https://api.github.com/repos/kennknowles/beam/comments{/number}","issue_comment_url":"https://api.github.com/repos/kennknowles/beam/issues/comments{/number}","contents_url":"https://api.github.com/repos/kennknowles/beam/contents/{+path}","compare_url":"https://api.github.com/repos/kennknowles/beam/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kennknowles/beam/merges","archive_url":"https://api.github.com/repos/kennknowles/beam/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kennknowles/beam/downloads","issues_url":"https://api.github.com/repos/kennknowles/beam/issues{/number}","pulls_url":"https://api.github.com/repos/kennknowles/beam/pulls{/number}","milestones_url":"https://api.github.com/repos/kennknowles/beam/milestones{/number}","notifications_url":"https://api.github.com/repos/kennknowles/beam/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kennknowles/beam/labels{/name}","releases_url":"https://api.github.com/repos/kennknowles/beam/releases{/id}","deployments_url":"https://api.github.com/repos/kennknowles/beam/deployments","created_at":"2016-02-27T02:37:09Z","updated_at":"2017-01-03T20:56:46Z","pushed_at":"2017-11-15T13:10:23Z","git_url":"git://github.com/kennknowles/beam.git","ssh_url":"git@github.com:kennknowles/beam.git","clone_url":"https://github.com/kennknowles/beam.git","svn_url":"https://github.com/kennknowles/beam","homepage":null,"size":44397,"stargazers_count":0,"watchers_count":0,"language":"Java","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":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"apache:master","ref":"master","sha":"7ce0a82b06c29247713c009d32b53fe53fd7ec6d","user":{"login":"apache","id":47359,"avatar_url":"https://avatars0.githubusercontent.com/u/47359?v=4","gravatar_id":"","url":"https://api.github.com/users/apache","html_url":"https://github.com/apache","followers_url":"https://api.github.com/users/apache/followers","following_url":"https://api.github.com/users/apache/following{/other_user}","gists_url":"https://api.github.com/users/apache/gists{/gist_id}","starred_url":"https://api.github.com/users/apache/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache/subscriptions","organizations_url":"https://api.github.com/users/apache/orgs","repos_url":"https://api.github.com/users/apache/repos","events_url":"https://api.github.com/users/apache/events{/privacy}","received_events_url":"https://api.github.com/users/apache/received_events","type":"Organization","site_admin":false},"repo":{"id":50904245,"name":"beam","full_name":"apache/beam","owner":{"login":"apache","id":47359,"avatar_url":"https://avatars0.githubusercontent.com/u/47359?v=4","gravatar_id":"","url":"https://api.github.com/users/apache","html_url":"https://github.com/apache","followers_url":"https://api.github.com/users/apache/followers","following_url":"https://api.github.com/users/apache/following{/other_user}","gists_url":"https://api.github.com/users/apache/gists{/gist_id}","starred_url":"https://api.github.com/users/apache/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache/subscriptions","organizations_url":"https://api.github.com/users/apache/orgs","repos_url":"https://api.github.com/users/apache/repos","events_url":"https://api.github.com/users/apache/events{/privacy}","received_events_url":"https://api.github.com/users/apache/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/apache/beam","description":"Mirror of Apache Beam","fork":false,"url":"https://api.github.com/repos/apache/beam","forks_url":"https://api.github.com/repos/apache/beam/forks","keys_url":"https://api.github.com/repos/apache/beam/keys{/key_id}","collaborators_url":"https://api.github.com/repos/apache/beam/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/apache/beam/teams","hooks_url":"https://api.github.com/repos/apache/beam/hooks","issue_events_url":"https://api.github.com/repos/apache/beam/issues/events{/number}","events_url":"https://api.github.com/repos/apache/beam/events","assignees_url":"https://api.github.com/repos/apache/beam/assignees{/user}","branches_url":"https://api.github.com/repos/apache/beam/branches{/branch}","tags_url":"https://api.github.com/repos/apache/beam/tags","blobs_url":"https://api.github.com/repos/apache/beam/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/apache/beam/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/apache/beam/git/refs{/sha}","trees_url":"https://api.github.com/repos/apache/beam/git/trees{/sha}","statuses_url":"https://api.github.com/repos/apache/beam/statuses/{sha}","languages_url":"https://api.github.com/repos/apache/beam/languages","stargazers_url":"https://api.github.com/repos/apache/beam/stargazers","contributors_url":"https://api.github.com/repos/apache/beam/contributors","subscribers_url":"https://api.github.com/repos/apache/beam/subscribers","subscription_url":"https://api.github.com/repos/apache/beam/subscription","commits_url":"https://api.github.com/repos/apache/beam/commits{/sha}","git_commits_url":"https://api.github.com/repos/apache/beam/git/commits{/sha}","comments_url":"https://api.github.com/repos/apache/beam/comments{/number}","issue_comment_url":"https://api.github.com/repos/apache/beam/issues/comments{/number}","contents_url":"https://api.github.com/repos/apache/beam/contents/{+path}","compare_url":"https://api.github.com/repos/apache/beam/compare/{base}...{head}","merges_url":"https://api.github.com/repos/apache/beam/merges","archive_url":"https://api.github.com/repos/apache/beam/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/apache/beam/downloads","issues_url":"https://api.github.com/repos/apache/beam/issues{/number}","pulls_url":"https://api.github.com/repos/apache/beam/pulls{/number}","milestones_url":"https://api.github.com/repos/apache/beam/milestones{/number}","notifications_url":"https://api.github.com/repos/apache/beam/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/apache/beam/labels{/name}","releases_url":"https://api.github.com/repos/apache/beam/releases{/id}","deployments_url":"https://api.github.com/repos/apache/beam/deployments","created_at":"2016-02-02T08:00:06Z","updated_at":"2017-11-15T14:57:06Z","pushed_at":"2017-11-15T17:05:10Z","git_url":"git://github.com/apache/beam.git","ssh_url":"git@github.com:apache/beam.git","clone_url":"https://github.com/apache/beam.git","svn_url":"https://github.com/apache/beam","homepage":"","size":46725,"stargazers_count":1478,"watchers_count":1478,"language":"Java","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":891,"mirror_url":"git://git.apache.org/beam.git","archived":false,"open_issues_count":104,"forks":891,"open_issues":104,"watchers":1478,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/apache/beam/pulls/4135"},"html":{"href":"https://github.com/apache/beam/pull/4135"},"issue":{"href":"https://api.github.com/repos/apache/beam/issues/4135"},"comments":{"href":"https://api.github.com/repos/apache/beam/issues/4135/comments"},"review_comments":{"href":"https://api.github.com/repos/apache/beam/pulls/4135/comments"},"review_comment":{"href":"https://api.github.com/repos/apache/beam/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/apache/beam/pulls/4135/commits"},"statuses":{"href":"https://api.github.com/repos/apache/beam/statuses/9713b1d63a395db9893ab9447d9cc81a6ff239aa"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"swegner"}}