blob: 8d3f523f722d885bccb89024e746fbd11767eb63 [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>DetectNewPartitionsAction (Apache Beam 2.38.0-SNAPSHOT)</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="DetectNewPartitionsAction (Apache Beam 2.38.0-SNAPSHOT)";
}
}
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/spanner/changestreams/action/DataChangeRecordAction.html" title="class in org.apache.beam.sdk.io.gcp.spanner.changestreams.action"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
<li><a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/spanner/changestreams/action/HeartbeatRecordAction.html" title="class in org.apache.beam.sdk.io.gcp.spanner.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/spanner/changestreams/action/DetectNewPartitionsAction.html" target="_top">Frames</a></li>
<li><a href="DetectNewPartitionsAction.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.spanner.changestreams.action</div>
<h2 title="Class DetectNewPartitionsAction" class="title">Class DetectNewPartitionsAction</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
<li>java.lang.Object</li>
<li>
<ul class="inheritance">
<li>org.apache.beam.sdk.io.gcp.spanner.changestreams.action.DetectNewPartitionsAction</li>
</ul>
</li>
</ul>
<div class="description">
<ul class="blockList">
<li class="blockList">
<hr>
<br>
<pre>public class <span class="typeNameLabel">DetectNewPartitionsAction</span>
extends java.lang.Object</pre>
<div class="block">This class is responsible for scheduling partitions. It obtains partitions to be scheduled from
the partition metadata table. The full algorithm is described in <code>DetectNewPartitionsAction#run(RestrictionTracker, OutputReceiver, ManualWatermarkEstimator)</code>.</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/spanner/changestreams/action/DetectNewPartitionsAction.html#DetectNewPartitionsAction-org.apache.beam.sdk.io.gcp.spanner.changestreams.dao.PartitionMetadataDao-org.apache.beam.sdk.io.gcp.spanner.changestreams.mapper.PartitionMetadataMapper-org.apache.beam.sdk.io.gcp.spanner.changestreams.ChangeStreamMetrics-org.joda.time.Duration-">DetectNewPartitionsAction</a></span>(<a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/spanner/changestreams/dao/PartitionMetadataDao.html" title="class in org.apache.beam.sdk.io.gcp.spanner.changestreams.dao">PartitionMetadataDao</a>&nbsp;dao,
<a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/spanner/changestreams/mapper/PartitionMetadataMapper.html" title="class in org.apache.beam.sdk.io.gcp.spanner.changestreams.mapper">PartitionMetadataMapper</a>&nbsp;mapper,
<a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/spanner/changestreams/ChangeStreamMetrics.html" title="class in org.apache.beam.sdk.io.gcp.spanner.changestreams">ChangeStreamMetrics</a>&nbsp;metrics,
<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;resumeDuration)</code>
<div class="block">Constructs an action class for detecting / scheduling new partitions.</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><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/spanner/changestreams/action/DetectNewPartitionsAction.html#run-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/transforms/splittabledofn/RestrictionTracker.html" title="class in org.apache.beam.sdk.transforms.splittabledofn">RestrictionTracker</a>&lt;<a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/spanner/changestreams/restriction/TimestampRange.html" title="class in org.apache.beam.sdk.io.gcp.spanner.changestreams.restriction">TimestampRange</a>,com.google.cloud.Timestamp&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/io/gcp/spanner/changestreams/model/PartitionMetadata.html" title="class in org.apache.beam.sdk.io.gcp.spanner.changestreams.model">PartitionMetadata</a>&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">Executes the main logic to schedule new partitions.</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="DetectNewPartitionsAction-org.apache.beam.sdk.io.gcp.spanner.changestreams.dao.PartitionMetadataDao-org.apache.beam.sdk.io.gcp.spanner.changestreams.mapper.PartitionMetadataMapper-org.apache.beam.sdk.io.gcp.spanner.changestreams.ChangeStreamMetrics-org.joda.time.Duration-">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>DetectNewPartitionsAction</h4>
<pre>public&nbsp;DetectNewPartitionsAction(<a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/spanner/changestreams/dao/PartitionMetadataDao.html" title="class in org.apache.beam.sdk.io.gcp.spanner.changestreams.dao">PartitionMetadataDao</a>&nbsp;dao,
<a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/spanner/changestreams/mapper/PartitionMetadataMapper.html" title="class in org.apache.beam.sdk.io.gcp.spanner.changestreams.mapper">PartitionMetadataMapper</a>&nbsp;mapper,
<a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/spanner/changestreams/ChangeStreamMetrics.html" title="class in org.apache.beam.sdk.io.gcp.spanner.changestreams">ChangeStreamMetrics</a>&nbsp;metrics,
<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;resumeDuration)</pre>
<div class="block">Constructs an action class for detecting / scheduling new partitions.</div>
</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.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/transforms/splittabledofn/RestrictionTracker.html" title="class in org.apache.beam.sdk.transforms.splittabledofn">RestrictionTracker</a>&lt;<a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/spanner/changestreams/restriction/TimestampRange.html" title="class in org.apache.beam.sdk.io.gcp.spanner.changestreams.restriction">TimestampRange</a>,com.google.cloud.Timestamp&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/io/gcp/spanner/changestreams/model/PartitionMetadata.html" title="class in org.apache.beam.sdk.io.gcp.spanner.changestreams.model">PartitionMetadata</a>&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)</pre>
<div class="block">Executes the main logic to schedule new partitions. It follows this procedure periodically:
<ol>
<li>Fetches the min watermark from all the unfinished partitions in the metadata tables.
<li>If there are no unfinished partitions, this function will stop and not be re-scheduled.
<li>Updates the component's watermark to the min fetched.
<li>Fetches the read timestamp from the restriction.
<li>Fetches all the partitions with a createdAt timestamp > read timestamp.
<li>Groups the partitions by createdAt timestamp.
<li>Process the groups in ascending order of createdAt timestamp (oldest first)
<li>For each group, updates the state to <a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/spanner/changestreams/model/PartitionMetadata.State.html#SCHEDULED"><code>PartitionMetadata.State.SCHEDULED</code></a>.
<li>Tries to claim the createdAt timestamp of the group within the restriction.
<li>If it is possible to claim the timestamp, outputs each partition to the next stage. It
then proceeds to process the next batch. When there are no more batches to process,
schedules the function to resume after the configured resume duration.
<li>If it is not possible to claim the timestamp, stops.
</ol></div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>tracker</code> - an instance of <a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/spanner/changestreams/restriction/DetectNewPartitionsRangeTracker.html" title="class in org.apache.beam.sdk.io.gcp.spanner.changestreams.restriction"><code>DetectNewPartitionsRangeTracker</code></a></dd>
<dd><code>receiver</code> - a <a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/spanner/changestreams/model/PartitionMetadata.html" title="class in org.apache.beam.sdk.io.gcp.spanner.changestreams.model"><code>PartitionMetadata</code></a> <a href="../../../../../../../../../org/apache/beam/sdk/transforms/DoFn.OutputReceiver.html" title="interface in org.apache.beam.sdk.transforms"><code>DoFn.OutputReceiver</code></a></dd>
<dd><code>watermarkEstimator</code> - a <a href="../../../../../../../../../org/apache/beam/sdk/transforms/splittabledofn/ManualWatermarkEstimator.html" title="interface in org.apache.beam.sdk.transforms.splittabledofn"><code>ManualWatermarkEstimator</code></a> of <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"><code>Instant</code></a></dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>a <a href="../../../../../../../../../org/apache/beam/sdk/transforms/DoFn.ProcessContinuation.html#stop--"><code>DoFn.ProcessContinuation.stop()</code></a> if there are no more partitions to process or
<a href="../../../../../../../../../org/apache/beam/sdk/transforms/DoFn.ProcessContinuation.html#resume--"><code>DoFn.ProcessContinuation.resume()</code></a> to re-schedule the function after the configured
interval.</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/spanner/changestreams/action/DataChangeRecordAction.html" title="class in org.apache.beam.sdk.io.gcp.spanner.changestreams.action"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
<li><a href="../../../../../../../../../org/apache/beam/sdk/io/gcp/spanner/changestreams/action/HeartbeatRecordAction.html" title="class in org.apache.beam.sdk.io.gcp.spanner.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/spanner/changestreams/action/DetectNewPartitionsAction.html" target="_top">Frames</a></li>
<li><a href="DetectNewPartitionsAction.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>