You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pinot.apache.org by "ankitsultana (via GitHub)" <gi...@apache.org> on 2025/05/30 05:59:36 UTC
[PR] [multistage] Cleanup Plan Fragmenter Logic [pinot]
ankitsultana opened a new pull request, #15943:
URL: https://github.com/apache/pinot/pull/15943
(no comment)
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org
For additional commands, e-mail: commits-help@pinot.apache.org
Re: [PR] [multistage] Cleanup Plan Fragmenter Logic [pinot]
Posted by "shauryachats (via GitHub)" <gi...@apache.org>.
shauryachats commented on code in PR #15943:
URL: https://github.com/apache/pinot/pull/15943#discussion_r2116626879
##########
pinot-query-planner/src/main/java/org/apache/pinot/query/planner/physical/v2/opt/rules/RootExchangeInsertRule.java:
##########
@@ -0,0 +1,78 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.pinot.query.planner.physical.v2.opt.rules;
+
+import java.util.List;
+import javax.annotation.Nullable;
+import org.apache.calcite.rel.RelCollation;
+import org.apache.calcite.rel.RelDistribution;
+import org.apache.pinot.calcite.rel.traits.PinotExecStrategyTrait;
+import org.apache.pinot.query.context.PhysicalPlannerContext;
+import org.apache.pinot.query.planner.physical.v2.ExchangeStrategy;
+import org.apache.pinot.query.planner.physical.v2.PRelNode;
+import org.apache.pinot.query.planner.physical.v2.PinotDataDistribution;
+import org.apache.pinot.query.planner.physical.v2.nodes.PhysicalExchange;
+import org.apache.pinot.query.planner.physical.v2.opt.PRelNodeTransformer;
+
+
+/**
+ * Adds an exchange node at the root of the plan if the root node is not already located as a singleton on the broker.
+ * This is because the entire data needs to be returned by the broker to the client.
+ */
+public class RootExchangeInsertRule implements PRelNodeTransformer {
+ private final PhysicalPlannerContext _context;
+
+ public RootExchangeInsertRule(PhysicalPlannerContext context) {
+ _context = context;
+ }
+
+ @Override
+ public PRelNode execute(PRelNode currentNode) {
+ PinotDataDistribution rootDataDistribution = currentNode.getPinotDataDistributionOrThrow();
+ List<String> workers = List.of(brokerWorkerId());
+ if (rootDataDistribution.getWorkers().equals(workers)) {
Review Comment:
Could we do `workers.equals(rootDataDistribution.getWorkers())`? There might be a possibility of NPE if rootDataDistribution is `null`.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org
For additional commands, e-mail: commits-help@pinot.apache.org
Re: [PR] [multistage] Cleanup Plan Fragmenter Logic [pinot]
Posted by "ankitsultana (via GitHub)" <gi...@apache.org>.
ankitsultana commented on code in PR #15943:
URL: https://github.com/apache/pinot/pull/15943#discussion_r2116814201
##########
pinot-query-planner/src/main/java/org/apache/pinot/query/planner/physical/v2/PlanFragmentAndMailboxAssignment.java:
##########
@@ -48,112 +46,122 @@
import org.apache.pinot.query.routing.SharedMailboxInfos;
+/**
+ * <h1>Responsibilities</h1>
+ * This does the following:
+ * <ul>
+ * <li>Splits plan around PhysicalExchange nodes to create plan fragments.</li>
+ * <li>Converts PRelNodes to PlanNodes.</li>
+ * <li>
+ * Creates mailboxes for connecting plan fragments. This is done simply based on the workers in the send/receive
+ * plan nodes, and the exchange strategy (identity, partitioning, etc.).
+ * </li>
+ * <li>
+ * Creates metadata for each plan fragment, which includes the scanned tables, unavailable segments, etc.
+ * </li>
+ * </ul>
+ * <h1>Design Note</h1>
+ * This class is completely un-opinionated. The old optimizer had a lot of custom logic added to mailbox assignment,
+ * but this class instead doesn't do any special handling, apart from assigning mailboxes based on the exchange
+ * strategy. This is an important and conscious design choice, because it ensures division of responsibilities and
+ * allows optimizer rules like worker assignment to completely own their responsibilities. This is also important for
+ * keeping the optimizer maximally pluggable. (e.g. you can swap out the default worker assignment rule with a
+ * custom rule like the LiteMode worker assignment rule).
+ */
public class PlanFragmentAndMailboxAssignment {
private static final int ROOT_FRAGMENT_ID = 0;
- private static final int FIRST_NON_ROOT_FRAGMENT_ID = 1;
public Result compute(PRelNode rootPRelNode, PhysicalPlannerContext physicalPlannerContext) {
- Preconditions.checkState(!(rootPRelNode.unwrap() instanceof Exchange), "root node should never be exchange");
- final DataSchema rootDataSchema = PRelToPlanNodeConverter.toDataSchema(rootPRelNode.unwrap().getRowType());
- // Create input fragment's send node.
- MailboxSendNode sendNode = new MailboxSendNode(FIRST_NON_ROOT_FRAGMENT_ID, rootDataSchema, new ArrayList<>(),
- ROOT_FRAGMENT_ID, PinotRelExchangeType.getDefaultExchangeType(), RelDistribution.Type.SINGLETON,
- null, false, null, false);
- // Create root receive node.
- MailboxReceiveNode rootReceiveNode = new MailboxReceiveNode(ROOT_FRAGMENT_ID, rootDataSchema,
- FIRST_NON_ROOT_FRAGMENT_ID, PinotRelExchangeType.getDefaultExchangeType(),
- RelDistribution.Type.BROADCAST_DISTRIBUTED, null, null, false, false, sendNode);
// Create the first two fragments.
Context context = new Context(physicalPlannerContext);
- PlanFragment rootFragment = createFragment(ROOT_FRAGMENT_ID, rootReceiveNode, new ArrayList<>(), context);
- PlanFragment firstInputFragment = createFragment(FIRST_NON_ROOT_FRAGMENT_ID, sendNode, new ArrayList<>(), context);
- rootFragment.getChildren().add(firstInputFragment);
- QueryServerInstance brokerInstance = new QueryServerInstance(physicalPlannerContext.getInstanceId(),
- physicalPlannerContext.getHostName(), physicalPlannerContext.getPort(), physicalPlannerContext.getPort());
- computeMailboxInfos(FIRST_NON_ROOT_FRAGMENT_ID, ROOT_FRAGMENT_ID,
- createWorkerMap(rootPRelNode.getPinotDataDistributionOrThrow().getWorkers(), context),
- ImmutableMap.of(0, brokerInstance), ExchangeStrategy.SINGLETON_EXCHANGE, context);
// Traverse entire tree.
- context._fragmentMetadataMap.get(ROOT_FRAGMENT_ID).setWorkerIdToServerInstanceMap(ImmutableMap.of(
- 0, brokerInstance));
- visit(rootPRelNode, sendNode, firstInputFragment, context);
+ process(rootPRelNode, null, ROOT_FRAGMENT_ID, context);
Result result = new Result();
result._fragmentMetadataMap = context._fragmentMetadataMap;
result._planFragmentMap = context._planFragmentMap;
return result;
}
- /**
- * Invariants: 1. Parent PlanNode does not have current node in input yet. 2. This node is NOT the fragment root. This
- * is because each fragment root is a MailboxSendNode.
- */
- private void visit(PRelNode pRelNode, @Nullable PlanNode parent, PlanFragment currentFragment, Context context) {
- int currentFragmentId = currentFragment.getFragmentId();
- DispatchablePlanMetadata fragmentMetadata = context._fragmentMetadataMap.get(currentFragmentId);
- if (MapUtils.isEmpty(fragmentMetadata.getWorkerIdToServerInstanceMap())) {
- // TODO: This is quite a complex invariant.
- fragmentMetadata.setWorkerIdToServerInstanceMap(createWorkerMap(
- pRelNode.getPinotDataDistributionOrThrow().getWorkers(), context));
- }
+ private void process(PRelNode pRelNode, @Nullable PlanNode parent, int currentFragmentId, Context context) {
if (pRelNode.unwrap() instanceof TableScan) {
- TableScanMetadata tableScanMetadata = Objects.requireNonNull(pRelNode.getTableScanMetadata(),
- "No metadata in table scan PRelNode");
- String tableName = tableScanMetadata.getScannedTables().stream().findFirst().orElseThrow();
- if (!tableScanMetadata.getUnavailableSegmentsMap().isEmpty()) {
- fragmentMetadata.addUnavailableSegments(tableName,
- tableScanMetadata.getUnavailableSegmentsMap().get(tableName));
- }
- fragmentMetadata.addScannedTable(tableName);
- fragmentMetadata.setWorkerIdToSegmentsMap(tableScanMetadata.getWorkedIdToSegmentsMap());
- NodeHint nodeHint = NodeHint.fromRelHints(((TableScan) pRelNode.unwrap()).getHints());
- fragmentMetadata.setTableOptions(nodeHint.getHintOptions().get(PinotHintOptions.TABLE_HINT_OPTIONS));
- if (tableScanMetadata.getTimeBoundaryInfo() != null) {
- fragmentMetadata.setTimeBoundaryInfo(tableScanMetadata.getTimeBoundaryInfo());
- }
+ processTableScan((PhysicalTableScan) pRelNode.unwrap(), currentFragmentId, context);
}
if (pRelNode.unwrap() instanceof PhysicalExchange) {
+ // Split an exchange into two fragments: one for the sender and one for the receiver.
+ // The sender fragment will have a MailboxSendNode and receiver a MailboxReceiveNode.
+ // It is possible that the receiver fragment doesn't exist yet (e.g. when PhysicalExchange is the root node).
+ // In that case, we also create it here. If it exists already, we simply re-use it.
PhysicalExchange physicalExchange = (PhysicalExchange) pRelNode.unwrap();
- int senderFragmentId = context._planFragmentMap.size();
+ PlanFragment receiverFragment = context._planFragmentMap.get(currentFragmentId);
+ int senderFragmentId = context._planFragmentMap.size() + (receiverFragment == null ? 1 : 0);
final DataSchema inputFragmentSchema = PRelToPlanNodeConverter.toDataSchema(
pRelNode.getPRelInput(0).unwrap().getRowType());
RelDistribution.Type distributionType = ExchangeStrategy.getRelDistribution(
physicalExchange.getExchangeStrategy(), physicalExchange.getDistributionKeys()).getType();
- List<PlanNode> inputs = new ArrayList<>();
- MailboxSendNode sendNode = new MailboxSendNode(senderFragmentId, inputFragmentSchema, inputs, currentFragmentId,
- PinotRelExchangeType.getDefaultExchangeType(), distributionType, physicalExchange.getDistributionKeys(),
- false, physicalExchange.getRelCollation().getFieldCollations(), false /* todo: set sortOnSender */);
+ MailboxSendNode sendNode = new MailboxSendNode(senderFragmentId, inputFragmentSchema, new ArrayList<>(),
+ currentFragmentId, PinotRelExchangeType.getDefaultExchangeType(), distributionType,
+ physicalExchange.getDistributionKeys(), false, physicalExchange.getRelCollation().getFieldCollations(),
+ false /* todo: set sortOnSender */);
MailboxReceiveNode receiveNode = new MailboxReceiveNode(currentFragmentId, inputFragmentSchema,
senderFragmentId, PinotRelExchangeType.getDefaultExchangeType(), distributionType,
physicalExchange.getDistributionKeys(), physicalExchange.getRelCollation().getFieldCollations(),
false /* TODO: set sort on receiver */, false /* TODO: set sort on sender */, sendNode);
- PlanFragment newPlanFragment = createFragment(senderFragmentId, sendNode, new ArrayList<>(), context);
+ if (receiverFragment == null) {
+ receiverFragment = createFragment(currentFragmentId, receiveNode, new ArrayList<>(), context,
Review Comment:
Found a bug. This sets the root of the fragment to receiveNode, but instead it should be the top-most node of the PRelNode tree. Will update soon
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org
For additional commands, e-mail: commits-help@pinot.apache.org
Re: [PR] [multistage] Cleanup Plan Fragmenter Logic [pinot]
Posted by "ankitsultana (via GitHub)" <gi...@apache.org>.
ankitsultana commented on code in PR #15943:
URL: https://github.com/apache/pinot/pull/15943#discussion_r2116686986
##########
pinot-query-planner/src/main/java/org/apache/pinot/query/planner/physical/v2/opt/rules/RootExchangeInsertRule.java:
##########
@@ -0,0 +1,78 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.pinot.query.planner.physical.v2.opt.rules;
+
+import java.util.List;
+import javax.annotation.Nullable;
+import org.apache.calcite.rel.RelCollation;
+import org.apache.calcite.rel.RelDistribution;
+import org.apache.pinot.calcite.rel.traits.PinotExecStrategyTrait;
+import org.apache.pinot.query.context.PhysicalPlannerContext;
+import org.apache.pinot.query.planner.physical.v2.ExchangeStrategy;
+import org.apache.pinot.query.planner.physical.v2.PRelNode;
+import org.apache.pinot.query.planner.physical.v2.PinotDataDistribution;
+import org.apache.pinot.query.planner.physical.v2.nodes.PhysicalExchange;
+import org.apache.pinot.query.planner.physical.v2.opt.PRelNodeTransformer;
+
+
+/**
+ * Adds an exchange node at the root of the plan if the root node is not already located as a singleton on the broker.
+ * This is because the entire data needs to be returned by the broker to the client.
+ */
+public class RootExchangeInsertRule implements PRelNodeTransformer {
+ private final PhysicalPlannerContext _context;
+
+ public RootExchangeInsertRule(PhysicalPlannerContext context) {
+ _context = context;
+ }
+
+ @Override
+ public PRelNode execute(PRelNode currentNode) {
+ PinotDataDistribution rootDataDistribution = currentNode.getPinotDataDistributionOrThrow();
+ List<String> workers = List.of(brokerWorkerId());
+ if (rootDataDistribution.getWorkers().equals(workers)) {
Review Comment:
You mean `rootDataDistribution.getWorkers()` might be null? That's not possible (also note that workers in PDD is not marked as nullable).
Also, `rootDataDistribution` can't be null because I am using `getPinotDataDistributionOrThrow`
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org
For additional commands, e-mail: commits-help@pinot.apache.org
Re: [PR] [multistage] Cleanup Plan Fragmenter Logic [pinot]
Posted by "ankitsultana (via GitHub)" <gi...@apache.org>.
ankitsultana commented on code in PR #15943:
URL: https://github.com/apache/pinot/pull/15943#discussion_r2116704399
##########
pinot-query-planner/src/test/resources/queries/PhysicalOptimizerPlans.json:
##########
@@ -6,16 +6,17 @@
"sql": "SET usePhysicalOptimizer=true; EXPLAIN PLAN FOR SELECT a.col1, a.ts, b.col3 FROM a JOIN b ON a.col1 = b.col2 ORDER BY a.col1",
"output": [
"Execution Plan",
- "\nPhysicalSort(sort0=[$0], dir0=[ASC])",
Review Comment:
@shauryachats : can you also help with an eyeballing review of this file? Just want to make sure that the plans are not changing in any unexpected ways. (note: the expected change is that each plan will now have a top-level singleton exchange)
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org
For additional commands, e-mail: commits-help@pinot.apache.org
Re: [PR] [multistage] Cleanup Plan Fragmenter Logic [pinot]
Posted by "codecov-commenter (via GitHub)" <gi...@apache.org>.
codecov-commenter commented on PR #15943:
URL: https://github.com/apache/pinot/pull/15943#issuecomment-2921382552
## [Codecov](https://app.codecov.io/gh/apache/pinot/pull/15943?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) Report
Attention: Patch coverage is `94.11765%` with `2 lines` in your changes missing coverage. Please review.
> Project coverage is 56.51%. Comparing base [(`1a476de`)](https://app.codecov.io/gh/apache/pinot/commit/1a476dea72ebf1c15e14ded28ae60c385f71b2c3?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) to head [(`03b6f0a`)](https://app.codecov.io/gh/apache/pinot/commit/03b6f0afb1d7600bdb3f61e4be4d5d242c39a99e?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache).
> Report is 165 commits behind head on master.
| [Files with missing lines](https://app.codecov.io/gh/apache/pinot/pull/15943?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | Patch % | Lines |
|---|---|---|
| [.../physical/v2/opt/rules/RootExchangeInsertRule.java](https://app.codecov.io/gh/apache/pinot/pull/15943?src=pr&el=tree&filepath=pinot-query-planner%2Fsrc%2Fmain%2Fjava%2Forg%2Fapache%2Fpinot%2Fquery%2Fplanner%2Fphysical%2Fv2%2Fopt%2Frules%2FRootExchangeInsertRule.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-cGlub3QtcXVlcnktcGxhbm5lci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvcGlub3QvcXVlcnkvcGxhbm5lci9waHlzaWNhbC92Mi9vcHQvcnVsZXMvUm9vdEV4Y2hhbmdlSW5zZXJ0UnVsZS5qYXZh) | 87.50% | [1 Missing and 1 partial :warning: ](https://app.codecov.io/gh/apache/pinot/pull/15943?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) |
> :exclamation: There is a different number of reports uploaded between BASE (1a476de) and HEAD (03b6f0a). Click for more details.
>
> <details><summary>HEAD has 68 uploads less than BASE</summary>
>
>| Flag | BASE (1a476de) | HEAD (03b6f0a) |
>|------|------|------|
>|java-21|10|1|
>|unittests|6|1|
>|unittests1|3|1|
>|skip-bytebuffers-true|4|0|
>|temurin|15|1|
>|unittests2|3|0|
>|skip-bytebuffers-false|8|0|
>|java-11|5|0|
>|integration|9|0|
>|integration2|3|0|
>|integration1|3|0|
>|custom-integration1|3|0|
></details>
<details><summary>Additional details and impacted files</summary>
```diff
@@ Coverage Diff @@
## master #15943 +/- ##
============================================
- Coverage 62.90% 56.51% -6.39%
+ Complexity 1386 690 -696
============================================
Files 2867 2270 -597
Lines 163354 123829 -39525
Branches 24952 19730 -5222
============================================
- Hits 102755 69988 -32767
+ Misses 52847 48049 -4798
+ Partials 7752 5792 -1960
```
| [Flag](https://app.codecov.io/gh/apache/pinot/pull/15943/flags?src=pr&el=flags&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | Coverage Δ | |
|---|---|---|
| [custom-integration1](https://app.codecov.io/gh/apache/pinot/pull/15943/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `?` | |
| [integration](https://app.codecov.io/gh/apache/pinot/pull/15943/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `?` | |
| [integration1](https://app.codecov.io/gh/apache/pinot/pull/15943/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `?` | |
| [integration2](https://app.codecov.io/gh/apache/pinot/pull/15943/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `?` | |
| [java-11](https://app.codecov.io/gh/apache/pinot/pull/15943/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `?` | |
| [java-21](https://app.codecov.io/gh/apache/pinot/pull/15943/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `56.51% <94.11%> (-6.31%)` | :arrow_down: |
| [skip-bytebuffers-false](https://app.codecov.io/gh/apache/pinot/pull/15943/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `?` | |
| [skip-bytebuffers-true](https://app.codecov.io/gh/apache/pinot/pull/15943/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `?` | |
| [temurin](https://app.codecov.io/gh/apache/pinot/pull/15943/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `56.51% <94.11%> (-6.39%)` | :arrow_down: |
| [unittests](https://app.codecov.io/gh/apache/pinot/pull/15943/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `56.51% <94.11%> (-6.38%)` | :arrow_down: |
| [unittests1](https://app.codecov.io/gh/apache/pinot/pull/15943/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `56.51% <94.11%> (+0.69%)` | :arrow_up: |
| [unittests2](https://app.codecov.io/gh/apache/pinot/pull/15943/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `?` | |
Flags with carried forward coverage won't be shown. [Click here](https://docs.codecov.io/docs/carryforward-flags?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#carryforward-flags-in-the-pull-request-comment) to find out more.
</details>
[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/apache/pinot/pull/15943?dropdown=coverage&src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache).
:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache).
<details><summary> :rocket: New features to boost your workflow: </summary>
- :package: [JS Bundle Analysis](https://docs.codecov.com/docs/javascript-bundle-analysis): Save yourself from yourself by tracking and limiting bundle sizes in JS merges.
</details>
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org
For additional commands, e-mail: commits-help@pinot.apache.org
Re: [PR] [multistage] Cleanup Plan Fragmenter Logic + Mailbox Receive Sort Fixes [pinot]
Posted by "itschrispeck (via GitHub)" <gi...@apache.org>.
itschrispeck merged PR #15943:
URL: https://github.com/apache/pinot/pull/15943
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org
For additional commands, e-mail: commits-help@pinot.apache.org