blob: 3a3dfc4c0f9378c883aa95ff98763665a11f452d [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- NewPage -->
<html lang="en">
<head>
<!-- Generated by javadoc -->
<title>ChangeStreamAction (Apache Beam 2.47.0)</title>
<link rel="stylesheet" type="text/css" href="../../../../../../../../../stylesheet.css" title="Style">
<script type="text/javascript" src="../../../../../../../../../script.js"></script>
</head>
<body>
<script type="text/javascript"><!--
try {
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="ChangeStreamAction (Apache Beam 2.47.0)";
}
}
catch(err) {
}
//-->
var methods = {"i0":10};
var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
var altColor = "altColor";
var rowColor = "rowColor";
var tableTab = "tableTab";
var activeTableTab = "activeTableTab";
</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a name="navbar.top">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
<a name="navbar.top.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../../../../../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../../../../../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../../../../../../../../index-all.html">Index</a></li>
<li><a href="../../../../../../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li><a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/bigtable/changestreams/action/ActionFactory.html" title="class in org.apache.beam.sdk.io.gcp.bigtable.changestreams.action"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
<li><a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/bigtable/changestreams/action/DetectNewPartitionsAction.html" title="class in org.apache.beam.sdk.io.gcp.bigtable.changestreams.action"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
</ul>
<ul class="navList">
<li><a href="../../../../../../../../../index.html?org/apache/beam/sdk/io/gcp/bigtable/changestreams/action/ChangeStreamAction.html" target="_top">Frames</a></li>
<li><a href="ChangeStreamAction.html" target="_top">No&nbsp;Frames</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_top">
<li><a href="../../../../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_top");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.summary">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a name="skip.navbar.top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= -->
<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
<div class="subTitle">org.apache.beam.sdk.io.gcp.bigtable.changestreams.action</div>
<h2 title="Class ChangeStreamAction" class="title">Class ChangeStreamAction</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
<li>java.lang.Object</li>
<li>
<ul class="inheritance">
<li>org.apache.beam.sdk.io.gcp.bigtable.changestreams.action.ChangeStreamAction</li>
</ul>
</li>
</ul>
<div class="description">
<ul class="blockList">
<li class="blockList">
<hr>
<br>
<pre><a href="../../../../../../../../../org/apache/beam/sdk/annotations/Internal.html" title="annotation in org.apache.beam.sdk.annotations">@Internal</a>
public class <span class="typeNameLabel">ChangeStreamAction</span>
extends java.lang.Object</pre>
<div class="block">This class is responsible for processing individual ChangeStreamRecord.</div>
</li>
</ul>
</div>
<div class="summary">
<ul class="blockList">
<li class="blockList">
<!-- ======== CONSTRUCTOR SUMMARY ======== -->
<ul class="blockList">
<li class="blockList"><a name="constructor.summary">
<!-- -->
</a>
<h3>Constructor Summary</h3>
<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Constructor Summary table, listing constructors, and an explanation">
<caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
<tr>
<th class="colOne" scope="col">Constructor and Description</th>
</tr>
<tr class="altColor">
<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/bigtable/changestreams/action/ChangeStreamAction.html#ChangeStreamAction-org.apache.beam.sdk.io.gcp.bigtable.changestreams.ChangeStreamMetrics-org.apache.beam.sdk.io.gcp.bigtable.changestreams.estimator.ThroughputEstimator-">ChangeStreamAction</a></span>(<a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/bigtable/changestreams/ChangeStreamMetrics.html" title="class in org.apache.beam.sdk.io.gcp.bigtable.changestreams">ChangeStreamMetrics</a>&nbsp;metrics,
<a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/bigtable/changestreams/estimator/ThroughputEstimator.html" title="interface in org.apache.beam.sdk.io.gcp.bigtable.changestreams.estimator">ThroughputEstimator</a>&lt;<a href="../../../../../../../../../org/apache/beam/sdk/values/KV.html" title="class in org.apache.beam.sdk.values">KV</a>&lt;com.google.protobuf.ByteString,com.google.cloud.bigtable.data.v2.models.ChangeStreamMutation&gt;&gt;&nbsp;throughputEstimator)</code>
<div class="block">Constructs ChangeStreamAction to process individual ChangeStreamRecord.</div>
</td>
</tr>
</table>
</li>
</ul>
<!-- ========== METHOD SUMMARY =========== -->
<ul class="blockList">
<li class="blockList"><a name="method.summary">
<!-- -->
</a>
<h3>Method Summary</h3>
<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Method Summary table, listing methods, and an explanation">
<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
<tr>
<th class="colFirst" scope="col">Modifier and Type</th>
<th class="colLast" scope="col">Method and Description</th>
</tr>
<tr id="i0" class="altColor">
<td class="colFirst"><code>java.util.Optional&lt;<a href="../../../../../../../../../org/apache/beam/sdk/transforms/DoFn.ProcessContinuation.html" title="class in org.apache.beam.sdk.transforms">DoFn.ProcessContinuation</a>&gt;</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/bigtable/changestreams/action/ChangeStreamAction.html#run-org.apache.beam.sdk.io.gcp.bigtable.changestreams.model.PartitionRecord-com.google.cloud.bigtable.data.v2.models.ChangeStreamRecord-org.apache.beam.sdk.transforms.splittabledofn.RestrictionTracker-org.apache.beam.sdk.transforms.DoFn.OutputReceiver-org.apache.beam.sdk.transforms.splittabledofn.ManualWatermarkEstimator-boolean-">run</a></span>(<a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/bigtable/changestreams/model/PartitionRecord.html" title="class in org.apache.beam.sdk.io.gcp.bigtable.changestreams.model">PartitionRecord</a>&nbsp;partitionRecord,
com.google.cloud.bigtable.data.v2.models.ChangeStreamRecord&nbsp;record,
<a href="../../../../../../../../../org/apache/beam/sdk/transforms/splittabledofn/RestrictionTracker.html" title="class in org.apache.beam.sdk.transforms.splittabledofn">RestrictionTracker</a>&lt;<a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/bigtable/changestreams/restriction/StreamProgress.html" title="class in org.apache.beam.sdk.io.gcp.bigtable.changestreams.restriction">StreamProgress</a>,<a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/bigtable/changestreams/restriction/StreamProgress.html" title="class in org.apache.beam.sdk.io.gcp.bigtable.changestreams.restriction">StreamProgress</a>&gt;&nbsp;tracker,
<a href="../../../../../../../../../org/apache/beam/sdk/transforms/DoFn.OutputReceiver.html" title="interface in org.apache.beam.sdk.transforms">DoFn.OutputReceiver</a>&lt;<a href="../../../../../../../../../org/apache/beam/sdk/values/KV.html" title="class in org.apache.beam.sdk.values">KV</a>&lt;com.google.protobuf.ByteString,com.google.cloud.bigtable.data.v2.models.ChangeStreamMutation&gt;&gt;&nbsp;receiver,
<a href="../../../../../../../../../org/apache/beam/sdk/transforms/splittabledofn/ManualWatermarkEstimator.html" title="interface in org.apache.beam.sdk.transforms.splittabledofn">ManualWatermarkEstimator</a>&lt;<a href="https://static.javadoc.io/joda-time/joda-time/2.10.10/org/joda/time/Instant.html?is-external=true" title="class or interface in org.joda.time">Instant</a>&gt;&nbsp;watermarkEstimator,
boolean&nbsp;shouldDebug)</code>
<div class="block">This class processes ReadChangeStreamResponse from bigtable server.</div>
</td>
</tr>
</table>
<ul class="blockList">
<li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
<!-- -->
</a>
<h3>Methods inherited from class&nbsp;java.lang.Object</h3>
<code>clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait</code></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
<div class="details">
<ul class="blockList">
<li class="blockList">
<!-- ========= CONSTRUCTOR DETAIL ======== -->
<ul class="blockList">
<li class="blockList"><a name="constructor.detail">
<!-- -->
</a>
<h3>Constructor Detail</h3>
<a name="ChangeStreamAction-org.apache.beam.sdk.io.gcp.bigtable.changestreams.ChangeStreamMetrics-org.apache.beam.sdk.io.gcp.bigtable.changestreams.estimator.ThroughputEstimator-">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>ChangeStreamAction</h4>
<pre>public&nbsp;ChangeStreamAction(<a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/bigtable/changestreams/ChangeStreamMetrics.html" title="class in org.apache.beam.sdk.io.gcp.bigtable.changestreams">ChangeStreamMetrics</a>&nbsp;metrics,
<a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/bigtable/changestreams/estimator/ThroughputEstimator.html" title="interface in org.apache.beam.sdk.io.gcp.bigtable.changestreams.estimator">ThroughputEstimator</a>&lt;<a href="../../../../../../../../../org/apache/beam/sdk/values/KV.html" title="class in org.apache.beam.sdk.values">KV</a>&lt;com.google.protobuf.ByteString,com.google.cloud.bigtable.data.v2.models.ChangeStreamMutation&gt;&gt;&nbsp;throughputEstimator)</pre>
<div class="block">Constructs ChangeStreamAction to process individual ChangeStreamRecord.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>metrics</code> - record beam metrics.</dd>
</dl>
</li>
</ul>
</li>
</ul>
<!-- ============ METHOD DETAIL ========== -->
<ul class="blockList">
<li class="blockList"><a name="method.detail">
<!-- -->
</a>
<h3>Method Detail</h3>
<a name="run-org.apache.beam.sdk.io.gcp.bigtable.changestreams.model.PartitionRecord-com.google.cloud.bigtable.data.v2.models.ChangeStreamRecord-org.apache.beam.sdk.transforms.splittabledofn.RestrictionTracker-org.apache.beam.sdk.transforms.DoFn.OutputReceiver-org.apache.beam.sdk.transforms.splittabledofn.ManualWatermarkEstimator-boolean-">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>run</h4>
<pre>public&nbsp;java.util.Optional&lt;<a href="../../../../../../../../../org/apache/beam/sdk/transforms/DoFn.ProcessContinuation.html" title="class in org.apache.beam.sdk.transforms">DoFn.ProcessContinuation</a>&gt;&nbsp;run(<a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/bigtable/changestreams/model/PartitionRecord.html" title="class in org.apache.beam.sdk.io.gcp.bigtable.changestreams.model">PartitionRecord</a>&nbsp;partitionRecord,
com.google.cloud.bigtable.data.v2.models.ChangeStreamRecord&nbsp;record,
<a href="../../../../../../../../../org/apache/beam/sdk/transforms/splittabledofn/RestrictionTracker.html" title="class in org.apache.beam.sdk.transforms.splittabledofn">RestrictionTracker</a>&lt;<a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/bigtable/changestreams/restriction/StreamProgress.html" title="class in org.apache.beam.sdk.io.gcp.bigtable.changestreams.restriction">StreamProgress</a>,<a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/bigtable/changestreams/restriction/StreamProgress.html" title="class in org.apache.beam.sdk.io.gcp.bigtable.changestreams.restriction">StreamProgress</a>&gt;&nbsp;tracker,
<a href="../../../../../../../../../org/apache/beam/sdk/transforms/DoFn.OutputReceiver.html" title="interface in org.apache.beam.sdk.transforms">DoFn.OutputReceiver</a>&lt;<a href="../../../../../../../../../org/apache/beam/sdk/values/KV.html" title="class in org.apache.beam.sdk.values">KV</a>&lt;com.google.protobuf.ByteString,com.google.cloud.bigtable.data.v2.models.ChangeStreamMutation&gt;&gt;&nbsp;receiver,
<a href="../../../../../../../../../org/apache/beam/sdk/transforms/splittabledofn/ManualWatermarkEstimator.html" title="interface in org.apache.beam.sdk.transforms.splittabledofn">ManualWatermarkEstimator</a>&lt;<a href="https://static.javadoc.io/joda-time/joda-time/2.10.10/org/joda/time/Instant.html?is-external=true" title="class or interface in org.joda.time">Instant</a>&gt;&nbsp;watermarkEstimator,
boolean&nbsp;shouldDebug)</pre>
<div class="block">This class processes ReadChangeStreamResponse from bigtable server. There are 3 possible
response types, Heartbeat, ChangeStreamMutation, CloseStream.
<ul>
<li>Heartbeat happens periodically based on the initial configuration set at the start of the
beam pipeline. Heartbeat can advance the watermark forward and includes a continuation
token that provides a point to resume from after a checkpoint.
<li>ChangeStreamMutation includes the actual mutation that took place in the Bigtable.
ChangeStreamMutation also includes watermark and continuation token. All
ChangeStreamMutation are emitted to the outputReceiver with the timestamp of 0 (instead
of the commit timestamp). Setting the timestamp to 0 discourages the use of windowing on
this connector. All ChangeStreamMutations will be late data when windowing. This design
decision prefers availability over consistency in the event that partitions are streamed
slowly (due to an outages or other unavailabilities) the commit timestamp which drives
the watermark may lag behind preventing windows from closing.
<li>CloseStream indicates that the stream has come to an end. The CloseStream is not
processed but stored in the RestrictionTracker to be processed later. This ensures that
we successfully commit all pending ChangeStreamMutations.
</ul>
CloseStream is the only response that type will initiate a resume. Other response type will
simply process the response and return empty. Returning empty signals to caller that we have
processed the response, and it does not require any additional action.
<p>There are 2 cases that cause this function to return a non-empty ProcessContinuation.
<ol>
<li>We fail to claim a RestrictionTracker. This can happen for a runner-initiated checkpoint.
When the runner initiates a checkpoint, we will stop and checkpoint pending
ChangeStreamMutations and resume from the previous RestrictionTracker.
<li>The response is a CloseStream. RestrictionTracker claims the CloseStream. We don't do any
additional processing of the response. We return resume to signal to the caller that to
checkpoint all pending ChangeStreamMutations. We expect the caller to check the
RestrictionTracker includes a CloseStream and process it to close the stream.
</ol></div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>partitionRecord</code> - the stream partition that generated the response</dd>
<dd><code>record</code> - the change stream record to be processed</dd>
<dd><code>tracker</code> - restrictionTracker that we use to claim next block and also to store CloseStream</dd>
<dd><code>receiver</code> - to output DataChange</dd>
<dd><code>watermarkEstimator</code> - manually progress watermark when processing responses with watermark</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>Optional.of(ProcessContinuation) if the run should be stopped or resumed, otherwise
Optional.empty() to do nothing.</dd>
</dl>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
<!-- ========= END OF CLASS DATA ========= -->
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a name="navbar.bottom">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
<a name="navbar.bottom.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../../../../../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../../../../../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../../../../../../../../index-all.html">Index</a></li>
<li><a href="../../../../../../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li><a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/bigtable/changestreams/action/ActionFactory.html" title="class in org.apache.beam.sdk.io.gcp.bigtable.changestreams.action"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
<li><a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/bigtable/changestreams/action/DetectNewPartitionsAction.html" title="class in org.apache.beam.sdk.io.gcp.bigtable.changestreams.action"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
</ul>
<ul class="navList">
<li><a href="../../../../../../../../../index.html?org/apache/beam/sdk/io/gcp/bigtable/changestreams/action/ChangeStreamAction.html" target="_top">Frames</a></li>
<li><a href="ChangeStreamAction.html" target="_top">No&nbsp;Frames</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_bottom">
<li><a href="../../../../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_bottom");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.summary">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a name="skip.navbar.bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
</body>
</html>