blob: d922dc37550320b93391007d541cae009e762f4d [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>ReadChangeStreamPartitionAction (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="ReadChangeStreamPartitionAction (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/GenerateInitialPartitionsAction.html" title="class in org.apache.beam.sdk.io.gcp.bigtable.changestreams.action"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
<li>Next&nbsp;Class</li>
</ul>
<ul class="navList">
<li><a href="../../../../../../../../../index.html?org/apache/beam/sdk/io/gcp/bigtable/changestreams/action/ReadChangeStreamPartitionAction.html" target="_top">Frames</a></li>
<li><a href="ReadChangeStreamPartitionAction.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 ReadChangeStreamPartitionAction" class="title">Class ReadChangeStreamPartitionAction</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.ReadChangeStreamPartitionAction</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">ReadChangeStreamPartitionAction</span>
extends java.lang.Object</pre>
<div class="block">This class is part of <a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/bigtable/changestreams/dofn/ReadChangeStreamPartitionDoFn.html" title="class in org.apache.beam.sdk.io.gcp.bigtable.changestreams.dofn"><code>ReadChangeStreamPartitionDoFn</code></a> SDF.</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/ReadChangeStreamPartitionAction.html#ReadChangeStreamPartitionAction-org.apache.beam.sdk.io.gcp.bigtable.changestreams.dao.MetadataTableDao-org.apache.beam.sdk.io.gcp.bigtable.changestreams.dao.ChangeStreamDao-org.apache.beam.sdk.io.gcp.bigtable.changestreams.ChangeStreamMetrics-org.apache.beam.sdk.io.gcp.bigtable.changestreams.action.ChangeStreamAction-org.joda.time.Duration-">ReadChangeStreamPartitionAction</a></span>(<a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/bigtable/changestreams/dao/MetadataTableDao.html" title="class in org.apache.beam.sdk.io.gcp.bigtable.changestreams.dao">MetadataTableDao</a>&nbsp;metadataTableDao,
<a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/bigtable/changestreams/dao/ChangeStreamDao.html" title="class in org.apache.beam.sdk.io.gcp.bigtable.changestreams.dao">ChangeStreamDao</a>&nbsp;changeStreamDao,
<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/action/ChangeStreamAction.html" title="class in org.apache.beam.sdk.io.gcp.bigtable.changestreams.action">ChangeStreamAction</a>&nbsp;changeStreamAction,
<a href="https://static.javadoc.io/joda-time/joda-time/2.10.10/org/joda/time/Duration.html?is-external=true" title="class or interface in org.joda.time">Duration</a>&nbsp;heartbeatDuration)</code>&nbsp;</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><a href="../../../../../../../../../org/apache/beam/sdk/transforms/DoFn.ProcessContinuation.html" title="class in org.apache.beam.sdk.transforms">DoFn.ProcessContinuation</a></code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/bigtable/changestreams/action/ReadChangeStreamPartitionAction.html#run-org.apache.beam.sdk.io.gcp.bigtable.changestreams.model.PartitionRecord-org.apache.beam.sdk.transforms.splittabledofn.RestrictionTracker-org.apache.beam.sdk.transforms.DoFn.OutputReceiver-org.apache.beam.sdk.transforms.splittabledofn.ManualWatermarkEstimator-">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,
<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)</code>
<div class="block">Streams changes from a specific partition.</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="ReadChangeStreamPartitionAction-org.apache.beam.sdk.io.gcp.bigtable.changestreams.dao.MetadataTableDao-org.apache.beam.sdk.io.gcp.bigtable.changestreams.dao.ChangeStreamDao-org.apache.beam.sdk.io.gcp.bigtable.changestreams.ChangeStreamMetrics-org.apache.beam.sdk.io.gcp.bigtable.changestreams.action.ChangeStreamAction-org.joda.time.Duration-">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>ReadChangeStreamPartitionAction</h4>
<pre>public&nbsp;ReadChangeStreamPartitionAction(<a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/bigtable/changestreams/dao/MetadataTableDao.html" title="class in org.apache.beam.sdk.io.gcp.bigtable.changestreams.dao">MetadataTableDao</a>&nbsp;metadataTableDao,
<a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/bigtable/changestreams/dao/ChangeStreamDao.html" title="class in org.apache.beam.sdk.io.gcp.bigtable.changestreams.dao">ChangeStreamDao</a>&nbsp;changeStreamDao,
<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/action/ChangeStreamAction.html" title="class in org.apache.beam.sdk.io.gcp.bigtable.changestreams.action">ChangeStreamAction</a>&nbsp;changeStreamAction,
<a href="https://static.javadoc.io/joda-time/joda-time/2.10.10/org/joda/time/Duration.html?is-external=true" title="class or interface in org.joda.time">Duration</a>&nbsp;heartbeatDuration)</pre>
</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-org.apache.beam.sdk.transforms.splittabledofn.RestrictionTracker-org.apache.beam.sdk.transforms.DoFn.OutputReceiver-org.apache.beam.sdk.transforms.splittabledofn.ManualWatermarkEstimator-">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>run</h4>
<pre>public&nbsp;<a href="../../../../../../../../../org/apache/beam/sdk/transforms/DoFn.ProcessContinuation.html" title="class in org.apache.beam.sdk.transforms">DoFn.ProcessContinuation</a>&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,
<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)
throws java.io.IOException</pre>
<div class="block">Streams changes from a specific partition. This function is responsible to maintaining the
lifecycle of streaming the partition. We delegate to <a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/bigtable/changestreams/action/ChangeStreamAction.html" title="class in org.apache.beam.sdk.io.gcp.bigtable.changestreams.action"><code>ChangeStreamAction</code></a> to process
individual response from the change stream.
<p>Before we send a request to Cloud Bigtable to stream the partition, we need to perform a few
things.
<ol>
<li>Lock the partition. Due to the design of the change streams connector, it is possible
that multiple DoFn are started trying to stream the same partition. However, only 1 DoFn
should be streaming a partition. So we solve this by using the metadata table as a
distributed lock. We attempt to lock the partition for this DoFn's UUID. If it is
successful, it means this DoFn is the only one that can stream the partition and
continue. Otherwise, terminate this DoFn because another DoFn is streaming this partition
already.
<li>Process CloseStream if it exists. In order to solve a possible inconsistent state
problem, we do not process CloseStream after receiving it. We claim the CloseStream in
the RestrictionTracker so it persists after a checkpoint. We checkpoint to flush all the
DataChanges. Then on resume, we process the CloseStream. There is only 1 expected Status
for CloseStream: Out of Range. Out of Range is returned when the partition has either
been split into more partitions or merged into a larger partition. In this case, we write
to the metadata table the new partitions' information so that <a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/bigtable/changestreams/dofn/DetectNewPartitionsDoFn.html" title="class in org.apache.beam.sdk.io.gcp.bigtable.changestreams.dofn"><code>DetectNewPartitionsDoFn</code></a> can read and output those new partitions to be streamed. We also
need to ensure we clean up this partition's metadata to release the lock.
<li>Update the metadata table with the watermark and additional debugging info.
<li>Stream the partition.
</ol></div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>partitionRecord</code> - partition information used to identify this stream</dd>
<dd><code>tracker</code> - restriction tracker of <a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/bigtable/changestreams/dofn/ReadChangeStreamPartitionDoFn.html" title="class in org.apache.beam.sdk.io.gcp.bigtable.changestreams.dofn"><code>ReadChangeStreamPartitionDoFn</code></a></dd>
<dd><code>receiver</code> - output receiver for <a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/bigtable/changestreams/dofn/ReadChangeStreamPartitionDoFn.html" title="class in org.apache.beam.sdk.io.gcp.bigtable.changestreams.dofn"><code>ReadChangeStreamPartitionDoFn</code></a></dd>
<dd><code>watermarkEstimator</code> - watermark estimator <a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/bigtable/changestreams/dofn/ReadChangeStreamPartitionDoFn.html" title="class in org.apache.beam.sdk.io.gcp.bigtable.changestreams.dofn"><code>ReadChangeStreamPartitionDoFn</code></a></dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd><a href="../../../../../../../../../org/apache/beam/sdk/transforms/DoFn.ProcessContinuation.html#stop--"><code>DoFn.ProcessContinuation.stop()</code></a> if a checkpoint is required or the stream has
completed. Or <a href="../../../../../../../../../org/apache/beam/sdk/transforms/DoFn.ProcessContinuation.html#resume--"><code>DoFn.ProcessContinuation.resume()</code></a> if a checkpoint is required.</dd>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code>java.io.IOException</code> - when stream fails.</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/GenerateInitialPartitionsAction.html" title="class in org.apache.beam.sdk.io.gcp.bigtable.changestreams.action"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
<li>Next&nbsp;Class</li>
</ul>
<ul class="navList">
<li><a href="../../../../../../../../../index.html?org/apache/beam/sdk/io/gcp/bigtable/changestreams/action/ReadChangeStreamPartitionAction.html" target="_top">Frames</a></li>
<li><a href="ReadChangeStreamPartitionAction.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>