GH-38705: [C++][FS][Azure] Implement CopyFile() - #39058

Merged
kou merged 3 commits into
apache:mainfrom
kou:cpp-azurefs-copy-file
Dec 7, 2023
Merged

GH-38705: [C++][FS][Azure] Implement CopyFile()#39058
kou merged 3 commits into
apache:mainfrom
kou:cpp-azurefs-copy-file

Conversation

@kou

@koukou commented Dec 4, 2023

Copy link
Copy Markdown
Member

Rationale for this change

CopyFile() copies the given source to the given destination. Both of source and destination must be blob name like other filesystem implementations.

What changes are included in this PR?

Use CopyFromUri() API that should use server-side copy.

Are these changes tested?

Yes.

Are there any user-facing changes?

No.

@github-actions

Copy link
Copy Markdown

⚠️ GitHub issue #38705has been automatically assigned in GitHub to PR creator.

@kou

kou commented Dec 4, 2023

Copy link
Copy Markdown
MemberAuthor

@Tom-Newton@felipecrv What do you think about this behavior? I think that this is convenient but this is different from other filesystem implementations...

If the given destination has only container (container) or has trailing slash (container/directory/), base name of the given source is automatically appended. For example:

  • Source: container1/directory1/path.txt
  • Destination: container2
  • Real destination: container2/path.txt (path.txt is only appended to container2)

This is the same behavior as cp command. But other filesystem implementations require path not directory as destination.

@Tom-Newton

Copy link
Copy Markdown
Contributor

This behaviour sounds fine to me.

I think there is a problem with the CopyFromUri() API though. I believe it requires using SAS token auth on the source, because the source URI needs to be self authenticated.

@Tom-Newton

Copy link
Copy Markdown
Contributor

I think there is a problem with the CopyFromUri() API though.

Nevermind, it looks like you've got a working implementation using CopyFromUri(). Maybe it does auth automatically if it detects that the source is in the same storage account. Or possibly the Azure SDK automatically switches between Copy Blob From URL and Copy Blob

@pitrou

Copy link
Copy Markdown
Member

I think that this is convenient but this is different from other filesystem implementations...

We should not diverge from the filesystem spec (as described in the FileSystem class docstrings ).
The end goal is for all implementations to expose a similar behavior.

Also, at some point the Azure fs implementation will have to implement and pass the generic filesystem tests, which do have a test for this situation.

@felipecrv

Copy link
Copy Markdown
Contributor

I think that this is convenient but this is different from other filesystem implementations...

We should not diverge from the filesystem spec (as described in the FileSystem class docstrings ). The end goal is for all implementations to expose a similar behavior.

Also, at some point the Azure fs implementation will have to implement and pass the generic filesystem tests, which do have a test for this situation.

I agree. I think we should fix #38772 before adding more operations. I implemented the GetFileInfo(select) with this as an assumption. CopyFile shouldn't implicitly create directories, so we need a way to check an empty directory exists.

@kou

kou commented Dec 5, 2023

Copy link
Copy Markdown
MemberAuthor

Oh, sorry. I didn't read the docstring. I'll remove the behavior.

Also, at some point the Azure fs implementation will have to implement and pass the generic filesystem tests, which do have a test for this situation.

I've opened a new issue for it: #39069

@kou

kou commented Dec 5, 2023

Copy link
Copy Markdown
MemberAuthor

I think there is a problem with the CopyFromUri() API though.

Nevermind, it looks like you've got a working implementation using CopyFromUri(). Maybe it does auth automatically if it detects that the source is in the same storage account. Or possibly the Azure SDK automatically switches between Copy Blob From URL and Copy Blob

I think that "Copy Blob From URL" and "Copy Blob" are the same API internally.
Both of them use the same URI and PUT:

And BlobClient provides only CopyFromUri(). (It doesn't provide Copy().)
So I used CopyFromUri().

@kou
kouforce-pushed the cpp-azurefs-copy-file branch from df57308 to f1fd538CompareDecember 5, 2023 02:29
@kou

kou commented Dec 5, 2023

Copy link
Copy Markdown
MemberAuthor

Updated:

  • Accept only blob path for destination like other implementations.

@kou

kou commented Dec 6, 2023

Copy link
Copy Markdown
MemberAuthor

I'll merge this in a few days if nobody objects it.

@Tom-NewtonTom-Newton left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

@Tom-Newton

Tom-Newton commented Dec 6, 2023

Copy link
Copy Markdown
Contributor

Personally I'm not particularly worried but to be rigorous @felipecrv's comment should probably be addressed.

CopyFile shouldn't implicitly create directories, so we need a way to check an empty directory exists.

@kou

kou commented Dec 7, 2023

Copy link
Copy Markdown
MemberAuthor

OK. I've implemented it.

@kou
kou merged commit 70ccf33 into apache:mainDec 7, 2023
@kou
kou deleted the cpp-azurefs-copy-file branch December 7, 2023 05:26
@koukou removed the awaiting committer review Awaiting committer review label Dec 7, 2023
@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 70ccf33.

There were 10 benchmark results indicating a performance regression:

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

dgreiss pushed a commit to dgreiss/arrow that referenced this pull request Feb 19, 2024
### Rationale for this change
`CopyFile()` copies the given source to the given destination. Both of source and destination must be blob name like other filesystem implementations.
### What changes are included in this PR?
Use `CopyFromUri()` API that should use server-side copy.
### Are these changes tested?
Yes.
### Are there any user-facing changes?
No.
* Closes: apache#38705
Authored-by: Sutou Kouhei <kou@clear-code.com>
Signed-off-by: Sutou Kouhei <kou@clear-code.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[C++][FS][Azure] Implement CopyFile()

4 participants

@kou@Tom-Newton@pitrou@felipecrv
, '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-38705: [C++][FS][Azure] Implement CopyFile() - #39058

Merged
kou merged 3 commits into
apache:mainfrom
kou:cpp-azurefs-copy-file
Dec 7, 2023
Merged

GH-38705: [C++][FS][Azure] Implement CopyFile()#39058
kou merged 3 commits into
apache:mainfrom
kou:cpp-azurefs-copy-file

Conversation

@kou

@koukou commented Dec 4, 2023

Copy link
Copy Markdown
Member

Rationale for this change

CopyFile() copies the given source to the given destination. Both of source and destination must be blob name like other filesystem implementations.

What changes are included in this PR?

Use CopyFromUri() API that should use server-side copy.

Are these changes tested?

Yes.

Are there any user-facing changes?

No.

@github-actions

Copy link
Copy Markdown

⚠️ GitHub issue #38705has been automatically assigned in GitHub to PR creator.

@kou

kou commented Dec 4, 2023

Copy link
Copy Markdown
MemberAuthor

@Tom-Newton@felipecrv What do you think about this behavior? I think that this is convenient but this is different from other filesystem implementations...

If the given destination has only container (container) or has trailing slash (container/directory/), base name of the given source is automatically appended. For example:

  • Source: container1/directory1/path.txt
  • Destination: container2
  • Real destination: container2/path.txt (path.txt is only appended to container2)

This is the same behavior as cp command. But other filesystem implementations require path not directory as destination.

@Tom-Newton

Copy link
Copy Markdown
Contributor

This behaviour sounds fine to me.

I think there is a problem with the CopyFromUri() API though. I believe it requires using SAS token auth on the source, because the source URI needs to be self authenticated.

@Tom-Newton

Copy link
Copy Markdown
Contributor

I think there is a problem with the CopyFromUri() API though.

Nevermind, it looks like you've got a working implementation using CopyFromUri(). Maybe it does auth automatically if it detects that the source is in the same storage account. Or possibly the Azure SDK automatically switches between Copy Blob From URL and Copy Blob

@pitrou

Copy link
Copy Markdown
Member

I think that this is convenient but this is different from other filesystem implementations...

We should not diverge from the filesystem spec (as described in the FileSystem class docstrings ).
The end goal is for all implementations to expose a similar behavior.

Also, at some point the Azure fs implementation will have to implement and pass the generic filesystem tests, which do have a test for this situation.

@felipecrv

Copy link
Copy Markdown
Contributor

I think that this is convenient but this is different from other filesystem implementations...

We should not diverge from the filesystem spec (as described in the FileSystem class docstrings ). The end goal is for all implementations to expose a similar behavior.

Also, at some point the Azure fs implementation will have to implement and pass the generic filesystem tests, which do have a test for this situation.

I agree. I think we should fix #38772 before adding more operations. I implemented the GetFileInfo(select) with this as an assumption. CopyFile shouldn't implicitly create directories, so we need a way to check an empty directory exists.

@kou

kou commented Dec 5, 2023

Copy link
Copy Markdown
MemberAuthor

Oh, sorry. I didn't read the docstring. I'll remove the behavior.

Also, at some point the Azure fs implementation will have to implement and pass the generic filesystem tests, which do have a test for this situation.

I've opened a new issue for it: #39069

@kou

kou commented Dec 5, 2023

Copy link
Copy Markdown
MemberAuthor

I think there is a problem with the CopyFromUri() API though.

Nevermind, it looks like you've got a working implementation using CopyFromUri(). Maybe it does auth automatically if it detects that the source is in the same storage account. Or possibly the Azure SDK automatically switches between Copy Blob From URL and Copy Blob

I think that "Copy Blob From URL" and "Copy Blob" are the same API internally.
Both of them use the same URI and PUT:

And BlobClient provides only CopyFromUri(). (It doesn't provide Copy().)
So I used CopyFromUri().

@kou
kouforce-pushed the cpp-azurefs-copy-file branch from df57308 to f1fd538CompareDecember 5, 2023 02:29
@kou

kou commented Dec 5, 2023

Copy link
Copy Markdown
MemberAuthor

Updated:

  • Accept only blob path for destination like other implementations.

@kou

kou commented Dec 6, 2023

Copy link
Copy Markdown
MemberAuthor

I'll merge this in a few days if nobody objects it.

@Tom-NewtonTom-Newton left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

@Tom-Newton

Tom-Newton commented Dec 6, 2023

Copy link
Copy Markdown
Contributor

Personally I'm not particularly worried but to be rigorous @felipecrv's comment should probably be addressed.

CopyFile shouldn't implicitly create directories, so we need a way to check an empty directory exists.

@kou

kou commented Dec 7, 2023

Copy link
Copy Markdown
MemberAuthor

OK. I've implemented it.

@kou
kou merged commit 70ccf33 into apache:mainDec 7, 2023
@kou
kou deleted the cpp-azurefs-copy-file branch December 7, 2023 05:26
@koukou removed the awaiting committer review Awaiting committer review label Dec 7, 2023
@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 70ccf33.

There were 10 benchmark results indicating a performance regression:

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

dgreiss pushed a commit to dgreiss/arrow that referenced this pull request Feb 19, 2024
### Rationale for this change
`CopyFile()` copies the given source to the given destination. Both of source and destination must be blob name like other filesystem implementations.
### What changes are included in this PR?
Use `CopyFromUri()` API that should use server-side copy.
### Are these changes tested?
Yes.
### Are there any user-facing changes?
No.
* Closes: apache#38705
Authored-by: Sutou Kouhei <kou@clear-code.com>
Signed-off-by: Sutou Kouhei <kou@clear-code.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[C++][FS][Azure] Implement CopyFile()

4 participants

@kou@Tom-Newton@pitrou@felipecrv
, '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-38705: [C++][FS][Azure] Implement CopyFile() - #39058

Merged
kou merged 3 commits into
apache:mainfrom
kou:cpp-azurefs-copy-file
Dec 7, 2023
Merged

GH-38705: [C++][FS][Azure] Implement CopyFile()#39058
kou merged 3 commits into
apache:mainfrom
kou:cpp-azurefs-copy-file

Conversation

@kou

@koukou commented Dec 4, 2023

Copy link
Copy Markdown
Member

Rationale for this change

CopyFile() copies the given source to the given destination. Both of source and destination must be blob name like other filesystem implementations.

What changes are included in this PR?

Use CopyFromUri() API that should use server-side copy.

Are these changes tested?

Yes.

Are there any user-facing changes?

No.

@github-actions

Copy link
Copy Markdown

⚠️ GitHub issue #38705has been automatically assigned in GitHub to PR creator.

@kou

kou commented Dec 4, 2023

Copy link
Copy Markdown
MemberAuthor

@Tom-Newton@felipecrv What do you think about this behavior? I think that this is convenient but this is different from other filesystem implementations...

If the given destination has only container (container) or has trailing slash (container/directory/), base name of the given source is automatically appended. For example:

  • Source: container1/directory1/path.txt
  • Destination: container2
  • Real destination: container2/path.txt (path.txt is only appended to container2)

This is the same behavior as cp command. But other filesystem implementations require path not directory as destination.

@Tom-Newton

Copy link
Copy Markdown
Contributor

This behaviour sounds fine to me.

I think there is a problem with the CopyFromUri() API though. I believe it requires using SAS token auth on the source, because the source URI needs to be self authenticated.

@Tom-Newton

Copy link
Copy Markdown
Contributor

I think there is a problem with the CopyFromUri() API though.

Nevermind, it looks like you've got a working implementation using CopyFromUri(). Maybe it does auth automatically if it detects that the source is in the same storage account. Or possibly the Azure SDK automatically switches between Copy Blob From URL and Copy Blob

@pitrou

Copy link
Copy Markdown
Member

I think that this is convenient but this is different from other filesystem implementations...

We should not diverge from the filesystem spec (as described in the FileSystem class docstrings ).
The end goal is for all implementations to expose a similar behavior.

Also, at some point the Azure fs implementation will have to implement and pass the generic filesystem tests, which do have a test for this situation.

@felipecrv

Copy link
Copy Markdown
Contributor

I think that this is convenient but this is different from other filesystem implementations...

We should not diverge from the filesystem spec (as described in the FileSystem class docstrings ). The end goal is for all implementations to expose a similar behavior.

Also, at some point the Azure fs implementation will have to implement and pass the generic filesystem tests, which do have a test for this situation.

I agree. I think we should fix #38772 before adding more operations. I implemented the GetFileInfo(select) with this as an assumption. CopyFile shouldn't implicitly create directories, so we need a way to check an empty directory exists.

@kou

kou commented Dec 5, 2023

Copy link
Copy Markdown
MemberAuthor

Oh, sorry. I didn't read the docstring. I'll remove the behavior.

Also, at some point the Azure fs implementation will have to implement and pass the generic filesystem tests, which do have a test for this situation.

I've opened a new issue for it: #39069

@kou

kou commented Dec 5, 2023

Copy link
Copy Markdown
MemberAuthor

I think there is a problem with the CopyFromUri() API though.

Nevermind, it looks like you've got a working implementation using CopyFromUri(). Maybe it does auth automatically if it detects that the source is in the same storage account. Or possibly the Azure SDK automatically switches between Copy Blob From URL and Copy Blob

I think that "Copy Blob From URL" and "Copy Blob" are the same API internally.
Both of them use the same URI and PUT:

And BlobClient provides only CopyFromUri(). (It doesn't provide Copy().)
So I used CopyFromUri().

@kou
kouforce-pushed the cpp-azurefs-copy-file branch from df57308 to f1fd538CompareDecember 5, 2023 02:29
@kou

kou commented Dec 5, 2023

Copy link
Copy Markdown
MemberAuthor

Updated:

  • Accept only blob path for destination like other implementations.

@kou

kou commented Dec 6, 2023

Copy link
Copy Markdown
MemberAuthor

I'll merge this in a few days if nobody objects it.

@Tom-NewtonTom-Newton left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

@Tom-Newton

Tom-Newton commented Dec 6, 2023

Copy link
Copy Markdown
Contributor

Personally I'm not particularly worried but to be rigorous @felipecrv's comment should probably be addressed.

CopyFile shouldn't implicitly create directories, so we need a way to check an empty directory exists.

@kou

kou commented Dec 7, 2023

Copy link
Copy Markdown
MemberAuthor

OK. I've implemented it.

@kou
kou merged commit 70ccf33 into apache:mainDec 7, 2023
@kou
kou deleted the cpp-azurefs-copy-file branch December 7, 2023 05:26
@koukou removed the awaiting committer review Awaiting committer review label Dec 7, 2023
@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 70ccf33.

There were 10 benchmark results indicating a performance regression:

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

dgreiss pushed a commit to dgreiss/arrow that referenced this pull request Feb 19, 2024
### Rationale for this change
`CopyFile()` copies the given source to the given destination. Both of source and destination must be blob name like other filesystem implementations.
### What changes are included in this PR?
Use `CopyFromUri()` API that should use server-side copy.
### Are these changes tested?
Yes.
### Are there any user-facing changes?
No.
* Closes: apache#38705
Authored-by: Sutou Kouhei <kou@clear-code.com>
Signed-off-by: Sutou Kouhei <kou@clear-code.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[C++][FS][Azure] Implement CopyFile()

4 participants

@kou@Tom-Newton@pitrou@felipecrv
, '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-38705: [C++][FS][Azure] Implement CopyFile() - #39058

Merged
kou merged 3 commits into
apache:mainfrom
kou:cpp-azurefs-copy-file
Dec 7, 2023
Merged

GH-38705: [C++][FS][Azure] Implement CopyFile()#39058
kou merged 3 commits into
apache:mainfrom
kou:cpp-azurefs-copy-file

Conversation

@kou

@koukou commented Dec 4, 2023

Copy link
Copy Markdown
Member

Rationale for this change

CopyFile() copies the given source to the given destination. Both of source and destination must be blob name like other filesystem implementations.

What changes are included in this PR?

Use CopyFromUri() API that should use server-side copy.

Are these changes tested?

Yes.

Are there any user-facing changes?

No.

@github-actions

Copy link
Copy Markdown

⚠️ GitHub issue #38705has been automatically assigned in GitHub to PR creator.

@kou

kou commented Dec 4, 2023

Copy link
Copy Markdown
MemberAuthor

@Tom-Newton@felipecrv What do you think about this behavior? I think that this is convenient but this is different from other filesystem implementations...

If the given destination has only container (container) or has trailing slash (container/directory/), base name of the given source is automatically appended. For example:

  • Source: container1/directory1/path.txt
  • Destination: container2
  • Real destination: container2/path.txt (path.txt is only appended to container2)

This is the same behavior as cp command. But other filesystem implementations require path not directory as destination.

@Tom-Newton

Copy link
Copy Markdown
Contributor

This behaviour sounds fine to me.

I think there is a problem with the CopyFromUri() API though. I believe it requires using SAS token auth on the source, because the source URI needs to be self authenticated.

@Tom-Newton

Copy link
Copy Markdown
Contributor

I think there is a problem with the CopyFromUri() API though.

Nevermind, it looks like you've got a working implementation using CopyFromUri(). Maybe it does auth automatically if it detects that the source is in the same storage account. Or possibly the Azure SDK automatically switches between Copy Blob From URL and Copy Blob

@pitrou

Copy link
Copy Markdown
Member

I think that this is convenient but this is different from other filesystem implementations...

We should not diverge from the filesystem spec (as described in the FileSystem class docstrings ).
The end goal is for all implementations to expose a similar behavior.

Also, at some point the Azure fs implementation will have to implement and pass the generic filesystem tests, which do have a test for this situation.

@felipecrv

Copy link
Copy Markdown
Contributor

I think that this is convenient but this is different from other filesystem implementations...

We should not diverge from the filesystem spec (as described in the FileSystem class docstrings ). The end goal is for all implementations to expose a similar behavior.

Also, at some point the Azure fs implementation will have to implement and pass the generic filesystem tests, which do have a test for this situation.

I agree. I think we should fix #38772 before adding more operations. I implemented the GetFileInfo(select) with this as an assumption. CopyFile shouldn't implicitly create directories, so we need a way to check an empty directory exists.

@kou

kou commented Dec 5, 2023

Copy link
Copy Markdown
MemberAuthor

Oh, sorry. I didn't read the docstring. I'll remove the behavior.

Also, at some point the Azure fs implementation will have to implement and pass the generic filesystem tests, which do have a test for this situation.

I've opened a new issue for it: #39069

@kou

kou commented Dec 5, 2023

Copy link
Copy Markdown
MemberAuthor

I think there is a problem with the CopyFromUri() API though.

Nevermind, it looks like you've got a working implementation using CopyFromUri(). Maybe it does auth automatically if it detects that the source is in the same storage account. Or possibly the Azure SDK automatically switches between Copy Blob From URL and Copy Blob

I think that "Copy Blob From URL" and "Copy Blob" are the same API internally.
Both of them use the same URI and PUT:

And BlobClient provides only CopyFromUri(). (It doesn't provide Copy().)
So I used CopyFromUri().

@kou
kouforce-pushed the cpp-azurefs-copy-file branch from df57308 to f1fd538CompareDecember 5, 2023 02:29
@kou

kou commented Dec 5, 2023

Copy link
Copy Markdown
MemberAuthor

Updated:

  • Accept only blob path for destination like other implementations.

@kou

kou commented Dec 6, 2023

Copy link
Copy Markdown
MemberAuthor

I'll merge this in a few days if nobody objects it.

@Tom-NewtonTom-Newton left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

@Tom-Newton

Tom-Newton commented Dec 6, 2023

Copy link
Copy Markdown
Contributor

Personally I'm not particularly worried but to be rigorous @felipecrv's comment should probably be addressed.

CopyFile shouldn't implicitly create directories, so we need a way to check an empty directory exists.

@kou

kou commented Dec 7, 2023

Copy link
Copy Markdown
MemberAuthor

OK. I've implemented it.

@kou
kou merged commit 70ccf33 into apache:mainDec 7, 2023
@kou
kou deleted the cpp-azurefs-copy-file branch December 7, 2023 05:26
@koukou removed the awaiting committer review Awaiting committer review label Dec 7, 2023
@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 70ccf33.

There were 10 benchmark results indicating a performance regression:

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

dgreiss pushed a commit to dgreiss/arrow that referenced this pull request Feb 19, 2024
### Rationale for this change
`CopyFile()` copies the given source to the given destination. Both of source and destination must be blob name like other filesystem implementations.
### What changes are included in this PR?
Use `CopyFromUri()` API that should use server-side copy.
### Are these changes tested?
Yes.
### Are there any user-facing changes?
No.
* Closes: apache#38705
Authored-by: Sutou Kouhei <kou@clear-code.com>
Signed-off-by: Sutou Kouhei <kou@clear-code.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[C++][FS][Azure] Implement CopyFile()

4 participants

@kou@Tom-Newton@pitrou@felipecrv
, '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-38705: [C++][FS][Azure] Implement CopyFile() - #39058

Merged
kou merged 3 commits into
apache:mainfrom
kou:cpp-azurefs-copy-file
Dec 7, 2023
Merged

GH-38705: [C++][FS][Azure] Implement CopyFile()#39058
kou merged 3 commits into
apache:mainfrom
kou:cpp-azurefs-copy-file

Conversation

@kou

@koukou commented Dec 4, 2023

Copy link
Copy Markdown
Member

Rationale for this change

CopyFile() copies the given source to the given destination. Both of source and destination must be blob name like other filesystem implementations.

What changes are included in this PR?

Use CopyFromUri() API that should use server-side copy.

Are these changes tested?

Yes.

Are there any user-facing changes?

No.

@github-actions

Copy link
Copy Markdown

⚠️ GitHub issue #38705has been automatically assigned in GitHub to PR creator.

@kou

kou commented Dec 4, 2023

Copy link
Copy Markdown
MemberAuthor

@Tom-Newton@felipecrv What do you think about this behavior? I think that this is convenient but this is different from other filesystem implementations...

If the given destination has only container (container) or has trailing slash (container/directory/), base name of the given source is automatically appended. For example:

  • Source: container1/directory1/path.txt
  • Destination: container2
  • Real destination: container2/path.txt (path.txt is only appended to container2)

This is the same behavior as cp command. But other filesystem implementations require path not directory as destination.

@Tom-Newton

Copy link
Copy Markdown
Contributor

This behaviour sounds fine to me.

I think there is a problem with the CopyFromUri() API though. I believe it requires using SAS token auth on the source, because the source URI needs to be self authenticated.

@Tom-Newton

Copy link
Copy Markdown
Contributor

I think there is a problem with the CopyFromUri() API though.

Nevermind, it looks like you've got a working implementation using CopyFromUri(). Maybe it does auth automatically if it detects that the source is in the same storage account. Or possibly the Azure SDK automatically switches between Copy Blob From URL and Copy Blob

@pitrou

Copy link
Copy Markdown
Member

I think that this is convenient but this is different from other filesystem implementations...

We should not diverge from the filesystem spec (as described in the FileSystem class docstrings ).
The end goal is for all implementations to expose a similar behavior.

Also, at some point the Azure fs implementation will have to implement and pass the generic filesystem tests, which do have a test for this situation.

@felipecrv

Copy link
Copy Markdown
Contributor

I think that this is convenient but this is different from other filesystem implementations...

We should not diverge from the filesystem spec (as described in the FileSystem class docstrings ). The end goal is for all implementations to expose a similar behavior.

Also, at some point the Azure fs implementation will have to implement and pass the generic filesystem tests, which do have a test for this situation.

I agree. I think we should fix #38772 before adding more operations. I implemented the GetFileInfo(select) with this as an assumption. CopyFile shouldn't implicitly create directories, so we need a way to check an empty directory exists.

@kou

kou commented Dec 5, 2023

Copy link
Copy Markdown
MemberAuthor

Oh, sorry. I didn't read the docstring. I'll remove the behavior.

Also, at some point the Azure fs implementation will have to implement and pass the generic filesystem tests, which do have a test for this situation.

I've opened a new issue for it: #39069

@kou

kou commented Dec 5, 2023

Copy link
Copy Markdown
MemberAuthor

I think there is a problem with the CopyFromUri() API though.

Nevermind, it looks like you've got a working implementation using CopyFromUri(). Maybe it does auth automatically if it detects that the source is in the same storage account. Or possibly the Azure SDK automatically switches between Copy Blob From URL and Copy Blob

I think that "Copy Blob From URL" and "Copy Blob" are the same API internally.
Both of them use the same URI and PUT:

And BlobClient provides only CopyFromUri(). (It doesn't provide Copy().)
So I used CopyFromUri().

@kou
kouforce-pushed the cpp-azurefs-copy-file branch from df57308 to f1fd538CompareDecember 5, 2023 02:29
@kou

kou commented Dec 5, 2023

Copy link
Copy Markdown
MemberAuthor

Updated:

  • Accept only blob path for destination like other implementations.

@kou

kou commented Dec 6, 2023

Copy link
Copy Markdown
MemberAuthor

I'll merge this in a few days if nobody objects it.

@Tom-NewtonTom-Newton left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

@Tom-Newton

Tom-Newton commented Dec 6, 2023

Copy link
Copy Markdown
Contributor

Personally I'm not particularly worried but to be rigorous @felipecrv's comment should probably be addressed.

CopyFile shouldn't implicitly create directories, so we need a way to check an empty directory exists.

@kou

kou commented Dec 7, 2023

Copy link
Copy Markdown
MemberAuthor

OK. I've implemented it.

@kou
kou merged commit 70ccf33 into apache:mainDec 7, 2023
@kou
kou deleted the cpp-azurefs-copy-file branch December 7, 2023 05:26
@koukou removed the awaiting committer review Awaiting committer review label Dec 7, 2023
@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 70ccf33.

There were 10 benchmark results indicating a performance regression:

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

dgreiss pushed a commit to dgreiss/arrow that referenced this pull request Feb 19, 2024
### Rationale for this change
`CopyFile()` copies the given source to the given destination. Both of source and destination must be blob name like other filesystem implementations.
### What changes are included in this PR?
Use `CopyFromUri()` API that should use server-side copy.
### Are these changes tested?
Yes.
### Are there any user-facing changes?
No.
* Closes: apache#38705
Authored-by: Sutou Kouhei <kou@clear-code.com>
Signed-off-by: Sutou Kouhei <kou@clear-code.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[C++][FS][Azure] Implement CopyFile()

4 participants

@kou@Tom-Newton@pitrou@felipecrv
, '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-38705: [C++][FS][Azure] Implement CopyFile() - #39058

Merged
kou merged 3 commits into
apache:mainfrom
kou:cpp-azurefs-copy-file
Dec 7, 2023
Merged

GH-38705: [C++][FS][Azure] Implement CopyFile()#39058
kou merged 3 commits into
apache:mainfrom
kou:cpp-azurefs-copy-file

Conversation

@kou

@koukou commented Dec 4, 2023

Copy link
Copy Markdown
Member

Rationale for this change

CopyFile() copies the given source to the given destination. Both of source and destination must be blob name like other filesystem implementations.

What changes are included in this PR?

Use CopyFromUri() API that should use server-side copy.

Are these changes tested?

Yes.

Are there any user-facing changes?

No.

@github-actions

Copy link
Copy Markdown

⚠️ GitHub issue #38705has been automatically assigned in GitHub to PR creator.

@kou

kou commented Dec 4, 2023

Copy link
Copy Markdown
MemberAuthor

@Tom-Newton@felipecrv What do you think about this behavior? I think that this is convenient but this is different from other filesystem implementations...

If the given destination has only container (container) or has trailing slash (container/directory/), base name of the given source is automatically appended. For example:

  • Source: container1/directory1/path.txt
  • Destination: container2
  • Real destination: container2/path.txt (path.txt is only appended to container2)

This is the same behavior as cp command. But other filesystem implementations require path not directory as destination.

@Tom-Newton

Copy link
Copy Markdown
Contributor

This behaviour sounds fine to me.

I think there is a problem with the CopyFromUri() API though. I believe it requires using SAS token auth on the source, because the source URI needs to be self authenticated.

@Tom-Newton

Copy link
Copy Markdown
Contributor

I think there is a problem with the CopyFromUri() API though.

Nevermind, it looks like you've got a working implementation using CopyFromUri(). Maybe it does auth automatically if it detects that the source is in the same storage account. Or possibly the Azure SDK automatically switches between Copy Blob From URL and Copy Blob

@pitrou

Copy link
Copy Markdown
Member

I think that this is convenient but this is different from other filesystem implementations...

We should not diverge from the filesystem spec (as described in the FileSystem class docstrings ).
The end goal is for all implementations to expose a similar behavior.

Also, at some point the Azure fs implementation will have to implement and pass the generic filesystem tests, which do have a test for this situation.

@felipecrv

Copy link
Copy Markdown
Contributor

I think that this is convenient but this is different from other filesystem implementations...

We should not diverge from the filesystem spec (as described in the FileSystem class docstrings ). The end goal is for all implementations to expose a similar behavior.

Also, at some point the Azure fs implementation will have to implement and pass the generic filesystem tests, which do have a test for this situation.

I agree. I think we should fix #38772 before adding more operations. I implemented the GetFileInfo(select) with this as an assumption. CopyFile shouldn't implicitly create directories, so we need a way to check an empty directory exists.

@kou

kou commented Dec 5, 2023

Copy link
Copy Markdown
MemberAuthor

Oh, sorry. I didn't read the docstring. I'll remove the behavior.

Also, at some point the Azure fs implementation will have to implement and pass the generic filesystem tests, which do have a test for this situation.

I've opened a new issue for it: #39069

@kou

kou commented Dec 5, 2023

Copy link
Copy Markdown
MemberAuthor

I think there is a problem with the CopyFromUri() API though.

Nevermind, it looks like you've got a working implementation using CopyFromUri(). Maybe it does auth automatically if it detects that the source is in the same storage account. Or possibly the Azure SDK automatically switches between Copy Blob From URL and Copy Blob

I think that "Copy Blob From URL" and "Copy Blob" are the same API internally.
Both of them use the same URI and PUT:

And BlobClient provides only CopyFromUri(). (It doesn't provide Copy().)
So I used CopyFromUri().

@kou
kouforce-pushed the cpp-azurefs-copy-file branch from df57308 to f1fd538CompareDecember 5, 2023 02:29
@kou

kou commented Dec 5, 2023

Copy link
Copy Markdown
MemberAuthor

Updated:

  • Accept only blob path for destination like other implementations.

@kou

kou commented Dec 6, 2023

Copy link
Copy Markdown
MemberAuthor

I'll merge this in a few days if nobody objects it.

@Tom-NewtonTom-Newton left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

@Tom-Newton

Tom-Newton commented Dec 6, 2023

Copy link
Copy Markdown
Contributor

Personally I'm not particularly worried but to be rigorous @felipecrv's comment should probably be addressed.

CopyFile shouldn't implicitly create directories, so we need a way to check an empty directory exists.

@kou

kou commented Dec 7, 2023

Copy link
Copy Markdown
MemberAuthor

OK. I've implemented it.

@kou
kou merged commit 70ccf33 into apache:mainDec 7, 2023
@kou
kou deleted the cpp-azurefs-copy-file branch December 7, 2023 05:26
@koukou removed the awaiting committer review Awaiting committer review label Dec 7, 2023
@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 70ccf33.

There were 10 benchmark results indicating a performance regression:

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

dgreiss pushed a commit to dgreiss/arrow that referenced this pull request Feb 19, 2024
### Rationale for this change
`CopyFile()` copies the given source to the given destination. Both of source and destination must be blob name like other filesystem implementations.
### What changes are included in this PR?
Use `CopyFromUri()` API that should use server-side copy.
### Are these changes tested?
Yes.
### Are there any user-facing changes?
No.
* Closes: apache#38705
Authored-by: Sutou Kouhei <kou@clear-code.com>
Signed-off-by: Sutou Kouhei <kou@clear-code.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[C++][FS][Azure] Implement CopyFile()

4 participants

@kou@Tom-Newton@pitrou@felipecrv
, '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-38705: [C++][FS][Azure] Implement CopyFile() - #39058

Merged
kou merged 3 commits into
apache:mainfrom
kou:cpp-azurefs-copy-file
Dec 7, 2023
Merged

GH-38705: [C++][FS][Azure] Implement CopyFile()#39058
kou merged 3 commits into
apache:mainfrom
kou:cpp-azurefs-copy-file

Conversation

@kou

@koukou commented Dec 4, 2023

Copy link
Copy Markdown
Member

Rationale for this change

CopyFile() copies the given source to the given destination. Both of source and destination must be blob name like other filesystem implementations.

What changes are included in this PR?

Use CopyFromUri() API that should use server-side copy.

Are these changes tested?

Yes.

Are there any user-facing changes?

No.

@github-actions

Copy link
Copy Markdown

⚠️ GitHub issue #38705has been automatically assigned in GitHub to PR creator.

@kou

kou commented Dec 4, 2023

Copy link
Copy Markdown
MemberAuthor

@Tom-Newton@felipecrv What do you think about this behavior? I think that this is convenient but this is different from other filesystem implementations...

If the given destination has only container (container) or has trailing slash (container/directory/), base name of the given source is automatically appended. For example:

  • Source: container1/directory1/path.txt
  • Destination: container2
  • Real destination: container2/path.txt (path.txt is only appended to container2)

This is the same behavior as cp command. But other filesystem implementations require path not directory as destination.

@Tom-Newton

Copy link
Copy Markdown
Contributor

This behaviour sounds fine to me.

I think there is a problem with the CopyFromUri() API though. I believe it requires using SAS token auth on the source, because the source URI needs to be self authenticated.

@Tom-Newton

Copy link
Copy Markdown
Contributor

I think there is a problem with the CopyFromUri() API though.

Nevermind, it looks like you've got a working implementation using CopyFromUri(). Maybe it does auth automatically if it detects that the source is in the same storage account. Or possibly the Azure SDK automatically switches between Copy Blob From URL and Copy Blob

@pitrou

Copy link
Copy Markdown
Member

I think that this is convenient but this is different from other filesystem implementations...

We should not diverge from the filesystem spec (as described in the FileSystem class docstrings ).
The end goal is for all implementations to expose a similar behavior.

Also, at some point the Azure fs implementation will have to implement and pass the generic filesystem tests, which do have a test for this situation.

@felipecrv

Copy link
Copy Markdown
Contributor

I think that this is convenient but this is different from other filesystem implementations...

We should not diverge from the filesystem spec (as described in the FileSystem class docstrings ). The end goal is for all implementations to expose a similar behavior.

Also, at some point the Azure fs implementation will have to implement and pass the generic filesystem tests, which do have a test for this situation.

I agree. I think we should fix #38772 before adding more operations. I implemented the GetFileInfo(select) with this as an assumption. CopyFile shouldn't implicitly create directories, so we need a way to check an empty directory exists.

@kou

kou commented Dec 5, 2023

Copy link
Copy Markdown
MemberAuthor

Oh, sorry. I didn't read the docstring. I'll remove the behavior.

Also, at some point the Azure fs implementation will have to implement and pass the generic filesystem tests, which do have a test for this situation.

I've opened a new issue for it: #39069

@kou

kou commented Dec 5, 2023

Copy link
Copy Markdown
MemberAuthor

I think there is a problem with the CopyFromUri() API though.

Nevermind, it looks like you've got a working implementation using CopyFromUri(). Maybe it does auth automatically if it detects that the source is in the same storage account. Or possibly the Azure SDK automatically switches between Copy Blob From URL and Copy Blob

I think that "Copy Blob From URL" and "Copy Blob" are the same API internally.
Both of them use the same URI and PUT:

And BlobClient provides only CopyFromUri(). (It doesn't provide Copy().)
So I used CopyFromUri().

@kou
kouforce-pushed the cpp-azurefs-copy-file branch from df57308 to f1fd538CompareDecember 5, 2023 02:29
@kou

kou commented Dec 5, 2023

Copy link
Copy Markdown
MemberAuthor

Updated:

  • Accept only blob path for destination like other implementations.

@kou

kou commented Dec 6, 2023

Copy link
Copy Markdown
MemberAuthor

I'll merge this in a few days if nobody objects it.

@Tom-NewtonTom-Newton left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

@Tom-Newton

Tom-Newton commented Dec 6, 2023

Copy link
Copy Markdown
Contributor

Personally I'm not particularly worried but to be rigorous @felipecrv's comment should probably be addressed.

CopyFile shouldn't implicitly create directories, so we need a way to check an empty directory exists.

@kou

kou commented Dec 7, 2023

Copy link
Copy Markdown
MemberAuthor

OK. I've implemented it.

@kou
kou merged commit 70ccf33 into apache:mainDec 7, 2023
@kou
kou deleted the cpp-azurefs-copy-file branch December 7, 2023 05:26
@koukou removed the awaiting committer review Awaiting committer review label Dec 7, 2023
@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 70ccf33.

There were 10 benchmark results indicating a performance regression:

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

dgreiss pushed a commit to dgreiss/arrow that referenced this pull request Feb 19, 2024
### Rationale for this change
`CopyFile()` copies the given source to the given destination. Both of source and destination must be blob name like other filesystem implementations.
### What changes are included in this PR?
Use `CopyFromUri()` API that should use server-side copy.
### Are these changes tested?
Yes.
### Are there any user-facing changes?
No.
* Closes: apache#38705
Authored-by: Sutou Kouhei <kou@clear-code.com>
Signed-off-by: Sutou Kouhei <kou@clear-code.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[C++][FS][Azure] Implement CopyFile()

4 participants

@kou@Tom-Newton@pitrou@felipecrv
, '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-38705: [C++][FS][Azure] Implement CopyFile() - #39058

Merged
kou merged 3 commits into
apache:mainfrom
kou:cpp-azurefs-copy-file
Dec 7, 2023
Merged

GH-38705: [C++][FS][Azure] Implement CopyFile()#39058
kou merged 3 commits into
apache:mainfrom
kou:cpp-azurefs-copy-file

Conversation

@kou

@koukou commented Dec 4, 2023

Copy link
Copy Markdown
Member

Rationale for this change

CopyFile() copies the given source to the given destination. Both of source and destination must be blob name like other filesystem implementations.

What changes are included in this PR?

Use CopyFromUri() API that should use server-side copy.

Are these changes tested?

Yes.

Are there any user-facing changes?

No.

@github-actions

Copy link
Copy Markdown

⚠️ GitHub issue #38705has been automatically assigned in GitHub to PR creator.

@kou

kou commented Dec 4, 2023

Copy link
Copy Markdown
MemberAuthor

@Tom-Newton@felipecrv What do you think about this behavior? I think that this is convenient but this is different from other filesystem implementations...

If the given destination has only container (container) or has trailing slash (container/directory/), base name of the given source is automatically appended. For example:

  • Source: container1/directory1/path.txt
  • Destination: container2
  • Real destination: container2/path.txt (path.txt is only appended to container2)

This is the same behavior as cp command. But other filesystem implementations require path not directory as destination.

@Tom-Newton

Copy link
Copy Markdown
Contributor

This behaviour sounds fine to me.

I think there is a problem with the CopyFromUri() API though. I believe it requires using SAS token auth on the source, because the source URI needs to be self authenticated.

@Tom-Newton

Copy link
Copy Markdown
Contributor

I think there is a problem with the CopyFromUri() API though.

Nevermind, it looks like you've got a working implementation using CopyFromUri(). Maybe it does auth automatically if it detects that the source is in the same storage account. Or possibly the Azure SDK automatically switches between Copy Blob From URL and Copy Blob

@pitrou

Copy link
Copy Markdown
Member

I think that this is convenient but this is different from other filesystem implementations...

We should not diverge from the filesystem spec (as described in the FileSystem class docstrings ).
The end goal is for all implementations to expose a similar behavior.

Also, at some point the Azure fs implementation will have to implement and pass the generic filesystem tests, which do have a test for this situation.

@felipecrv

Copy link
Copy Markdown
Contributor

I think that this is convenient but this is different from other filesystem implementations...

We should not diverge from the filesystem spec (as described in the FileSystem class docstrings ). The end goal is for all implementations to expose a similar behavior.

Also, at some point the Azure fs implementation will have to implement and pass the generic filesystem tests, which do have a test for this situation.

I agree. I think we should fix #38772 before adding more operations. I implemented the GetFileInfo(select) with this as an assumption. CopyFile shouldn't implicitly create directories, so we need a way to check an empty directory exists.

@kou

kou commented Dec 5, 2023

Copy link
Copy Markdown
MemberAuthor

Oh, sorry. I didn't read the docstring. I'll remove the behavior.

Also, at some point the Azure fs implementation will have to implement and pass the generic filesystem tests, which do have a test for this situation.

I've opened a new issue for it: #39069

@kou

kou commented Dec 5, 2023

Copy link
Copy Markdown
MemberAuthor

I think there is a problem with the CopyFromUri() API though.

Nevermind, it looks like you've got a working implementation using CopyFromUri(). Maybe it does auth automatically if it detects that the source is in the same storage account. Or possibly the Azure SDK automatically switches between Copy Blob From URL and Copy Blob

I think that "Copy Blob From URL" and "Copy Blob" are the same API internally.
Both of them use the same URI and PUT:

And BlobClient provides only CopyFromUri(). (It doesn't provide Copy().)
So I used CopyFromUri().

@kou
kouforce-pushed the cpp-azurefs-copy-file branch from df57308 to f1fd538CompareDecember 5, 2023 02:29
@kou

kou commented Dec 5, 2023

Copy link
Copy Markdown
MemberAuthor

Updated:

  • Accept only blob path for destination like other implementations.

@kou

kou commented Dec 6, 2023

Copy link
Copy Markdown
MemberAuthor

I'll merge this in a few days if nobody objects it.

@Tom-NewtonTom-Newton left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

@Tom-Newton

Tom-Newton commented Dec 6, 2023

Copy link
Copy Markdown
Contributor

Personally I'm not particularly worried but to be rigorous @felipecrv's comment should probably be addressed.

CopyFile shouldn't implicitly create directories, so we need a way to check an empty directory exists.

@kou

kou commented Dec 7, 2023

Copy link
Copy Markdown
MemberAuthor

OK. I've implemented it.

@kou
kou merged commit 70ccf33 into apache:mainDec 7, 2023
@kou
kou deleted the cpp-azurefs-copy-file branch December 7, 2023 05:26
@koukou removed the awaiting committer review Awaiting committer review label Dec 7, 2023
@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 70ccf33.

There were 10 benchmark results indicating a performance regression:

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

dgreiss pushed a commit to dgreiss/arrow that referenced this pull request Feb 19, 2024
### Rationale for this change
`CopyFile()` copies the given source to the given destination. Both of source and destination must be blob name like other filesystem implementations.
### What changes are included in this PR?
Use `CopyFromUri()` API that should use server-side copy.
### Are these changes tested?
Yes.
### Are there any user-facing changes?
No.
* Closes: apache#38705
Authored-by: Sutou Kouhei <kou@clear-code.com>
Signed-off-by: Sutou Kouhei <kou@clear-code.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[C++][FS][Azure] Implement CopyFile()

4 participants

@kou@Tom-Newton@pitrou@felipecrv