Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Set filter to preloading data source for partition pruning #7382

Closed

Conversation

zhli1142015
Copy link
Contributor

Fixes #7381

Copy link

netlify bot commented Nov 2, 2023

Deploy Preview for meta-velox canceled.

Name Link
🔨 Latest commit 2e7e7d6
🔍 Latest deploy log https://app.netlify.com/sites/meta-velox/deploys/659f52eb47a58800080e3b07

@facebook-github-bot facebook-github-bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Nov 2, 2023
Copy link
Contributor

@Yuhta Yuhta left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the fix, is it possible to add a unit test?

@@ -92,6 +92,7 @@ RowVectorPtr TableScan::getOutput() {

if (!split.hasConnectorSplit()) {
noMoreSplits_ = true;
pendingDynamicFilters_.clear();
Copy link
Contributor

@Yuhta Yuhta Nov 2, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's easier to follow that we clear the pending filters after passing them to data source

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

pendingDynamicFilters_ is used in preload to intitalize different data source object for preloading splits, I think it should be clear after no more splits. Thanks.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Emm I see what you want to do. But merging filters on every split could cause performance regression. I think we need to do it a little differently. Maybe when we do the preload, we should pass in the scan spec from the current dataSource_ to use in preloading data source as well.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hello @Yuhta ,
I tried this proposal, the scanSpec_ can't be used by multi threads same time, even only the filter_ field in ScanSpec.
For your concern about merging filters on every split, I add two APIs in DataSource to get and set the filter for the specific outputChannel, then we only need to set the merged filters to the preloading data sources. This should avoid this problem.
Please help to chekc again, thanks.

@zhli1142015
Copy link
Contributor Author

Thanks for the fix, is it possible to add a unit test?

Add a UT to assert the split skipping happens in preloaded splits. Thanks.

@zhli1142015 zhli1142015 requested a review from Yuhta November 6, 2023 03:19
@zhli1142015
Copy link
Contributor Author

Hello @Yuhta , could you please check again?

@zhli1142015 zhli1142015 force-pushed the minor-fix-for-preloading branch from 31e1c06 to 3c81cf6 Compare November 11, 2023 14:19
@@ -256,6 +259,7 @@ void TableScan::preload(std::shared_ptr<connector::ConnectorSplit> split) {
ctx = operatorCtx_->createConnectorQueryCtx(
split->connectorId, planNodeId(), connectorPool_),
task = operatorCtx_->task(),
&mergedDynamicFilters = mergedDynamicFilters_,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we make this a shared_ptr to be safe?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changed, thanks.

std::unique_ptr<common::Filter> getFilter(
column_index_t outputChannel) override {
auto& fieldSpec = scanSpec_->getChildByChannel(outputChannel);
return fieldSpec.filter()->clone();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The filter should be MT safe as far as I see, all the methods should be read only. Can you try using a shared_ptr<const Filter> to avoid deep copy?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, you are right, changed.

@zhli1142015 zhli1142015 requested a review from Yuhta November 29, 2023 01:34
@zhli1142015
Copy link
Contributor Author

Hello @Yuhta ,
I addressed all comments, could you please continue to take a look?
Thanks.

@facebook-github-bot
Copy link
Contributor

@Yuhta has imported this pull request. If you are a Meta employee, you can view this diff on Phabricator.

@zhli1142015 zhli1142015 force-pushed the minor-fix-for-preloading branch from 02ae0ca to e2560ed Compare December 6, 2023 04:20
@zhli1142015
Copy link
Contributor Author

The fuzzer failure looks realted to #7856

I20231206 04:56:20.786527 29572 ExpressionVerifier.cpp:97] Executing expression 0 : try(translate(regex_replace("c0",md5("c1"),Y`%2&fl*ZC`d`"F@-j/T2),"c0",^>XIvcHADU#jT[eE&6[JR1gy$vj!4W%9~RUE/W`>Jq,hRy4xUWdOSg-jI))
E20231206 04:56:20.811030 29572 Exceptions.h:69] Line: ../../velox/expression/tests/ExpressionVerifier.cpp:77, Function:operator(), Expression: left->equalValueAt(right.get(), row, row) Different results at idx '0': '[0->71] null' vs. '^>XI>cHADU#jT[eE&6[JJ1gy$vA!y#%9#RUEyg`>JARhgy4jU[dOeg-jj-E`EjJ&1J19`', Source: RUNTIME, ErrorCode: INVALID_STATE

@@ -226,6 +226,17 @@ class DataSource {
virtual int64_t estimatedRowSize() {
return kUnknownRowSize;
}

virtual std::shared_ptr<common::Filter> getFilter(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This PR changes the Connector API. Please, update PR description to describe the changes and add comments for the newly introduced APIs.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated, thanks.

}
})
.run();
FLAGS_split_preload_per_driver = oldSplitPreload;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is an anti-pattern. Use RAII.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated, thanks.

@zhli1142015 zhli1142015 changed the title Add dynamic filter for preloading data source Set filter to preloading data source for partition pruning Dec 7, 2023
// Sets the filter to the column identified by @param outputChannel.
// This can be called when passing the column filters to a preloading data
// source. The purpose of this is to avoid the overhead of filters merging.
virtual void setColumnFilter(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How is this different from addDynamicFilter? Having these two APIs is confusing. Please, update PR description to provide overall context for this change.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The problem to solve in this PR is passing the dynamic filters to preloading data sources, which are used for partition pruning.
Ininitially I use addDynamicFilter to passe the filters from dataSource_ to preloading data sources, Yuta mentioned merging the filters for every split would cause perf regression, #7382 (comment). Then I added these two methods to get and set filters directly (without merging). Please let me know if any suggestion about this.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@zhli1142015 Thank you for this additional context. Is there a GitHub issue about this? Sounds like we need to iterate on the design a bit and it will be easier to do in a GitHub issue.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@zhli1142015 For example, it is still not clear to me why we need a new setColumnFilter when we already have addDynamicFilter. These 2 APIs seem to provide exactly same information.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

#7381, here is the issue I opened.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@zhli1142015 Please, open a GitHub issue and describe the use case you are looking to enabling and the details of the design you are proposing. Thanks.


// Generic RAII class to update GFlag.
template <typename T>
class FlagUpdater {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe ScopedGFlag?

const int32_t numSplits = 5;
std::vector<RowVectorPtr> probeVectors;
probeVectors.reserve(numSplits);
FlagUpdater(FLAGS_split_preload_per_driver, 3);
Copy link
Contributor

@mbasmanova mbasmanova Dec 7, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are there other tests that use split_preload_per_driver flag and therefore need to be updated to use the new RAII class? If so, would you extract the RAII into a separate PR and updating existing tests?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this need to be a GFlag? Can it be a configuration property instead? CC: @xiaoxmeng

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This flag is used also in PrintPlanWithStatsTest and TableScanTest. I think this should be converted to a configuration, but I think we can't remove the flag as it's already used in Gluten, https://github.com/oap-project/gluten/blob/main/cpp/velox/compute/VeloxBackend.cc#L53C15-L53C39

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Got it. Let's make a new PR to replace this gflag with a configuration property. Then come back to this PR.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, get it.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

#7931, thanks.

@zhli1142015 zhli1142015 force-pushed the minor-fix-for-preloading branch 2 times, most recently from 775bad0 to fd58569 Compare December 11, 2023 02:31
@zhli1142015
Copy link
Contributor Author

The failure should be not related to this change, thanks.

I20231211 03:18:16.575408 29965 AggregationFuzzer.cpp:870] ==============================> Started iteration 30 (seed: 3731594752)
terminate called after throwing an instance of 'facebook::velox::dwio::common::exception::LoggedException'
  what():  Exception: VeloxException
Error Source: RUNTIME
Error Code: UNKNOWN
Reason: not supported yet HUGEINT
Retriable: False
Function: create
File: ../../velox/dwio/dwrf/writer/ColumnWriter.cpp
Line: 2082
Stack trace:
# 0  _ZN8facebook5velox7process10StackTraceC1Ei
# 1  _ZN8facebook5velox14VeloxException5State4makeIZNS1_C4EPKcmS5_St17basic_string_viewIcSt11char_traitsIcEES9_S9_S9_bNS1_4TypeES9_EUlRT_E_EESt10shared_ptrIKS2_ESA_SB_
# 2  _ZN8facebook5velox14VeloxExceptionC1EPKcmS3_St17basic_string_viewIcSt11char_traitsIcEES7_S7_S7_bNS1_4TypeES7_
# 3  _ZN8facebook5velox4dwio6common9exception15LoggedExceptionC1EPKcmS6_S6_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESE_SE_
# 4  _ZN8facebook5velox4dwrf16BaseColumnWriter6createERNS1_13WriterContextERKNS0_4dwio6common10TypeWithIdEjSt8functionIFvRNS1_12IndexBuilderEEE
# 5  _ZN8facebook5velox4dwrf16BaseColumnWriter6createERNS1_13WriterContextERKNS0_4dwio6common10TypeWithIdEjSt8functionIFvRNS1_12IndexBuilderEEE
# 6  _ZN8facebook5velox4dwrf6WriterC2ESt10unique_ptrINS0_4dwio6common8FileSinkESt14default_deleteIS6_EERKNS1_13WriterOptionsESt10shared_ptrINS0_6memory10MemoryPoolEE
# 7  _ZN8facebook5velox4dwrf6WriterC1ESt10unique_ptrINS0_4dwio6common8FileSinkESt14default_deleteIS6_EERKNS1_13WriterOptionsE
# 8  _ZN8facebook5velox4exec4test12_GLOBAL__N_112_GLOBAL__N_111writeToFileERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS0_10BaseVectorEEPNS0_6memory10MemoryPoolE
# 9  _ZN8facebook5velox4exec4test12_GLOBAL__N_117AggregationFuzzer10makeSplitsERKSt6vectorISt10shared_ptrINS0_9RowVectorEESaIS8_EERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
# 10 _ZN8facebook5velox4exec4test12_GLOBAL__N_117AggregationFuzzer17verifyAggregationERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EESF_SF_RKS5_ISt10shared_ptrINS0_9RowVectorEESaISI_EEbRKS5_ISG_INS2_14ResultVerifierEESaISO_EE
# 11 _ZN8facebook5velox4exec4test12_GLOBAL__N_117AggregationFuzzer2goEv
# 12 _ZN8facebook5velox4exec4test15aggregateFuzzerESt13unordered_mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt6vectorISt10shared_ptrINS1_26AggregateFunctionSignatureEESaISD_EESt4hashIS9_ESt8equal_toIS9_ESaISt4pairIKS9_SF_EEEmRKS3_IS9_SB_INS2_14ResultVerifierEESH_SJ_SaISK_ISL_SQ_EEERKS3_IS9_SB_INS2_14InputGeneratorEESH_SJ_SaISK_ISL_SX_EEENS0_12VectorFuzzer7Options18TimestampPrecisionERKS3_IS9_S9_SH_SJ_SaISK_ISL_S9_EEERKSt8optionalIS9_ESt10unique_ptrINS2_20ReferenceQueryRunnerESt14default_deleteIS1G_EE
# 13 _ZN8facebook5velox4exec4test23AggregationFuzzerRunner9runFuzzerEmRKSt8optionalINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEESt10unique_ptrINS2_20ReferenceQueryRunnerESt14default_deleteISF_EERKNS3_7OptionsE
# 14 _ZN8facebook5velox4exec4test23AggregationFuzzerRunner3runEmSt10unique_ptrINS2_20ReferenceQueryRunnerESt14default_deleteIS5_EERKNS3_7OptionsE
# 15 main
# 16 __libc_start_main
# 17 _start

@zhli1142015
Copy link
Contributor Author

@mbasmanova and @Yuhta , could you please help to review this PR? I made the change according to the comment: #7381 (comment)

@zhli1142015 zhli1142015 force-pushed the minor-fix-for-preloading branch from fd58569 to f43a912 Compare December 12, 2023 06:10
void addDynamicFilter(
column_index_t outputChannel,
const std::shared_ptr<common::Filter>& filter,
const bool isMergedFilter) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: No need to const qualify this

ScanSpec& getChildByChannel(column_index_t channel);
ScanSpec& getChildByChannel(column_index_t channel) const;

std::shared_ptr<common::Filter> getFilterByChannel(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

const std::shared_ptr<common::Filter>&

@@ -476,6 +476,18 @@ HiveDataSource::HiveDataSource(

readerOpts_.setFileSchema(hiveTableHandle_->dataColumns());
ioStats_ = std::make_shared<io::IoStatistics>();
for (const auto& entry : tableHandle->dynamicFilters()) {
Copy link
Contributor

@Yuhta Yuhta Dec 15, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We need to be careful about reseting the filters on ScanSpec. This should be done very rarely as it requires reset of the stats and order of the filters. We should keep the filters in scan spec as the golden source and only change it when really needed, and in table handle just keep some references/shared_ptr to them, not the reverse.

@zhli1142015 zhli1142015 force-pushed the minor-fix-for-preloading branch 2 times, most recently from 7c025fc to 18d392a Compare December 18, 2023 02:35
getChildByChannel(channel).addFilter(filter);
}

void setChildFilterByChannel(column_index_t channel, common::Filter& filter) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Take shared_ptr to avoid deep copy

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated, thanks.

@@ -71,6 +71,11 @@ class HiveDataSource : public DataSource {

int64_t estimatedRowSize() override;

std::shared_ptr<common::Filter> getColumnFilter(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

const std::shared_ptr<common::Filter>&

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated, thanks.

@zhli1142015 zhli1142015 force-pushed the minor-fix-for-preloading branch from 18d392a to 393334f Compare December 19, 2023 03:20
@zhli1142015 zhli1142015 force-pushed the minor-fix-for-preloading branch from 80d272c to 2181731 Compare January 5, 2024 07:02
@zhli1142015
Copy link
Contributor Author

@zhli1142015

I have no evidence to prove that this is an issue. On the contrary, within our internal repo, we use the existing addDynamicFilter, and in our testing, we haven't observed any problems. The reason for doing this is because of this comment #7382 (comment). I assumed this approach was taken due to some presto limitation not spark side. If we can call existing addDynamicFilter for preloading sources, then change should be simple and understandable enough.

Thank you for clarifying.

But merging filters on every split could cause performance regression.

@Yuhta Jimmy, looks like this may not be an issue. Trying to optimize for this hypothetical problem leads to pretty convoluted code. Perhaps, we don't need that can use a simpler alternative instead.

Hello @mbasmanova ,
I change this PR back to utilize existing addDynamicFilter fucntion, could you please help check?
Thanks.

@@ -256,6 +256,7 @@ void TableScan::preload(std::shared_ptr<connector::ConnectorSplit> split) {
ctx = operatorCtx_->createConnectorQueryCtx(
split->connectorId, planNodeId(), connectorPool_),
task = operatorCtx_->task(),
&pendingDynamicFilters = pendingDynamicFilters_,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need a reference here? We pass everything else by value.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for catching this, we should pass by value here

ColumnHandleMap assignments = {
{"n1_0", regularColumn("c0", BIGINT())},
{"n1_1", regularColumn("c1", BIGINT())},
{"n1_2", partitionKey("k", BIGINT())}};
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it important to use partition keys columns in this test? Would you explain why?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, we expect dynamic filters on the partition column to be generated. This way, we can verify whether the dynamic filter is passed to the preloaded data source by checking if the split is skipped during processing.

.verifier([&](const std::shared_ptr<Task>& task, bool hasSpill) {
SCOPED_TRACE(fmt::format("hasSpill:{}", hasSpill));
if (!hasSpill) {
ASSERT_EQ(1, getFiltersProduced(task, 1).sum);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is error prone to use hard-coded operator indices here. Can we use plan node IDs instead? We have probeScanId and we can also capture join node ID. We can then get stats via toPlanStats.

std::unordered_map<core::PlanNodeId, PlanNodeStats> toPlanStats(
    const TaskStats& taskStats);

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated.

};
};
auto outputType =
ROW({"n1_0", "n1_1", "n1_2"}, {BIGINT(), BIGINT(), BIGINT()});
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These column names are hard to read. By convention, we use t0, t1, ... and u0, u1, ..... You can specify column names as first argument of makeRowVector.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated, thanks.

Copy link
Contributor

@mbasmanova mbasmanova left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good % some questions about the test.

Copy link
Contributor

@mbasmanova mbasmanova left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good % some minor comments.

std::vector<exec::Split> probeSplits;
for (int32_t i = 0; i < numSplits; ++i) {
auto value = std::to_string(i);
auto split = facebook::velox::exec::test::HiveConnectorSplitBuilder(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

drop facebook::velox::exec::test::

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated.

HashJoinBuilder(*pool_, duckDbQueryRunner_, driverExecutor_.get())
.planNode(std::move(op))
.config(core::QueryConfig::kMaxSplitPreloadPerDriver, "3")
.makeInputSplits(makeInputSplits(probeScanId))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this code is confusing as makeInputSplits is repeated twice; would you use .inputSplits(probeSplits) instead and remove makeInputSplits lambda from this test?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated, thanks.

Copy link
Contributor

@mbasmanova mbasmanova left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks.

// Executing the join with p1=b0, we expect a dynamic filter for p1 to prune
// the entire file/split. There are total of five splits, and all except the
// first one are expected to be pruned. The result 'preloadedSplits' > 1
// confirms the successful push of dynamic filters to the preloading data
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice comment.

// first one are expected to be pruned. The result 'preloadedSplits' > 1
// confirms the successful push of dynamic filters to the preloading data
// source.
core::PlanNodeId probeScanId, joinNodeId;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

define each variable separately

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated, thanks.

.capturePlanNodeId(joinNodeId)
.project({"p0"})
.planNode();
SplitInput splits = {{probeScanId, probeSplits}};
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

no need for this variable

.splits({{probeScanId, probeSplits}})

@facebook-github-bot
Copy link
Contributor

@mbasmanova has imported this pull request. If you are a Meta employee, you can view this diff on Phabricator.

1 similar comment
@facebook-github-bot
Copy link
Contributor

@mbasmanova has imported this pull request. If you are a Meta employee, you can view this diff on Phabricator.

@zhli1142015
Copy link
Contributor Author

Hello @mbasmanova ,
Looks CI failed in internal tests, please let me know if any fix needed, thanks.

@mbasmanova
Copy link
Contributor

@zhli1142015 Would you rebase?

@zhli1142015 zhli1142015 force-pushed the minor-fix-for-preloading branch from 1a18867 to 2e7e7d6 Compare January 11, 2024 02:31
@zhli1142015
Copy link
Contributor Author

@zhli1142015 Would you rebase?

Done, thanks.

@facebook-github-bot
Copy link
Contributor

@mbasmanova has imported this pull request. If you are a Meta employee, you can view this diff on Phabricator.

@facebook-github-bot
Copy link
Contributor

@mbasmanova merged this pull request in ef97b5f.

Copy link

Conbench analyzed the 1 benchmark run on commit ef97b5f7.

There were no benchmark performance regressions. 🎉

The full Conbench report has more details.

liujiayi771 pushed a commit to liujiayi771/velox that referenced this pull request Jan 16, 2024
…ncubator#7382)

Summary:
Fixes facebookincubator#7381

Pull Request resolved: facebookincubator#7382

Reviewed By: xiaoxmeng

Differential Revision: D51857062

Pulled By: mbasmanova

fbshipit-source-id: bc97ee22fcc5b2fbde37666929fdc718fd876ef9
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. Merged
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Add dynamic filter for preloading data source
4 participants