GH-38597: [C++] Implement GetFileInfo(selector) for Azure filesystem - #39009

Merged
felipecrv merged 13 commits into
apache:mainfrom
felipecrv:azure_selector
Dec 8, 2023
Merged

GH-38597: [C++] Implement GetFileInfo(selector) for Azure filesystem#39009
felipecrv merged 13 commits into
apache:mainfrom
felipecrv:azure_selector

Conversation

@felipecrv

@felipecrvfelipecrv commented Nov 30, 2023

Copy link
Copy Markdown
Contributor

Rationale for this change

Part of Azure FS implementation.

What changes are included in this PR?

The version of GetFileInfo that takes a prefix and can optionally recurse into directories.

Are these changes tested?

By unit tests present in this PR. Separate from this PR, I'm thinking of way to fuzz-test the FS API.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

@kou@Tom-Newton

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

TODO:

  • Leverage hierarchical support if enabled for the account
  • Introduce an explicit std::stack to remove stack overflow risk when listing very deep filesystems

@felipecrv
felipecrv requested a review from kouNovember 30, 2023 18:05

@koukou left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

(I'll review GetFileInfoWithSelector() and GetFileInfoWithSelectorFromContainer() logic carefully later.)

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment on lines 861 to 866

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

How about moving this to path_util.{cc,h}?
Because extracting basename from a path is a generic path operation.
We will be able to use GetAbstractPathParent() to implement this like return GetAbstractPathParent(s).second;.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

+1 for factoring out generic path operations, and also unit-test them.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

The problem with path_util.h functions is that they don't follow any concept of path normalization for inputs and have to check the input for many variations, this BasenameView works well in this context, but not in a general context.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I'm changing it to this:

static std::string_view BasenameView(std::string_view s) {
DCHECK(!internal::HasTrailingSlash(s));
auto offset = s.find_last_of(internal::kSep);
auto result = (offset == std::string_view::npos) ? s : s.substr(offset);
DCHECK(!result.empty() && result.back() != internal::kSep);
return result;
}

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/path_util.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment on lines 1333 to 1403

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I don't object them but why do you want to specify them explicitly?
Our other methods don't specify them explicitly. (They use the default value.)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I want all the wiring to be in place if we need to specify the page_size_hint which I'm pretty sure we will need to tweak when this is used in practice.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Should we pass page_size_hint here too?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

page_size_hint only applies to the pagination of blobs. If I were to pass page size here, it would be a separate constant, but I thought this would be an overkill.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated

@koukouDec 3, 2023

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Is this really happen?
emptydir/ is a case of this in the test, right?
In this case, emptydir/ may exist in Blobs (with options.Prefix = emptydir/) or BlobPrefixes (with no options.Prefix) but doesn't exit in both of them. (I checked this with gdb.)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

This is the direction the whole implementation will move towards. CreateDir should create a marker blob, so we can check that an empty directory exists after it's created or after its contents are deleted.

As @pitrou said in another comment, all the Filesystem implementations should behave the same way.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Can we use ListBlobs() instead when select.max_recursion == INT32_MAX as an optimization?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

That would require that we build a trie of all the blob names to list them hierarchically. I'm open to doing it, but I think we can delay doing it until there is clear indication that it would help a concrete use-case.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
@Tom-Newton

Copy link
Copy Markdown
Contributor

I reviewed the tests, so I'm happy with the behaviour. I haven't had a chance to understand and review the implementation yet.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

General question: was it considered to have a namespace alias at the top of this file such as namespace BlobsModels = Azure::Storage::Blobs::Models;?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Something I prefer to do once all PRs land because it would be a noisy change.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/test_util.h Outdated
@felipecrv

Copy link
Copy Markdown
ContributorAuthor

I rebased to fix a conflict, but the new changes are on the last two commits.

@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Dec 5, 2023
@felipecrv
felipecrv requested review from kou and pitrouDecember 5, 2023 02:02
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting committer review Awaiting committer review awaiting changes Awaiting changes labels Dec 5, 2023
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
@github-actionsgithub-actionsBot added awaiting review Awaiting review awaiting changes Awaiting changes awaiting committer review Awaiting committer review and removed awaiting change review Awaiting change review awaiting review Awaiting review awaiting changes Awaiting changes awaiting committer review Awaiting committer review labels Dec 7, 2023
@github-actionsgithub-actionsBot added the awaiting changes Awaiting changes label Dec 8, 2023
kou
kou approved these changes Dec 8, 2023

@koukou left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

+1

Could you fix a lint failure?

Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting changes Awaiting changes labels Dec 8, 2023
@felipecrv

Copy link
Copy Markdown
ContributorAuthor

I will rebase and force-push to see if all CI passes now.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

CI failure is unrelated so I'm merging this.

@felipecrv
felipecrv merged commit 476c78f into apache:mainDec 8, 2023
@felipecrv
felipecrv deleted the azure_selector branch December 8, 2023 18:48
@kou

kou commented Dec 8, 2023

Copy link
Copy Markdown
Member

@felipecrv Did you use our merge script?
https://github.com/apache/arrow/tree/main/dev#how-to-merge-a-pull-request

GH-38597's milestone isn't set. In general, it's set by the merge script.

@conbench-apache-arrow

Copy link
Copy Markdown

After merging your PR, Conbench analyzed the 6 benchmarking runs that have been run so far on merge-commit 476c78f.

There were no benchmark performance regressions. 🎉

The full Conbench report has more details. It also includes information about 32 possible false positives for unstable benchmarks that are known to sometimes produce them.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

@felipecrv Did you use our merge script? https://github.com/apache/arrow/tree/main/dev#how-to-merge-a-pull-request

GH-38597's milestone isn't set. In general, it's set by the merge script.

Oh no. Sorry. I had no idea. I will use it from now on. Anything we can do to make this right for this PR?

@kou

kou commented Dec 10, 2023

Copy link
Copy Markdown
Member

I set GH-37597's milestone manually. :-)

dgreiss pushed a commit to dgreiss/arrow that referenced this pull request Feb 19, 2024
…ystem (apache#39009)
### Rationale for this change
Part of Azure FS implementation.
### What changes are included in this PR?
The version of `GetFileInfo` that takes a prefix and can optionally
recurse into directories.
### Are these changes tested?
By unit tests present in this PR. Separate from this PR, I'm thinking of
way to fuzz-test the FS API.
* Closes: apache#38597
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[C++] Implement GetFileInfo selector for Azure filesystem

5 participants

@felipecrv@Tom-Newton@kou@bkietz@pitrou
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

GH-38597: [C++] Implement GetFileInfo(selector) for Azure filesystem - #39009

Merged
felipecrv merged 13 commits into
apache:mainfrom
felipecrv:azure_selector
Dec 8, 2023
Merged

GH-38597: [C++] Implement GetFileInfo(selector) for Azure filesystem#39009
felipecrv merged 13 commits into
apache:mainfrom
felipecrv:azure_selector

Conversation

@felipecrv

@felipecrvfelipecrv commented Nov 30, 2023

Copy link
Copy Markdown
Contributor

Rationale for this change

Part of Azure FS implementation.

What changes are included in this PR?

The version of GetFileInfo that takes a prefix and can optionally recurse into directories.

Are these changes tested?

By unit tests present in this PR. Separate from this PR, I'm thinking of way to fuzz-test the FS API.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

@kou@Tom-Newton

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

TODO:

  • Leverage hierarchical support if enabled for the account
  • Introduce an explicit std::stack to remove stack overflow risk when listing very deep filesystems

@felipecrv
felipecrv requested a review from kouNovember 30, 2023 18:05

@koukou left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

(I'll review GetFileInfoWithSelector() and GetFileInfoWithSelectorFromContainer() logic carefully later.)

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment on lines 861 to 866

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

How about moving this to path_util.{cc,h}?
Because extracting basename from a path is a generic path operation.
We will be able to use GetAbstractPathParent() to implement this like return GetAbstractPathParent(s).second;.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

+1 for factoring out generic path operations, and also unit-test them.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

The problem with path_util.h functions is that they don't follow any concept of path normalization for inputs and have to check the input for many variations, this BasenameView works well in this context, but not in a general context.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I'm changing it to this:

static std::string_view BasenameView(std::string_view s) {
DCHECK(!internal::HasTrailingSlash(s));
auto offset = s.find_last_of(internal::kSep);
auto result = (offset == std::string_view::npos) ? s : s.substr(offset);
DCHECK(!result.empty() && result.back() != internal::kSep);
return result;
}

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/path_util.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment on lines 1333 to 1403

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I don't object them but why do you want to specify them explicitly?
Our other methods don't specify them explicitly. (They use the default value.)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I want all the wiring to be in place if we need to specify the page_size_hint which I'm pretty sure we will need to tweak when this is used in practice.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Should we pass page_size_hint here too?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

page_size_hint only applies to the pagination of blobs. If I were to pass page size here, it would be a separate constant, but I thought this would be an overkill.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated

@koukouDec 3, 2023

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Is this really happen?
emptydir/ is a case of this in the test, right?
In this case, emptydir/ may exist in Blobs (with options.Prefix = emptydir/) or BlobPrefixes (with no options.Prefix) but doesn't exit in both of them. (I checked this with gdb.)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

This is the direction the whole implementation will move towards. CreateDir should create a marker blob, so we can check that an empty directory exists after it's created or after its contents are deleted.

As @pitrou said in another comment, all the Filesystem implementations should behave the same way.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Can we use ListBlobs() instead when select.max_recursion == INT32_MAX as an optimization?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

That would require that we build a trie of all the blob names to list them hierarchically. I'm open to doing it, but I think we can delay doing it until there is clear indication that it would help a concrete use-case.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
@Tom-Newton

Copy link
Copy Markdown
Contributor

I reviewed the tests, so I'm happy with the behaviour. I haven't had a chance to understand and review the implementation yet.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

General question: was it considered to have a namespace alias at the top of this file such as namespace BlobsModels = Azure::Storage::Blobs::Models;?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Something I prefer to do once all PRs land because it would be a noisy change.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/test_util.h Outdated
@felipecrv

Copy link
Copy Markdown
ContributorAuthor

I rebased to fix a conflict, but the new changes are on the last two commits.

@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Dec 5, 2023
@felipecrv
felipecrv requested review from kou and pitrouDecember 5, 2023 02:02
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting committer review Awaiting committer review awaiting changes Awaiting changes labels Dec 5, 2023
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
@github-actionsgithub-actionsBot added awaiting review Awaiting review awaiting changes Awaiting changes awaiting committer review Awaiting committer review and removed awaiting change review Awaiting change review awaiting review Awaiting review awaiting changes Awaiting changes awaiting committer review Awaiting committer review labels Dec 7, 2023
@github-actionsgithub-actionsBot added the awaiting changes Awaiting changes label Dec 8, 2023
kou
kou approved these changes Dec 8, 2023

@koukou left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

+1

Could you fix a lint failure?

Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting changes Awaiting changes labels Dec 8, 2023
@felipecrv

Copy link
Copy Markdown
ContributorAuthor

I will rebase and force-push to see if all CI passes now.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

CI failure is unrelated so I'm merging this.

@felipecrv
felipecrv merged commit 476c78f into apache:mainDec 8, 2023
@felipecrv
felipecrv deleted the azure_selector branch December 8, 2023 18:48
@kou

kou commented Dec 8, 2023

Copy link
Copy Markdown
Member

@felipecrv Did you use our merge script?
https://github.com/apache/arrow/tree/main/dev#how-to-merge-a-pull-request

GH-38597's milestone isn't set. In general, it's set by the merge script.

@conbench-apache-arrow

Copy link
Copy Markdown

After merging your PR, Conbench analyzed the 6 benchmarking runs that have been run so far on merge-commit 476c78f.

There were no benchmark performance regressions. 🎉

The full Conbench report has more details. It also includes information about 32 possible false positives for unstable benchmarks that are known to sometimes produce them.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

@felipecrv Did you use our merge script? https://github.com/apache/arrow/tree/main/dev#how-to-merge-a-pull-request

GH-38597's milestone isn't set. In general, it's set by the merge script.

Oh no. Sorry. I had no idea. I will use it from now on. Anything we can do to make this right for this PR?

@kou

kou commented Dec 10, 2023

Copy link
Copy Markdown
Member

I set GH-37597's milestone manually. :-)

dgreiss pushed a commit to dgreiss/arrow that referenced this pull request Feb 19, 2024
…ystem (apache#39009)
### Rationale for this change
Part of Azure FS implementation.
### What changes are included in this PR?
The version of `GetFileInfo` that takes a prefix and can optionally
recurse into directories.
### Are these changes tested?
By unit tests present in this PR. Separate from this PR, I'm thinking of
way to fuzz-test the FS API.
* Closes: apache#38597
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[C++] Implement GetFileInfo selector for Azure filesystem

5 participants

@felipecrv@Tom-Newton@kou@bkietz@pitrou
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

GH-38597: [C++] Implement GetFileInfo(selector) for Azure filesystem - #39009

Merged
felipecrv merged 13 commits into
apache:mainfrom
felipecrv:azure_selector
Dec 8, 2023
Merged

GH-38597: [C++] Implement GetFileInfo(selector) for Azure filesystem#39009
felipecrv merged 13 commits into
apache:mainfrom
felipecrv:azure_selector

Conversation

@felipecrv

@felipecrvfelipecrv commented Nov 30, 2023

Copy link
Copy Markdown
Contributor

Rationale for this change

Part of Azure FS implementation.

What changes are included in this PR?

The version of GetFileInfo that takes a prefix and can optionally recurse into directories.

Are these changes tested?

By unit tests present in this PR. Separate from this PR, I'm thinking of way to fuzz-test the FS API.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

@kou@Tom-Newton

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

TODO:

  • Leverage hierarchical support if enabled for the account
  • Introduce an explicit std::stack to remove stack overflow risk when listing very deep filesystems

@felipecrv
felipecrv requested a review from kouNovember 30, 2023 18:05

@koukou left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

(I'll review GetFileInfoWithSelector() and GetFileInfoWithSelectorFromContainer() logic carefully later.)

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment on lines 861 to 866

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

How about moving this to path_util.{cc,h}?
Because extracting basename from a path is a generic path operation.
We will be able to use GetAbstractPathParent() to implement this like return GetAbstractPathParent(s).second;.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

+1 for factoring out generic path operations, and also unit-test them.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

The problem with path_util.h functions is that they don't follow any concept of path normalization for inputs and have to check the input for many variations, this BasenameView works well in this context, but not in a general context.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I'm changing it to this:

static std::string_view BasenameView(std::string_view s) {
DCHECK(!internal::HasTrailingSlash(s));
auto offset = s.find_last_of(internal::kSep);
auto result = (offset == std::string_view::npos) ? s : s.substr(offset);
DCHECK(!result.empty() && result.back() != internal::kSep);
return result;
}

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/path_util.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment on lines 1333 to 1403

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I don't object them but why do you want to specify them explicitly?
Our other methods don't specify them explicitly. (They use the default value.)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I want all the wiring to be in place if we need to specify the page_size_hint which I'm pretty sure we will need to tweak when this is used in practice.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Should we pass page_size_hint here too?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

page_size_hint only applies to the pagination of blobs. If I were to pass page size here, it would be a separate constant, but I thought this would be an overkill.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated

@koukouDec 3, 2023

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Is this really happen?
emptydir/ is a case of this in the test, right?
In this case, emptydir/ may exist in Blobs (with options.Prefix = emptydir/) or BlobPrefixes (with no options.Prefix) but doesn't exit in both of them. (I checked this with gdb.)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

This is the direction the whole implementation will move towards. CreateDir should create a marker blob, so we can check that an empty directory exists after it's created or after its contents are deleted.

As @pitrou said in another comment, all the Filesystem implementations should behave the same way.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Can we use ListBlobs() instead when select.max_recursion == INT32_MAX as an optimization?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

That would require that we build a trie of all the blob names to list them hierarchically. I'm open to doing it, but I think we can delay doing it until there is clear indication that it would help a concrete use-case.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
@Tom-Newton

Copy link
Copy Markdown
Contributor

I reviewed the tests, so I'm happy with the behaviour. I haven't had a chance to understand and review the implementation yet.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

General question: was it considered to have a namespace alias at the top of this file such as namespace BlobsModels = Azure::Storage::Blobs::Models;?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Something I prefer to do once all PRs land because it would be a noisy change.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/test_util.h Outdated
@felipecrv

Copy link
Copy Markdown
ContributorAuthor

I rebased to fix a conflict, but the new changes are on the last two commits.

@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Dec 5, 2023
@felipecrv
felipecrv requested review from kou and pitrouDecember 5, 2023 02:02
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting committer review Awaiting committer review awaiting changes Awaiting changes labels Dec 5, 2023
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
@github-actionsgithub-actionsBot added awaiting review Awaiting review awaiting changes Awaiting changes awaiting committer review Awaiting committer review and removed awaiting change review Awaiting change review awaiting review Awaiting review awaiting changes Awaiting changes awaiting committer review Awaiting committer review labels Dec 7, 2023
@github-actionsgithub-actionsBot added the awaiting changes Awaiting changes label Dec 8, 2023
kou
kou approved these changes Dec 8, 2023

@koukou left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

+1

Could you fix a lint failure?

Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting changes Awaiting changes labels Dec 8, 2023
@felipecrv

Copy link
Copy Markdown
ContributorAuthor

I will rebase and force-push to see if all CI passes now.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

CI failure is unrelated so I'm merging this.

@felipecrv
felipecrv merged commit 476c78f into apache:mainDec 8, 2023
@felipecrv
felipecrv deleted the azure_selector branch December 8, 2023 18:48
@kou

kou commented Dec 8, 2023

Copy link
Copy Markdown
Member

@felipecrv Did you use our merge script?
https://github.com/apache/arrow/tree/main/dev#how-to-merge-a-pull-request

GH-38597's milestone isn't set. In general, it's set by the merge script.

@conbench-apache-arrow

Copy link
Copy Markdown

After merging your PR, Conbench analyzed the 6 benchmarking runs that have been run so far on merge-commit 476c78f.

There were no benchmark performance regressions. 🎉

The full Conbench report has more details. It also includes information about 32 possible false positives for unstable benchmarks that are known to sometimes produce them.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

@felipecrv Did you use our merge script? https://github.com/apache/arrow/tree/main/dev#how-to-merge-a-pull-request

GH-38597's milestone isn't set. In general, it's set by the merge script.

Oh no. Sorry. I had no idea. I will use it from now on. Anything we can do to make this right for this PR?

@kou

kou commented Dec 10, 2023

Copy link
Copy Markdown
Member

I set GH-37597's milestone manually. :-)

dgreiss pushed a commit to dgreiss/arrow that referenced this pull request Feb 19, 2024
…ystem (apache#39009)
### Rationale for this change
Part of Azure FS implementation.
### What changes are included in this PR?
The version of `GetFileInfo` that takes a prefix and can optionally
recurse into directories.
### Are these changes tested?
By unit tests present in this PR. Separate from this PR, I'm thinking of
way to fuzz-test the FS API.
* Closes: apache#38597
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[C++] Implement GetFileInfo selector for Azure filesystem

5 participants

@felipecrv@Tom-Newton@kou@bkietz@pitrou
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

GH-38597: [C++] Implement GetFileInfo(selector) for Azure filesystem - #39009

Merged
felipecrv merged 13 commits into
apache:mainfrom
felipecrv:azure_selector
Dec 8, 2023
Merged

GH-38597: [C++] Implement GetFileInfo(selector) for Azure filesystem#39009
felipecrv merged 13 commits into
apache:mainfrom
felipecrv:azure_selector

Conversation

@felipecrv

@felipecrvfelipecrv commented Nov 30, 2023

Copy link
Copy Markdown
Contributor

Rationale for this change

Part of Azure FS implementation.

What changes are included in this PR?

The version of GetFileInfo that takes a prefix and can optionally recurse into directories.

Are these changes tested?

By unit tests present in this PR. Separate from this PR, I'm thinking of way to fuzz-test the FS API.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

@kou@Tom-Newton

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

TODO:

  • Leverage hierarchical support if enabled for the account
  • Introduce an explicit std::stack to remove stack overflow risk when listing very deep filesystems

@felipecrv
felipecrv requested a review from kouNovember 30, 2023 18:05

@koukou left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

(I'll review GetFileInfoWithSelector() and GetFileInfoWithSelectorFromContainer() logic carefully later.)

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment on lines 861 to 866

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

How about moving this to path_util.{cc,h}?
Because extracting basename from a path is a generic path operation.
We will be able to use GetAbstractPathParent() to implement this like return GetAbstractPathParent(s).second;.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

+1 for factoring out generic path operations, and also unit-test them.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

The problem with path_util.h functions is that they don't follow any concept of path normalization for inputs and have to check the input for many variations, this BasenameView works well in this context, but not in a general context.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I'm changing it to this:

static std::string_view BasenameView(std::string_view s) {
DCHECK(!internal::HasTrailingSlash(s));
auto offset = s.find_last_of(internal::kSep);
auto result = (offset == std::string_view::npos) ? s : s.substr(offset);
DCHECK(!result.empty() && result.back() != internal::kSep);
return result;
}

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/path_util.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment on lines 1333 to 1403

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I don't object them but why do you want to specify them explicitly?
Our other methods don't specify them explicitly. (They use the default value.)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I want all the wiring to be in place if we need to specify the page_size_hint which I'm pretty sure we will need to tweak when this is used in practice.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Should we pass page_size_hint here too?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

page_size_hint only applies to the pagination of blobs. If I were to pass page size here, it would be a separate constant, but I thought this would be an overkill.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated

@koukouDec 3, 2023

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Is this really happen?
emptydir/ is a case of this in the test, right?
In this case, emptydir/ may exist in Blobs (with options.Prefix = emptydir/) or BlobPrefixes (with no options.Prefix) but doesn't exit in both of them. (I checked this with gdb.)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

This is the direction the whole implementation will move towards. CreateDir should create a marker blob, so we can check that an empty directory exists after it's created or after its contents are deleted.

As @pitrou said in another comment, all the Filesystem implementations should behave the same way.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Can we use ListBlobs() instead when select.max_recursion == INT32_MAX as an optimization?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

That would require that we build a trie of all the blob names to list them hierarchically. I'm open to doing it, but I think we can delay doing it until there is clear indication that it would help a concrete use-case.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
@Tom-Newton

Copy link
Copy Markdown
Contributor

I reviewed the tests, so I'm happy with the behaviour. I haven't had a chance to understand and review the implementation yet.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

General question: was it considered to have a namespace alias at the top of this file such as namespace BlobsModels = Azure::Storage::Blobs::Models;?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Something I prefer to do once all PRs land because it would be a noisy change.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/test_util.h Outdated
@felipecrv

Copy link
Copy Markdown
ContributorAuthor

I rebased to fix a conflict, but the new changes are on the last two commits.

@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Dec 5, 2023
@felipecrv
felipecrv requested review from kou and pitrouDecember 5, 2023 02:02
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting committer review Awaiting committer review awaiting changes Awaiting changes labels Dec 5, 2023
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
@github-actionsgithub-actionsBot added awaiting review Awaiting review awaiting changes Awaiting changes awaiting committer review Awaiting committer review and removed awaiting change review Awaiting change review awaiting review Awaiting review awaiting changes Awaiting changes awaiting committer review Awaiting committer review labels Dec 7, 2023
@github-actionsgithub-actionsBot added the awaiting changes Awaiting changes label Dec 8, 2023
kou
kou approved these changes Dec 8, 2023

@koukou left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

+1

Could you fix a lint failure?

Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting changes Awaiting changes labels Dec 8, 2023
@felipecrv

Copy link
Copy Markdown
ContributorAuthor

I will rebase and force-push to see if all CI passes now.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

CI failure is unrelated so I'm merging this.

@felipecrv
felipecrv merged commit 476c78f into apache:mainDec 8, 2023
@felipecrv
felipecrv deleted the azure_selector branch December 8, 2023 18:48
@kou

kou commented Dec 8, 2023

Copy link
Copy Markdown
Member

@felipecrv Did you use our merge script?
https://github.com/apache/arrow/tree/main/dev#how-to-merge-a-pull-request

GH-38597's milestone isn't set. In general, it's set by the merge script.

@conbench-apache-arrow

Copy link
Copy Markdown

After merging your PR, Conbench analyzed the 6 benchmarking runs that have been run so far on merge-commit 476c78f.

There were no benchmark performance regressions. 🎉

The full Conbench report has more details. It also includes information about 32 possible false positives for unstable benchmarks that are known to sometimes produce them.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

@felipecrv Did you use our merge script? https://github.com/apache/arrow/tree/main/dev#how-to-merge-a-pull-request

GH-38597's milestone isn't set. In general, it's set by the merge script.

Oh no. Sorry. I had no idea. I will use it from now on. Anything we can do to make this right for this PR?

@kou

kou commented Dec 10, 2023

Copy link
Copy Markdown
Member

I set GH-37597's milestone manually. :-)

dgreiss pushed a commit to dgreiss/arrow that referenced this pull request Feb 19, 2024
…ystem (apache#39009)
### Rationale for this change
Part of Azure FS implementation.
### What changes are included in this PR?
The version of `GetFileInfo` that takes a prefix and can optionally
recurse into directories.
### Are these changes tested?
By unit tests present in this PR. Separate from this PR, I'm thinking of
way to fuzz-test the FS API.
* Closes: apache#38597
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[C++] Implement GetFileInfo selector for Azure filesystem

5 participants

@felipecrv@Tom-Newton@kou@bkietz@pitrou
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

GH-38597: [C++] Implement GetFileInfo(selector) for Azure filesystem - #39009

Merged
felipecrv merged 13 commits into
apache:mainfrom
felipecrv:azure_selector
Dec 8, 2023
Merged

GH-38597: [C++] Implement GetFileInfo(selector) for Azure filesystem#39009
felipecrv merged 13 commits into
apache:mainfrom
felipecrv:azure_selector

Conversation

@felipecrv

@felipecrvfelipecrv commented Nov 30, 2023

Copy link
Copy Markdown
Contributor

Rationale for this change

Part of Azure FS implementation.

What changes are included in this PR?

The version of GetFileInfo that takes a prefix and can optionally recurse into directories.

Are these changes tested?

By unit tests present in this PR. Separate from this PR, I'm thinking of way to fuzz-test the FS API.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

@kou@Tom-Newton

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

TODO:

  • Leverage hierarchical support if enabled for the account
  • Introduce an explicit std::stack to remove stack overflow risk when listing very deep filesystems

@felipecrv
felipecrv requested a review from kouNovember 30, 2023 18:05

@koukou left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

(I'll review GetFileInfoWithSelector() and GetFileInfoWithSelectorFromContainer() logic carefully later.)

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment on lines 861 to 866

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

How about moving this to path_util.{cc,h}?
Because extracting basename from a path is a generic path operation.
We will be able to use GetAbstractPathParent() to implement this like return GetAbstractPathParent(s).second;.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

+1 for factoring out generic path operations, and also unit-test them.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

The problem with path_util.h functions is that they don't follow any concept of path normalization for inputs and have to check the input for many variations, this BasenameView works well in this context, but not in a general context.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I'm changing it to this:

static std::string_view BasenameView(std::string_view s) {
DCHECK(!internal::HasTrailingSlash(s));
auto offset = s.find_last_of(internal::kSep);
auto result = (offset == std::string_view::npos) ? s : s.substr(offset);
DCHECK(!result.empty() && result.back() != internal::kSep);
return result;
}

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/path_util.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment on lines 1333 to 1403

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I don't object them but why do you want to specify them explicitly?
Our other methods don't specify them explicitly. (They use the default value.)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I want all the wiring to be in place if we need to specify the page_size_hint which I'm pretty sure we will need to tweak when this is used in practice.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Should we pass page_size_hint here too?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

page_size_hint only applies to the pagination of blobs. If I were to pass page size here, it would be a separate constant, but I thought this would be an overkill.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated

@koukouDec 3, 2023

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Is this really happen?
emptydir/ is a case of this in the test, right?
In this case, emptydir/ may exist in Blobs (with options.Prefix = emptydir/) or BlobPrefixes (with no options.Prefix) but doesn't exit in both of them. (I checked this with gdb.)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

This is the direction the whole implementation will move towards. CreateDir should create a marker blob, so we can check that an empty directory exists after it's created or after its contents are deleted.

As @pitrou said in another comment, all the Filesystem implementations should behave the same way.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Can we use ListBlobs() instead when select.max_recursion == INT32_MAX as an optimization?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

That would require that we build a trie of all the blob names to list them hierarchically. I'm open to doing it, but I think we can delay doing it until there is clear indication that it would help a concrete use-case.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
@Tom-Newton

Copy link
Copy Markdown
Contributor

I reviewed the tests, so I'm happy with the behaviour. I haven't had a chance to understand and review the implementation yet.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

General question: was it considered to have a namespace alias at the top of this file such as namespace BlobsModels = Azure::Storage::Blobs::Models;?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Something I prefer to do once all PRs land because it would be a noisy change.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/test_util.h Outdated
@felipecrv

Copy link
Copy Markdown
ContributorAuthor

I rebased to fix a conflict, but the new changes are on the last two commits.

@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Dec 5, 2023
@felipecrv
felipecrv requested review from kou and pitrouDecember 5, 2023 02:02
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting committer review Awaiting committer review awaiting changes Awaiting changes labels Dec 5, 2023
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
@github-actionsgithub-actionsBot added awaiting review Awaiting review awaiting changes Awaiting changes awaiting committer review Awaiting committer review and removed awaiting change review Awaiting change review awaiting review Awaiting review awaiting changes Awaiting changes awaiting committer review Awaiting committer review labels Dec 7, 2023
@github-actionsgithub-actionsBot added the awaiting changes Awaiting changes label Dec 8, 2023
kou
kou approved these changes Dec 8, 2023

@koukou left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

+1

Could you fix a lint failure?

Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting changes Awaiting changes labels Dec 8, 2023
@felipecrv

Copy link
Copy Markdown
ContributorAuthor

I will rebase and force-push to see if all CI passes now.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

CI failure is unrelated so I'm merging this.

@felipecrv
felipecrv merged commit 476c78f into apache:mainDec 8, 2023
@felipecrv
felipecrv deleted the azure_selector branch December 8, 2023 18:48
@kou

kou commented Dec 8, 2023

Copy link
Copy Markdown
Member

@felipecrv Did you use our merge script?
https://github.com/apache/arrow/tree/main/dev#how-to-merge-a-pull-request

GH-38597's milestone isn't set. In general, it's set by the merge script.

@conbench-apache-arrow

Copy link
Copy Markdown

After merging your PR, Conbench analyzed the 6 benchmarking runs that have been run so far on merge-commit 476c78f.

There were no benchmark performance regressions. 🎉

The full Conbench report has more details. It also includes information about 32 possible false positives for unstable benchmarks that are known to sometimes produce them.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

@felipecrv Did you use our merge script? https://github.com/apache/arrow/tree/main/dev#how-to-merge-a-pull-request

GH-38597's milestone isn't set. In general, it's set by the merge script.

Oh no. Sorry. I had no idea. I will use it from now on. Anything we can do to make this right for this PR?

@kou

kou commented Dec 10, 2023

Copy link
Copy Markdown
Member

I set GH-37597's milestone manually. :-)

dgreiss pushed a commit to dgreiss/arrow that referenced this pull request Feb 19, 2024
…ystem (apache#39009)
### Rationale for this change
Part of Azure FS implementation.
### What changes are included in this PR?
The version of `GetFileInfo` that takes a prefix and can optionally
recurse into directories.
### Are these changes tested?
By unit tests present in this PR. Separate from this PR, I'm thinking of
way to fuzz-test the FS API.
* Closes: apache#38597
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[C++] Implement GetFileInfo selector for Azure filesystem

5 participants

@felipecrv@Tom-Newton@kou@bkietz@pitrou
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

GH-38597: [C++] Implement GetFileInfo(selector) for Azure filesystem - #39009

Merged
felipecrv merged 13 commits into
apache:mainfrom
felipecrv:azure_selector
Dec 8, 2023
Merged

GH-38597: [C++] Implement GetFileInfo(selector) for Azure filesystem#39009
felipecrv merged 13 commits into
apache:mainfrom
felipecrv:azure_selector

Conversation

@felipecrv

@felipecrvfelipecrv commented Nov 30, 2023

Copy link
Copy Markdown
Contributor

Rationale for this change

Part of Azure FS implementation.

What changes are included in this PR?

The version of GetFileInfo that takes a prefix and can optionally recurse into directories.

Are these changes tested?

By unit tests present in this PR. Separate from this PR, I'm thinking of way to fuzz-test the FS API.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

@kou@Tom-Newton

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

TODO:

  • Leverage hierarchical support if enabled for the account
  • Introduce an explicit std::stack to remove stack overflow risk when listing very deep filesystems

@felipecrv
felipecrv requested a review from kouNovember 30, 2023 18:05

@koukou left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

(I'll review GetFileInfoWithSelector() and GetFileInfoWithSelectorFromContainer() logic carefully later.)

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment on lines 861 to 866

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

How about moving this to path_util.{cc,h}?
Because extracting basename from a path is a generic path operation.
We will be able to use GetAbstractPathParent() to implement this like return GetAbstractPathParent(s).second;.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

+1 for factoring out generic path operations, and also unit-test them.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

The problem with path_util.h functions is that they don't follow any concept of path normalization for inputs and have to check the input for many variations, this BasenameView works well in this context, but not in a general context.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I'm changing it to this:

static std::string_view BasenameView(std::string_view s) {
DCHECK(!internal::HasTrailingSlash(s));
auto offset = s.find_last_of(internal::kSep);
auto result = (offset == std::string_view::npos) ? s : s.substr(offset);
DCHECK(!result.empty() && result.back() != internal::kSep);
return result;
}

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/path_util.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment on lines 1333 to 1403

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I don't object them but why do you want to specify them explicitly?
Our other methods don't specify them explicitly. (They use the default value.)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I want all the wiring to be in place if we need to specify the page_size_hint which I'm pretty sure we will need to tweak when this is used in practice.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Should we pass page_size_hint here too?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

page_size_hint only applies to the pagination of blobs. If I were to pass page size here, it would be a separate constant, but I thought this would be an overkill.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated

@koukouDec 3, 2023

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Is this really happen?
emptydir/ is a case of this in the test, right?
In this case, emptydir/ may exist in Blobs (with options.Prefix = emptydir/) or BlobPrefixes (with no options.Prefix) but doesn't exit in both of them. (I checked this with gdb.)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

This is the direction the whole implementation will move towards. CreateDir should create a marker blob, so we can check that an empty directory exists after it's created or after its contents are deleted.

As @pitrou said in another comment, all the Filesystem implementations should behave the same way.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Can we use ListBlobs() instead when select.max_recursion == INT32_MAX as an optimization?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

That would require that we build a trie of all the blob names to list them hierarchically. I'm open to doing it, but I think we can delay doing it until there is clear indication that it would help a concrete use-case.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
@Tom-Newton

Copy link
Copy Markdown
Contributor

I reviewed the tests, so I'm happy with the behaviour. I haven't had a chance to understand and review the implementation yet.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

General question: was it considered to have a namespace alias at the top of this file such as namespace BlobsModels = Azure::Storage::Blobs::Models;?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Something I prefer to do once all PRs land because it would be a noisy change.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/test_util.h Outdated
@felipecrv

Copy link
Copy Markdown
ContributorAuthor

I rebased to fix a conflict, but the new changes are on the last two commits.

@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Dec 5, 2023
@felipecrv
felipecrv requested review from kou and pitrouDecember 5, 2023 02:02
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting committer review Awaiting committer review awaiting changes Awaiting changes labels Dec 5, 2023
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
@github-actionsgithub-actionsBot added awaiting review Awaiting review awaiting changes Awaiting changes awaiting committer review Awaiting committer review and removed awaiting change review Awaiting change review awaiting review Awaiting review awaiting changes Awaiting changes awaiting committer review Awaiting committer review labels Dec 7, 2023
@github-actionsgithub-actionsBot added the awaiting changes Awaiting changes label Dec 8, 2023
kou
kou approved these changes Dec 8, 2023

@koukou left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

+1

Could you fix a lint failure?

Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting changes Awaiting changes labels Dec 8, 2023
@felipecrv

Copy link
Copy Markdown
ContributorAuthor

I will rebase and force-push to see if all CI passes now.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

CI failure is unrelated so I'm merging this.

@felipecrv
felipecrv merged commit 476c78f into apache:mainDec 8, 2023
@felipecrv
felipecrv deleted the azure_selector branch December 8, 2023 18:48
@kou

kou commented Dec 8, 2023

Copy link
Copy Markdown
Member

@felipecrv Did you use our merge script?
https://github.com/apache/arrow/tree/main/dev#how-to-merge-a-pull-request

GH-38597's milestone isn't set. In general, it's set by the merge script.

@conbench-apache-arrow

Copy link
Copy Markdown

After merging your PR, Conbench analyzed the 6 benchmarking runs that have been run so far on merge-commit 476c78f.

There were no benchmark performance regressions. 🎉

The full Conbench report has more details. It also includes information about 32 possible false positives for unstable benchmarks that are known to sometimes produce them.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

@felipecrv Did you use our merge script? https://github.com/apache/arrow/tree/main/dev#how-to-merge-a-pull-request

GH-38597's milestone isn't set. In general, it's set by the merge script.

Oh no. Sorry. I had no idea. I will use it from now on. Anything we can do to make this right for this PR?

@kou

kou commented Dec 10, 2023

Copy link
Copy Markdown
Member

I set GH-37597's milestone manually. :-)

dgreiss pushed a commit to dgreiss/arrow that referenced this pull request Feb 19, 2024
…ystem (apache#39009)
### Rationale for this change
Part of Azure FS implementation.
### What changes are included in this PR?
The version of `GetFileInfo` that takes a prefix and can optionally
recurse into directories.
### Are these changes tested?
By unit tests present in this PR. Separate from this PR, I'm thinking of
way to fuzz-test the FS API.
* Closes: apache#38597
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[C++] Implement GetFileInfo selector for Azure filesystem

5 participants

@felipecrv@Tom-Newton@kou@bkietz@pitrou
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

GH-38597: [C++] Implement GetFileInfo(selector) for Azure filesystem - #39009

Merged
felipecrv merged 13 commits into
apache:mainfrom
felipecrv:azure_selector
Dec 8, 2023
Merged

GH-38597: [C++] Implement GetFileInfo(selector) for Azure filesystem#39009
felipecrv merged 13 commits into
apache:mainfrom
felipecrv:azure_selector

Conversation

@felipecrv

@felipecrvfelipecrv commented Nov 30, 2023

Copy link
Copy Markdown
Contributor

Rationale for this change

Part of Azure FS implementation.

What changes are included in this PR?

The version of GetFileInfo that takes a prefix and can optionally recurse into directories.

Are these changes tested?

By unit tests present in this PR. Separate from this PR, I'm thinking of way to fuzz-test the FS API.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

@kou@Tom-Newton

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

TODO:

  • Leverage hierarchical support if enabled for the account
  • Introduce an explicit std::stack to remove stack overflow risk when listing very deep filesystems

@felipecrv
felipecrv requested a review from kouNovember 30, 2023 18:05

@koukou left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

(I'll review GetFileInfoWithSelector() and GetFileInfoWithSelectorFromContainer() logic carefully later.)

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment on lines 861 to 866

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

How about moving this to path_util.{cc,h}?
Because extracting basename from a path is a generic path operation.
We will be able to use GetAbstractPathParent() to implement this like return GetAbstractPathParent(s).second;.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

+1 for factoring out generic path operations, and also unit-test them.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

The problem with path_util.h functions is that they don't follow any concept of path normalization for inputs and have to check the input for many variations, this BasenameView works well in this context, but not in a general context.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I'm changing it to this:

static std::string_view BasenameView(std::string_view s) {
DCHECK(!internal::HasTrailingSlash(s));
auto offset = s.find_last_of(internal::kSep);
auto result = (offset == std::string_view::npos) ? s : s.substr(offset);
DCHECK(!result.empty() && result.back() != internal::kSep);
return result;
}

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/path_util.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment on lines 1333 to 1403

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I don't object them but why do you want to specify them explicitly?
Our other methods don't specify them explicitly. (They use the default value.)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I want all the wiring to be in place if we need to specify the page_size_hint which I'm pretty sure we will need to tweak when this is used in practice.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Should we pass page_size_hint here too?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

page_size_hint only applies to the pagination of blobs. If I were to pass page size here, it would be a separate constant, but I thought this would be an overkill.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated

@koukouDec 3, 2023

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Is this really happen?
emptydir/ is a case of this in the test, right?
In this case, emptydir/ may exist in Blobs (with options.Prefix = emptydir/) or BlobPrefixes (with no options.Prefix) but doesn't exit in both of them. (I checked this with gdb.)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

This is the direction the whole implementation will move towards. CreateDir should create a marker blob, so we can check that an empty directory exists after it's created or after its contents are deleted.

As @pitrou said in another comment, all the Filesystem implementations should behave the same way.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Can we use ListBlobs() instead when select.max_recursion == INT32_MAX as an optimization?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

That would require that we build a trie of all the blob names to list them hierarchically. I'm open to doing it, but I think we can delay doing it until there is clear indication that it would help a concrete use-case.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
@Tom-Newton

Copy link
Copy Markdown
Contributor

I reviewed the tests, so I'm happy with the behaviour. I haven't had a chance to understand and review the implementation yet.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

General question: was it considered to have a namespace alias at the top of this file such as namespace BlobsModels = Azure::Storage::Blobs::Models;?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Something I prefer to do once all PRs land because it would be a noisy change.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/test_util.h Outdated
@felipecrv

Copy link
Copy Markdown
ContributorAuthor

I rebased to fix a conflict, but the new changes are on the last two commits.

@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Dec 5, 2023
@felipecrv
felipecrv requested review from kou and pitrouDecember 5, 2023 02:02
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting committer review Awaiting committer review awaiting changes Awaiting changes labels Dec 5, 2023
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
@github-actionsgithub-actionsBot added awaiting review Awaiting review awaiting changes Awaiting changes awaiting committer review Awaiting committer review and removed awaiting change review Awaiting change review awaiting review Awaiting review awaiting changes Awaiting changes awaiting committer review Awaiting committer review labels Dec 7, 2023
@github-actionsgithub-actionsBot added the awaiting changes Awaiting changes label Dec 8, 2023
kou
kou approved these changes Dec 8, 2023

@koukou left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

+1

Could you fix a lint failure?

Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting changes Awaiting changes labels Dec 8, 2023
@felipecrv

Copy link
Copy Markdown
ContributorAuthor

I will rebase and force-push to see if all CI passes now.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

CI failure is unrelated so I'm merging this.

@felipecrv
felipecrv merged commit 476c78f into apache:mainDec 8, 2023
@felipecrv
felipecrv deleted the azure_selector branch December 8, 2023 18:48
@kou

kou commented Dec 8, 2023

Copy link
Copy Markdown
Member

@felipecrv Did you use our merge script?
https://github.com/apache/arrow/tree/main/dev#how-to-merge-a-pull-request

GH-38597's milestone isn't set. In general, it's set by the merge script.

@conbench-apache-arrow

Copy link
Copy Markdown

After merging your PR, Conbench analyzed the 6 benchmarking runs that have been run so far on merge-commit 476c78f.

There were no benchmark performance regressions. 🎉

The full Conbench report has more details. It also includes information about 32 possible false positives for unstable benchmarks that are known to sometimes produce them.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

@felipecrv Did you use our merge script? https://github.com/apache/arrow/tree/main/dev#how-to-merge-a-pull-request

GH-38597's milestone isn't set. In general, it's set by the merge script.

Oh no. Sorry. I had no idea. I will use it from now on. Anything we can do to make this right for this PR?

@kou

kou commented Dec 10, 2023

Copy link
Copy Markdown
Member

I set GH-37597's milestone manually. :-)

dgreiss pushed a commit to dgreiss/arrow that referenced this pull request Feb 19, 2024
…ystem (apache#39009)
### Rationale for this change
Part of Azure FS implementation.
### What changes are included in this PR?
The version of `GetFileInfo` that takes a prefix and can optionally
recurse into directories.
### Are these changes tested?
By unit tests present in this PR. Separate from this PR, I'm thinking of
way to fuzz-test the FS API.
* Closes: apache#38597
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[C++] Implement GetFileInfo selector for Azure filesystem

5 participants

@felipecrv@Tom-Newton@kou@bkietz@pitrou
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

GH-38597: [C++] Implement GetFileInfo(selector) for Azure filesystem - #39009

Merged
felipecrv merged 13 commits into
apache:mainfrom
felipecrv:azure_selector
Dec 8, 2023
Merged

GH-38597: [C++] Implement GetFileInfo(selector) for Azure filesystem#39009
felipecrv merged 13 commits into
apache:mainfrom
felipecrv:azure_selector

Conversation

@felipecrv

@felipecrvfelipecrv commented Nov 30, 2023

Copy link
Copy Markdown
Contributor

Rationale for this change

Part of Azure FS implementation.

What changes are included in this PR?

The version of GetFileInfo that takes a prefix and can optionally recurse into directories.

Are these changes tested?

By unit tests present in this PR. Separate from this PR, I'm thinking of way to fuzz-test the FS API.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

@kou@Tom-Newton

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

TODO:

  • Leverage hierarchical support if enabled for the account
  • Introduce an explicit std::stack to remove stack overflow risk when listing very deep filesystems

@felipecrv
felipecrv requested a review from kouNovember 30, 2023 18:05

@koukou left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

(I'll review GetFileInfoWithSelector() and GetFileInfoWithSelectorFromContainer() logic carefully later.)

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment on lines 861 to 866

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

How about moving this to path_util.{cc,h}?
Because extracting basename from a path is a generic path operation.
We will be able to use GetAbstractPathParent() to implement this like return GetAbstractPathParent(s).second;.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

+1 for factoring out generic path operations, and also unit-test them.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

The problem with path_util.h functions is that they don't follow any concept of path normalization for inputs and have to check the input for many variations, this BasenameView works well in this context, but not in a general context.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I'm changing it to this:

static std::string_view BasenameView(std::string_view s) {
DCHECK(!internal::HasTrailingSlash(s));
auto offset = s.find_last_of(internal::kSep);
auto result = (offset == std::string_view::npos) ? s : s.substr(offset);
DCHECK(!result.empty() && result.back() != internal::kSep);
return result;
}

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/path_util.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment on lines 1333 to 1403

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I don't object them but why do you want to specify them explicitly?
Our other methods don't specify them explicitly. (They use the default value.)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I want all the wiring to be in place if we need to specify the page_size_hint which I'm pretty sure we will need to tweak when this is used in practice.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Should we pass page_size_hint here too?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

page_size_hint only applies to the pagination of blobs. If I were to pass page size here, it would be a separate constant, but I thought this would be an overkill.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated

@koukouDec 3, 2023

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Is this really happen?
emptydir/ is a case of this in the test, right?
In this case, emptydir/ may exist in Blobs (with options.Prefix = emptydir/) or BlobPrefixes (with no options.Prefix) but doesn't exit in both of them. (I checked this with gdb.)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

This is the direction the whole implementation will move towards. CreateDir should create a marker blob, so we can check that an empty directory exists after it's created or after its contents are deleted.

As @pitrou said in another comment, all the Filesystem implementations should behave the same way.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Can we use ListBlobs() instead when select.max_recursion == INT32_MAX as an optimization?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

That would require that we build a trie of all the blob names to list them hierarchically. I'm open to doing it, but I think we can delay doing it until there is clear indication that it would help a concrete use-case.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
@Tom-Newton

Copy link
Copy Markdown
Contributor

I reviewed the tests, so I'm happy with the behaviour. I haven't had a chance to understand and review the implementation yet.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

General question: was it considered to have a namespace alias at the top of this file such as namespace BlobsModels = Azure::Storage::Blobs::Models;?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Something I prefer to do once all PRs land because it would be a noisy change.

Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/test_util.h Outdated
@felipecrv

Copy link
Copy Markdown
ContributorAuthor

I rebased to fix a conflict, but the new changes are on the last two commits.

@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Dec 5, 2023
@felipecrv
felipecrv requested review from kou and pitrouDecember 5, 2023 02:02
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting committer review Awaiting committer review awaiting changes Awaiting changes labels Dec 5, 2023
Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
Comment threadcpp/src/arrow/filesystem/azurefs.cc Outdated
@github-actionsgithub-actionsBot added awaiting review Awaiting review awaiting changes Awaiting changes awaiting committer review Awaiting committer review and removed awaiting change review Awaiting change review awaiting review Awaiting review awaiting changes Awaiting changes awaiting committer review Awaiting committer review labels Dec 7, 2023
@github-actionsgithub-actionsBot added the awaiting changes Awaiting changes label Dec 8, 2023
kou
kou approved these changes Dec 8, 2023

@koukou left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

+1

Could you fix a lint failure?

Comment threadcpp/src/arrow/filesystem/azurefs_test.cc Outdated
@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting changes Awaiting changes labels Dec 8, 2023
@felipecrv

Copy link
Copy Markdown
ContributorAuthor

I will rebase and force-push to see if all CI passes now.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

CI failure is unrelated so I'm merging this.

@felipecrv
felipecrv merged commit 476c78f into apache:mainDec 8, 2023
@felipecrv
felipecrv deleted the azure_selector branch December 8, 2023 18:48
@kou

kou commented Dec 8, 2023

Copy link
Copy Markdown
Member

@felipecrv Did you use our merge script?
https://github.com/apache/arrow/tree/main/dev#how-to-merge-a-pull-request

GH-38597's milestone isn't set. In general, it's set by the merge script.

@conbench-apache-arrow

Copy link
Copy Markdown

After merging your PR, Conbench analyzed the 6 benchmarking runs that have been run so far on merge-commit 476c78f.

There were no benchmark performance regressions. 🎉

The full Conbench report has more details. It also includes information about 32 possible false positives for unstable benchmarks that are known to sometimes produce them.

@felipecrv

Copy link
Copy Markdown
ContributorAuthor

@felipecrv Did you use our merge script? https://github.com/apache/arrow/tree/main/dev#how-to-merge-a-pull-request

GH-38597's milestone isn't set. In general, it's set by the merge script.

Oh no. Sorry. I had no idea. I will use it from now on. Anything we can do to make this right for this PR?

@kou

kou commented Dec 10, 2023

Copy link
Copy Markdown
Member

I set GH-37597's milestone manually. :-)

dgreiss pushed a commit to dgreiss/arrow that referenced this pull request Feb 19, 2024
…ystem (apache#39009)
### Rationale for this change
Part of Azure FS implementation.
### What changes are included in this PR?
The version of `GetFileInfo` that takes a prefix and can optionally
recurse into directories.
### Are these changes tested?
By unit tests present in this PR. Separate from this PR, I'm thinking of
way to fuzz-test the FS API.
* Closes: apache#38597
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[C++] Implement GetFileInfo selector for Azure filesystem

5 participants

@felipecrv@Tom-Newton@kou@bkietz@pitrou