Skip to content

ARROW-13168: [C++][R] Enable runtime timezone database for Windows - #12536

Closed
wjones127 wants to merge 35 commits into
apache:masterfrom
wjones127:ARROW-13168-timezone-database
Closed

ARROW-13168: [C++][R] Enable runtime timezone database for Windows#12536
wjones127 wants to merge 35 commits into
apache:masterfrom
wjones127:ARROW-13168-timezone-database

Conversation

@wjones127

@wjones127wjones127 commented Mar 1, 2022

Copy link
Copy Markdown
Member

This allows for runtime configuration of the timezone database on Windows for C++ and R. Python will be handled later because it's available timezone libraries use the binary rather than text format, which is not yet supported the vendored date library.

For R, Windows will only support the "C" locale, since (as far as I can tell) that's the only locale supported by the MingW std::locale implementation. I think R itself gets around this by implementing a completely custom version of strftime() and friends.

@github-actions

Copy link
Copy Markdown

@wjones127

Copy link
Copy Markdown
MemberAuthor

So timezone database seems to work, but methods that rely on std::local currently error with:

Error (test-dplyr-funcs-datetime.R:344:3): extract month from timestamp
Error: Invalid: Cannot find locale 'English_United States.1252': locale::facet::_S_create_c_locale name not valid
C:/Users/voltron/arrow/cpp/src/arrow/compute/kernels/scalar_temporal_unary.cc:1085 GetLocale(options.locale)
C:/Users/voltron/arrow/cpp/src/arrow/compute/kernels/scalar_temporal_unary.cc:1105 Make(ctx, *in.type)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec.cc:700 kernel_->exec(kernel_ctx_, batch, &out)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec.cc:641 ExecuteBatch(batch, listener)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec/expression.cc:547 executor->Execute(arguments, &listener)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec/expression.cc:533 ExecuteScalarExpression(call->arguments[i], input, exec_context)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec/project_node.cc:91 ExecuteScalarExpression(simplified_expr, target, plan()->exec_context())
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec/exec_plan.cc:484 iterator_.Next()
C:/Users/voltron/arrow/cpp/src/arrow/record_batch.cc:336 ReadNext(&batch)
C:/Users/voltron/arrow/cpp/src/arrow/record_batch.cc:347 ReadAll(&batches)

These do work if you set Sys.setlocale("LC_TIME", "C"). If I don't find a fix for this, I may consider only supporting the "C" locale on Windows.

Comment threadr/R/arrow-package.R Outdated
Comment threadr/R/dplyr-funcs-datetime.R Outdated
Comment threadr/tests/testthat/test-dplyr-funcs-datetime.R Outdated
@wjones127
wjones127force-pushed the ARROW-13168-timezone-database branch from d8aeb45 to 2171629CompareMarch 8, 2022 18:08
@wjones127
wjones127force-pushed the ARROW-13168-timezone-database branch from 497aab6 to ab5d038CompareMarch 10, 2022 22:27
@wjones127

Copy link
Copy Markdown
MemberAuthor

CI failure is unrelated Flight error.

@wjones127

Copy link
Copy Markdown
MemberAuthor

cc @pitrou

@rem Download IANA Timezone Database for unit tests
@rem
@rem (Doc section: Download timezone database)
curl https://data.iana.org/time-zones/releases/tzdata2021e.tar.gz --output tzdata.tar.gz

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.

Will this always be the same DB that R and Python will be using?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

No that 2021e is a version, which won't necessarily align with the R and Python ones in the future. I don't think it matters that we update it, unless the format changes somehow. This is just for testing that it works, and we don't ship it.

But the R unit tests use the one provided by the tzdb package, so we are testing that as well.

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.

Currently US and EU have DST, but they plan to abolish it soon. At that point we will have Python and R DBs with fresh DSTless times and arrow c++ using DST for tests. In isolation that's ok, but we do have tests comparing pandas and pyarrow results and similar for lubridate. It's not a big problem for sure, but if there is like a tzdata-latest.tar.gz that would be great.

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.

The times in the past won't change, so unless we test against a random "now", updates to the timezone database (such as for DST policy changes) shouldn't impact those tests?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Yeah this should be fine as is. We will never be testing between timezone databases.

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.

We currently test arrow vs pandas tzdb in CI. We have a test for a timestamp in 2033 and if it is in DST and DST is abolished it will error if we'll be using a pre-abolishment db with arrow and post-abolishment db with pandas. This is super irrelevant and as it's a simple fix and I'm sorry for wasting your time :).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Ah got it. We'll address in the follow up PR where we'll have PyArrow use tzdb. For now the python timestamp tests are skipped on Windows

ifsys.platform=='win32':
# TODO: We should test on windows once ARROW-13168 is resolved.
pytest.skip('Timezone database is not available on Windows yet')

@pitroupitrou 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.

Thanks a lot for this @wjones127 . Here are some comments.

Comment threadcpp/src/arrow/config.h Outdated
Comment threadcpp/src/arrow/config.cc
Comment threadcpp/src/arrow/config.cc Outdated
Comment threadcpp/src/arrow/public_api_test.cc Outdated
Comment threadcpp/src/arrow/public_api_test.cc Outdated
Comment threaddocs/source/cpp/build_system.rst Outdated
Comment threaddocs/source/developers/cpp/windows.rst Outdated
Comment on lines +176 to +179
.. literalinclude:: ../../../ci/appveyor-cpp-setup.bat
:language: cmd
:start-after: @rem (Doc section: Download timezone database)
:end-before: @rem (Doc section: Download timezone database)

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'd rather if you copied the relevant snippet here, we shouldn't ideally rely on the contents of CI scripts (which may contain specific quirks that irrelevant to normal user setups) for the public docs.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Since we are pulling a specific part of the script, we should easily be able to avoid quirks? I like the idea of having our build instructions tested in CI. And we reference the CI scripts regularly when providing build instructions.

At the very least, if we get to a point where the public instructions and CI instructions diverge, we can easily separate them.


TEST_F(ScalarTemporalTest, StrftimeOtherLocale) {
#ifdef _WIN32
GTEST_SKIP() << "There is a known bug in strftime for locales on Windows (ARROW-15922)";

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 on Windows or specifically MinGW? i.e., would the non-MinGW Windows CI pass if you remove this skip? I'm wondering if we can narrow the condition.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

If failed on Windows 2019 C++17, which uses MSVC. But seems like it was actually passing on MinGW. So maybe I can try skipping for just MSVC?

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.

That's a bit weird, MinGW is just a different compiler but targetting the same runtime libraries...

@wjones127wjones127Mar 23, 2022

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Actually, I think the test is likely skipping on the LocaleExists("fr_FR.UTF-8") condition; IIRC MinGW doesn't support locales apart from "C" and "POSIX". Sadly, no indication in CI whether the test was skipped: https://github.com/apache/arrow/runs/5504310182?check_suite_focus=true

:start-after: @rem (Doc section: Download timezone database)
:end-before: @rem (Doc section: Download timezone database)

By default, the timezone database will be detected at ``%USERPROFILE%\Downloads\tzdata``,

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 a reliable location? Is there a risk that the downloads folder gets cleared from time to time?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

This is the behavior of the vendored datetime library, not something we chose. I think it's a fine default for testing and in production applications I expect users will manually specify a more appropriate path at runtime.

@jonkeanejonkeane 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.

A few things I noticed in CI

Comment threadr/src/config.cpp Outdated
Comment threadcpp/src/arrow/config.cc Outdated
wjones127and others added 2 commits March 24, 2022 19:40
Co-authored-by: Jonathan Keane <jkeane@gmail.com>
set -ex

# Download database
curl https://data.iana.org/time-zones/releases/tzdata2021e.tar.gz --output ~/Downloads/tzdata2021e.tar.gz

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.

FWIW, they just released 2022a a few days ago

Comment threadr/R/arrow-package.R Outdated
Co-authored-by: Davis Vaughan <davis@rstudio.com>
Comment threadr/tests/testthat/test-dplyr-funcs-datetime.R
@jonkeane

Copy link
Copy Markdown
Member

Are there any outstanding comments that we need to resolve before merging?

The failures in CI both look unrelated. I'm happy to merge if no one objects

@ursabot

ursabot commented Mar 28, 2022

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = 919d113 and contender = f4dfd6c. f4dfd6c is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️0.34% ⬆️0.0%] test-mac-arm
[Finished ⬇️0.36% ⬆️0.0%] ursa-i9-9960x
[Finished ⬇️1.02% ⬆️0.81%] ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python, R. Runs only benchmarks with cloud = True
test-mac-arm: Supported benchmark langs: C++, Python, R
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

@wjones127

Copy link
Copy Markdown
MemberAuthor

Follow-up Jira created: https://issues.apache.org/jira/browse/ARROW-16054

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.

9 participants

@wjones127@jonkeane@ursabot@rok@jorisvandenbossche@pitrou@nealrichardson@paleolimbot@DavisVaughan
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
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;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
ARROW-13168: [C++][R] Enable runtime timezone database for Windows by wjones127 · Pull Request #12536 · apache/arrow · GitHub
Skip to content

ARROW-13168: [C++][R] Enable runtime timezone database for Windows - #12536

Closed
wjones127 wants to merge 35 commits into
apache:masterfrom
wjones127:ARROW-13168-timezone-database
Closed

ARROW-13168: [C++][R] Enable runtime timezone database for Windows#12536
wjones127 wants to merge 35 commits into
apache:masterfrom
wjones127:ARROW-13168-timezone-database

Conversation

@wjones127

@wjones127wjones127 commented Mar 1, 2022

Copy link
Copy Markdown
Member

This allows for runtime configuration of the timezone database on Windows for C++ and R. Python will be handled later because it's available timezone libraries use the binary rather than text format, which is not yet supported the vendored date library.

For R, Windows will only support the "C" locale, since (as far as I can tell) that's the only locale supported by the MingW std::locale implementation. I think R itself gets around this by implementing a completely custom version of strftime() and friends.

@github-actions

Copy link
Copy Markdown

@wjones127

Copy link
Copy Markdown
MemberAuthor

So timezone database seems to work, but methods that rely on std::local currently error with:

Error (test-dplyr-funcs-datetime.R:344:3): extract month from timestamp
Error: Invalid: Cannot find locale 'English_United States.1252': locale::facet::_S_create_c_locale name not valid
C:/Users/voltron/arrow/cpp/src/arrow/compute/kernels/scalar_temporal_unary.cc:1085 GetLocale(options.locale)
C:/Users/voltron/arrow/cpp/src/arrow/compute/kernels/scalar_temporal_unary.cc:1105 Make(ctx, *in.type)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec.cc:700 kernel_->exec(kernel_ctx_, batch, &out)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec.cc:641 ExecuteBatch(batch, listener)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec/expression.cc:547 executor->Execute(arguments, &listener)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec/expression.cc:533 ExecuteScalarExpression(call->arguments[i], input, exec_context)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec/project_node.cc:91 ExecuteScalarExpression(simplified_expr, target, plan()->exec_context())
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec/exec_plan.cc:484 iterator_.Next()
C:/Users/voltron/arrow/cpp/src/arrow/record_batch.cc:336 ReadNext(&batch)
C:/Users/voltron/arrow/cpp/src/arrow/record_batch.cc:347 ReadAll(&batches)

These do work if you set Sys.setlocale("LC_TIME", "C"). If I don't find a fix for this, I may consider only supporting the "C" locale on Windows.

Comment threadr/R/arrow-package.R Outdated
Comment threadr/R/dplyr-funcs-datetime.R Outdated
Comment threadr/tests/testthat/test-dplyr-funcs-datetime.R Outdated
@wjones127
wjones127force-pushed the ARROW-13168-timezone-database branch from d8aeb45 to 2171629CompareMarch 8, 2022 18:08
@wjones127
wjones127force-pushed the ARROW-13168-timezone-database branch from 497aab6 to ab5d038CompareMarch 10, 2022 22:27
@wjones127

Copy link
Copy Markdown
MemberAuthor

CI failure is unrelated Flight error.

@wjones127

Copy link
Copy Markdown
MemberAuthor

cc @pitrou

@rem Download IANA Timezone Database for unit tests
@rem
@rem (Doc section: Download timezone database)
curl https://data.iana.org/time-zones/releases/tzdata2021e.tar.gz --output tzdata.tar.gz

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.

Will this always be the same DB that R and Python will be using?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

No that 2021e is a version, which won't necessarily align with the R and Python ones in the future. I don't think it matters that we update it, unless the format changes somehow. This is just for testing that it works, and we don't ship it.

But the R unit tests use the one provided by the tzdb package, so we are testing that as well.

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.

Currently US and EU have DST, but they plan to abolish it soon. At that point we will have Python and R DBs with fresh DSTless times and arrow c++ using DST for tests. In isolation that's ok, but we do have tests comparing pandas and pyarrow results and similar for lubridate. It's not a big problem for sure, but if there is like a tzdata-latest.tar.gz that would be great.

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.

The times in the past won't change, so unless we test against a random "now", updates to the timezone database (such as for DST policy changes) shouldn't impact those tests?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Yeah this should be fine as is. We will never be testing between timezone databases.

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.

We currently test arrow vs pandas tzdb in CI. We have a test for a timestamp in 2033 and if it is in DST and DST is abolished it will error if we'll be using a pre-abolishment db with arrow and post-abolishment db with pandas. This is super irrelevant and as it's a simple fix and I'm sorry for wasting your time :).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Ah got it. We'll address in the follow up PR where we'll have PyArrow use tzdb. For now the python timestamp tests are skipped on Windows

ifsys.platform=='win32':
# TODO: We should test on windows once ARROW-13168 is resolved.
pytest.skip('Timezone database is not available on Windows yet')

@pitroupitrou 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.

Thanks a lot for this @wjones127 . Here are some comments.

Comment threadcpp/src/arrow/config.h Outdated
Comment threadcpp/src/arrow/config.cc
Comment threadcpp/src/arrow/config.cc Outdated
Comment threadcpp/src/arrow/public_api_test.cc Outdated
Comment threadcpp/src/arrow/public_api_test.cc Outdated
Comment threaddocs/source/cpp/build_system.rst Outdated
Comment threaddocs/source/developers/cpp/windows.rst Outdated
Comment on lines +176 to +179
.. literalinclude:: ../../../ci/appveyor-cpp-setup.bat
:language: cmd
:start-after: @rem (Doc section: Download timezone database)
:end-before: @rem (Doc section: Download timezone database)

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'd rather if you copied the relevant snippet here, we shouldn't ideally rely on the contents of CI scripts (which may contain specific quirks that irrelevant to normal user setups) for the public docs.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Since we are pulling a specific part of the script, we should easily be able to avoid quirks? I like the idea of having our build instructions tested in CI. And we reference the CI scripts regularly when providing build instructions.

At the very least, if we get to a point where the public instructions and CI instructions diverge, we can easily separate them.


TEST_F(ScalarTemporalTest, StrftimeOtherLocale) {
#ifdef _WIN32
GTEST_SKIP() << "There is a known bug in strftime for locales on Windows (ARROW-15922)";

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 on Windows or specifically MinGW? i.e., would the non-MinGW Windows CI pass if you remove this skip? I'm wondering if we can narrow the condition.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

If failed on Windows 2019 C++17, which uses MSVC. But seems like it was actually passing on MinGW. So maybe I can try skipping for just MSVC?

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.

That's a bit weird, MinGW is just a different compiler but targetting the same runtime libraries...

@wjones127wjones127Mar 23, 2022

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Actually, I think the test is likely skipping on the LocaleExists("fr_FR.UTF-8") condition; IIRC MinGW doesn't support locales apart from "C" and "POSIX". Sadly, no indication in CI whether the test was skipped: https://github.com/apache/arrow/runs/5504310182?check_suite_focus=true

:start-after: @rem (Doc section: Download timezone database)
:end-before: @rem (Doc section: Download timezone database)

By default, the timezone database will be detected at ``%USERPROFILE%\Downloads\tzdata``,

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 a reliable location? Is there a risk that the downloads folder gets cleared from time to time?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

This is the behavior of the vendored datetime library, not something we chose. I think it's a fine default for testing and in production applications I expect users will manually specify a more appropriate path at runtime.

@jonkeanejonkeane 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.

A few things I noticed in CI

Comment threadr/src/config.cpp Outdated
Comment threadcpp/src/arrow/config.cc Outdated
wjones127and others added 2 commits March 24, 2022 19:40
Co-authored-by: Jonathan Keane <jkeane@gmail.com>
set -ex

# Download database
curl https://data.iana.org/time-zones/releases/tzdata2021e.tar.gz --output ~/Downloads/tzdata2021e.tar.gz

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.

FWIW, they just released 2022a a few days ago

Comment threadr/R/arrow-package.R Outdated
Co-authored-by: Davis Vaughan <davis@rstudio.com>
Comment threadr/tests/testthat/test-dplyr-funcs-datetime.R
@jonkeane

Copy link
Copy Markdown
Member

Are there any outstanding comments that we need to resolve before merging?

The failures in CI both look unrelated. I'm happy to merge if no one objects

@ursabot

ursabot commented Mar 28, 2022

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = 919d113 and contender = f4dfd6c. f4dfd6c is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️0.34% ⬆️0.0%] test-mac-arm
[Finished ⬇️0.36% ⬆️0.0%] ursa-i9-9960x
[Finished ⬇️1.02% ⬆️0.81%] ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python, R. Runs only benchmarks with cloud = True
test-mac-arm: Supported benchmark langs: C++, Python, R
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

@wjones127

Copy link
Copy Markdown
MemberAuthor

Follow-up Jira created: https://issues.apache.org/jira/browse/ARROW-16054

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.

9 participants

@wjones127@jonkeane@ursabot@rok@jorisvandenbossche@pitrou@nealrichardson@paleolimbot@DavisVaughan
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' ARROW-13168: [C++][R] Enable runtime timezone database for Windows by wjones127 · Pull Request #12536 · apache/arrow · GitHub
Skip to content

ARROW-13168: [C++][R] Enable runtime timezone database for Windows - #12536

Closed
wjones127 wants to merge 35 commits into
apache:masterfrom
wjones127:ARROW-13168-timezone-database
Closed

ARROW-13168: [C++][R] Enable runtime timezone database for Windows#12536
wjones127 wants to merge 35 commits into
apache:masterfrom
wjones127:ARROW-13168-timezone-database

Conversation

@wjones127

@wjones127wjones127 commented Mar 1, 2022

Copy link
Copy Markdown
Member

This allows for runtime configuration of the timezone database on Windows for C++ and R. Python will be handled later because it's available timezone libraries use the binary rather than text format, which is not yet supported the vendored date library.

For R, Windows will only support the "C" locale, since (as far as I can tell) that's the only locale supported by the MingW std::locale implementation. I think R itself gets around this by implementing a completely custom version of strftime() and friends.

@github-actions

Copy link
Copy Markdown

@wjones127

Copy link
Copy Markdown
MemberAuthor

So timezone database seems to work, but methods that rely on std::local currently error with:

Error (test-dplyr-funcs-datetime.R:344:3): extract month from timestamp
Error: Invalid: Cannot find locale 'English_United States.1252': locale::facet::_S_create_c_locale name not valid
C:/Users/voltron/arrow/cpp/src/arrow/compute/kernels/scalar_temporal_unary.cc:1085 GetLocale(options.locale)
C:/Users/voltron/arrow/cpp/src/arrow/compute/kernels/scalar_temporal_unary.cc:1105 Make(ctx, *in.type)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec.cc:700 kernel_->exec(kernel_ctx_, batch, &out)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec.cc:641 ExecuteBatch(batch, listener)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec/expression.cc:547 executor->Execute(arguments, &listener)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec/expression.cc:533 ExecuteScalarExpression(call->arguments[i], input, exec_context)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec/project_node.cc:91 ExecuteScalarExpression(simplified_expr, target, plan()->exec_context())
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec/exec_plan.cc:484 iterator_.Next()
C:/Users/voltron/arrow/cpp/src/arrow/record_batch.cc:336 ReadNext(&batch)
C:/Users/voltron/arrow/cpp/src/arrow/record_batch.cc:347 ReadAll(&batches)

These do work if you set Sys.setlocale("LC_TIME", "C"). If I don't find a fix for this, I may consider only supporting the "C" locale on Windows.

Comment threadr/R/arrow-package.R Outdated
Comment threadr/R/dplyr-funcs-datetime.R Outdated
Comment threadr/tests/testthat/test-dplyr-funcs-datetime.R Outdated
@wjones127
wjones127force-pushed the ARROW-13168-timezone-database branch from d8aeb45 to 2171629CompareMarch 8, 2022 18:08
@wjones127
wjones127force-pushed the ARROW-13168-timezone-database branch from 497aab6 to ab5d038CompareMarch 10, 2022 22:27
@wjones127

Copy link
Copy Markdown
MemberAuthor

CI failure is unrelated Flight error.

@wjones127

Copy link
Copy Markdown
MemberAuthor

cc @pitrou

@rem Download IANA Timezone Database for unit tests
@rem
@rem (Doc section: Download timezone database)
curl https://data.iana.org/time-zones/releases/tzdata2021e.tar.gz --output tzdata.tar.gz

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.

Will this always be the same DB that R and Python will be using?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

No that 2021e is a version, which won't necessarily align with the R and Python ones in the future. I don't think it matters that we update it, unless the format changes somehow. This is just for testing that it works, and we don't ship it.

But the R unit tests use the one provided by the tzdb package, so we are testing that as well.

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.

Currently US and EU have DST, but they plan to abolish it soon. At that point we will have Python and R DBs with fresh DSTless times and arrow c++ using DST for tests. In isolation that's ok, but we do have tests comparing pandas and pyarrow results and similar for lubridate. It's not a big problem for sure, but if there is like a tzdata-latest.tar.gz that would be great.

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.

The times in the past won't change, so unless we test against a random "now", updates to the timezone database (such as for DST policy changes) shouldn't impact those tests?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Yeah this should be fine as is. We will never be testing between timezone databases.

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.

We currently test arrow vs pandas tzdb in CI. We have a test for a timestamp in 2033 and if it is in DST and DST is abolished it will error if we'll be using a pre-abolishment db with arrow and post-abolishment db with pandas. This is super irrelevant and as it's a simple fix and I'm sorry for wasting your time :).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Ah got it. We'll address in the follow up PR where we'll have PyArrow use tzdb. For now the python timestamp tests are skipped on Windows

ifsys.platform=='win32':
# TODO: We should test on windows once ARROW-13168 is resolved.
pytest.skip('Timezone database is not available on Windows yet')

@pitroupitrou 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.

Thanks a lot for this @wjones127 . Here are some comments.

Comment threadcpp/src/arrow/config.h Outdated
Comment threadcpp/src/arrow/config.cc
Comment threadcpp/src/arrow/config.cc Outdated
Comment threadcpp/src/arrow/public_api_test.cc Outdated
Comment threadcpp/src/arrow/public_api_test.cc Outdated
Comment threaddocs/source/cpp/build_system.rst Outdated
Comment threaddocs/source/developers/cpp/windows.rst Outdated
Comment on lines +176 to +179
.. literalinclude:: ../../../ci/appveyor-cpp-setup.bat
:language: cmd
:start-after: @rem (Doc section: Download timezone database)
:end-before: @rem (Doc section: Download timezone database)

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'd rather if you copied the relevant snippet here, we shouldn't ideally rely on the contents of CI scripts (which may contain specific quirks that irrelevant to normal user setups) for the public docs.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Since we are pulling a specific part of the script, we should easily be able to avoid quirks? I like the idea of having our build instructions tested in CI. And we reference the CI scripts regularly when providing build instructions.

At the very least, if we get to a point where the public instructions and CI instructions diverge, we can easily separate them.


TEST_F(ScalarTemporalTest, StrftimeOtherLocale) {
#ifdef _WIN32
GTEST_SKIP() << "There is a known bug in strftime for locales on Windows (ARROW-15922)";

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 on Windows or specifically MinGW? i.e., would the non-MinGW Windows CI pass if you remove this skip? I'm wondering if we can narrow the condition.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

If failed on Windows 2019 C++17, which uses MSVC. But seems like it was actually passing on MinGW. So maybe I can try skipping for just MSVC?

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.

That's a bit weird, MinGW is just a different compiler but targetting the same runtime libraries...

@wjones127wjones127Mar 23, 2022

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Actually, I think the test is likely skipping on the LocaleExists("fr_FR.UTF-8") condition; IIRC MinGW doesn't support locales apart from "C" and "POSIX". Sadly, no indication in CI whether the test was skipped: https://github.com/apache/arrow/runs/5504310182?check_suite_focus=true

:start-after: @rem (Doc section: Download timezone database)
:end-before: @rem (Doc section: Download timezone database)

By default, the timezone database will be detected at ``%USERPROFILE%\Downloads\tzdata``,

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 a reliable location? Is there a risk that the downloads folder gets cleared from time to time?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

This is the behavior of the vendored datetime library, not something we chose. I think it's a fine default for testing and in production applications I expect users will manually specify a more appropriate path at runtime.

@jonkeanejonkeane 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.

A few things I noticed in CI

Comment threadr/src/config.cpp Outdated
Comment threadcpp/src/arrow/config.cc Outdated
wjones127and others added 2 commits March 24, 2022 19:40
Co-authored-by: Jonathan Keane <jkeane@gmail.com>
set -ex

# Download database
curl https://data.iana.org/time-zones/releases/tzdata2021e.tar.gz --output ~/Downloads/tzdata2021e.tar.gz

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.

FWIW, they just released 2022a a few days ago

Comment threadr/R/arrow-package.R Outdated
Co-authored-by: Davis Vaughan <davis@rstudio.com>
Comment threadr/tests/testthat/test-dplyr-funcs-datetime.R
@jonkeane

Copy link
Copy Markdown
Member

Are there any outstanding comments that we need to resolve before merging?

The failures in CI both look unrelated. I'm happy to merge if no one objects

@ursabot

ursabot commented Mar 28, 2022

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = 919d113 and contender = f4dfd6c. f4dfd6c is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️0.34% ⬆️0.0%] test-mac-arm
[Finished ⬇️0.36% ⬆️0.0%] ursa-i9-9960x
[Finished ⬇️1.02% ⬆️0.81%] ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python, R. Runs only benchmarks with cloud = True
test-mac-arm: Supported benchmark langs: C++, Python, R
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

@wjones127

Copy link
Copy Markdown
MemberAuthor

Follow-up Jira created: https://issues.apache.org/jira/browse/ARROW-16054

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.

9 participants

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

ARROW-13168: [C++][R] Enable runtime timezone database for Windows - #12536

Closed
wjones127 wants to merge 35 commits into
apache:masterfrom
wjones127:ARROW-13168-timezone-database
Closed

ARROW-13168: [C++][R] Enable runtime timezone database for Windows#12536
wjones127 wants to merge 35 commits into
apache:masterfrom
wjones127:ARROW-13168-timezone-database

Conversation

@wjones127

@wjones127wjones127 commented Mar 1, 2022

Copy link
Copy Markdown
Member

This allows for runtime configuration of the timezone database on Windows for C++ and R. Python will be handled later because it's available timezone libraries use the binary rather than text format, which is not yet supported the vendored date library.

For R, Windows will only support the "C" locale, since (as far as I can tell) that's the only locale supported by the MingW std::locale implementation. I think R itself gets around this by implementing a completely custom version of strftime() and friends.

@github-actions

Copy link
Copy Markdown

@wjones127

Copy link
Copy Markdown
MemberAuthor

So timezone database seems to work, but methods that rely on std::local currently error with:

Error (test-dplyr-funcs-datetime.R:344:3): extract month from timestamp
Error: Invalid: Cannot find locale 'English_United States.1252': locale::facet::_S_create_c_locale name not valid
C:/Users/voltron/arrow/cpp/src/arrow/compute/kernels/scalar_temporal_unary.cc:1085 GetLocale(options.locale)
C:/Users/voltron/arrow/cpp/src/arrow/compute/kernels/scalar_temporal_unary.cc:1105 Make(ctx, *in.type)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec.cc:700 kernel_->exec(kernel_ctx_, batch, &out)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec.cc:641 ExecuteBatch(batch, listener)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec/expression.cc:547 executor->Execute(arguments, &listener)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec/expression.cc:533 ExecuteScalarExpression(call->arguments[i], input, exec_context)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec/project_node.cc:91 ExecuteScalarExpression(simplified_expr, target, plan()->exec_context())
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec/exec_plan.cc:484 iterator_.Next()
C:/Users/voltron/arrow/cpp/src/arrow/record_batch.cc:336 ReadNext(&batch)
C:/Users/voltron/arrow/cpp/src/arrow/record_batch.cc:347 ReadAll(&batches)

These do work if you set Sys.setlocale("LC_TIME", "C"). If I don't find a fix for this, I may consider only supporting the "C" locale on Windows.

Comment threadr/R/arrow-package.R Outdated
Comment threadr/R/dplyr-funcs-datetime.R Outdated
Comment threadr/tests/testthat/test-dplyr-funcs-datetime.R Outdated
@wjones127
wjones127force-pushed the ARROW-13168-timezone-database branch from d8aeb45 to 2171629CompareMarch 8, 2022 18:08
@wjones127
wjones127force-pushed the ARROW-13168-timezone-database branch from 497aab6 to ab5d038CompareMarch 10, 2022 22:27
@wjones127

Copy link
Copy Markdown
MemberAuthor

CI failure is unrelated Flight error.

@wjones127

Copy link
Copy Markdown
MemberAuthor

cc @pitrou

@rem Download IANA Timezone Database for unit tests
@rem
@rem (Doc section: Download timezone database)
curl https://data.iana.org/time-zones/releases/tzdata2021e.tar.gz --output tzdata.tar.gz

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.

Will this always be the same DB that R and Python will be using?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

No that 2021e is a version, which won't necessarily align with the R and Python ones in the future. I don't think it matters that we update it, unless the format changes somehow. This is just for testing that it works, and we don't ship it.

But the R unit tests use the one provided by the tzdb package, so we are testing that as well.

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.

Currently US and EU have DST, but they plan to abolish it soon. At that point we will have Python and R DBs with fresh DSTless times and arrow c++ using DST for tests. In isolation that's ok, but we do have tests comparing pandas and pyarrow results and similar for lubridate. It's not a big problem for sure, but if there is like a tzdata-latest.tar.gz that would be great.

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.

The times in the past won't change, so unless we test against a random "now", updates to the timezone database (such as for DST policy changes) shouldn't impact those tests?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Yeah this should be fine as is. We will never be testing between timezone databases.

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.

We currently test arrow vs pandas tzdb in CI. We have a test for a timestamp in 2033 and if it is in DST and DST is abolished it will error if we'll be using a pre-abolishment db with arrow and post-abolishment db with pandas. This is super irrelevant and as it's a simple fix and I'm sorry for wasting your time :).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Ah got it. We'll address in the follow up PR where we'll have PyArrow use tzdb. For now the python timestamp tests are skipped on Windows

ifsys.platform=='win32':
# TODO: We should test on windows once ARROW-13168 is resolved.
pytest.skip('Timezone database is not available on Windows yet')

@pitroupitrou 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.

Thanks a lot for this @wjones127 . Here are some comments.

Comment threadcpp/src/arrow/config.h Outdated
Comment threadcpp/src/arrow/config.cc
Comment threadcpp/src/arrow/config.cc Outdated
Comment threadcpp/src/arrow/public_api_test.cc Outdated
Comment threadcpp/src/arrow/public_api_test.cc Outdated
Comment threaddocs/source/cpp/build_system.rst Outdated
Comment threaddocs/source/developers/cpp/windows.rst Outdated
Comment on lines +176 to +179
.. literalinclude:: ../../../ci/appveyor-cpp-setup.bat
:language: cmd
:start-after: @rem (Doc section: Download timezone database)
:end-before: @rem (Doc section: Download timezone database)

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'd rather if you copied the relevant snippet here, we shouldn't ideally rely on the contents of CI scripts (which may contain specific quirks that irrelevant to normal user setups) for the public docs.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Since we are pulling a specific part of the script, we should easily be able to avoid quirks? I like the idea of having our build instructions tested in CI. And we reference the CI scripts regularly when providing build instructions.

At the very least, if we get to a point where the public instructions and CI instructions diverge, we can easily separate them.


TEST_F(ScalarTemporalTest, StrftimeOtherLocale) {
#ifdef _WIN32
GTEST_SKIP() << "There is a known bug in strftime for locales on Windows (ARROW-15922)";

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 on Windows or specifically MinGW? i.e., would the non-MinGW Windows CI pass if you remove this skip? I'm wondering if we can narrow the condition.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

If failed on Windows 2019 C++17, which uses MSVC. But seems like it was actually passing on MinGW. So maybe I can try skipping for just MSVC?

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.

That's a bit weird, MinGW is just a different compiler but targetting the same runtime libraries...

@wjones127wjones127Mar 23, 2022

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Actually, I think the test is likely skipping on the LocaleExists("fr_FR.UTF-8") condition; IIRC MinGW doesn't support locales apart from "C" and "POSIX". Sadly, no indication in CI whether the test was skipped: https://github.com/apache/arrow/runs/5504310182?check_suite_focus=true

:start-after: @rem (Doc section: Download timezone database)
:end-before: @rem (Doc section: Download timezone database)

By default, the timezone database will be detected at ``%USERPROFILE%\Downloads\tzdata``,

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 a reliable location? Is there a risk that the downloads folder gets cleared from time to time?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

This is the behavior of the vendored datetime library, not something we chose. I think it's a fine default for testing and in production applications I expect users will manually specify a more appropriate path at runtime.

@jonkeanejonkeane 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.

A few things I noticed in CI

Comment threadr/src/config.cpp Outdated
Comment threadcpp/src/arrow/config.cc Outdated
wjones127and others added 2 commits March 24, 2022 19:40
Co-authored-by: Jonathan Keane <jkeane@gmail.com>
set -ex

# Download database
curl https://data.iana.org/time-zones/releases/tzdata2021e.tar.gz --output ~/Downloads/tzdata2021e.tar.gz

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.

FWIW, they just released 2022a a few days ago

Comment threadr/R/arrow-package.R Outdated
Co-authored-by: Davis Vaughan <davis@rstudio.com>
Comment threadr/tests/testthat/test-dplyr-funcs-datetime.R
@jonkeane

Copy link
Copy Markdown
Member

Are there any outstanding comments that we need to resolve before merging?

The failures in CI both look unrelated. I'm happy to merge if no one objects

@ursabot

ursabot commented Mar 28, 2022

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = 919d113 and contender = f4dfd6c. f4dfd6c is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️0.34% ⬆️0.0%] test-mac-arm
[Finished ⬇️0.36% ⬆️0.0%] ursa-i9-9960x
[Finished ⬇️1.02% ⬆️0.81%] ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python, R. Runs only benchmarks with cloud = True
test-mac-arm: Supported benchmark langs: C++, Python, R
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

@wjones127

Copy link
Copy Markdown
MemberAuthor

Follow-up Jira created: https://issues.apache.org/jira/browse/ARROW-16054

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.

9 participants

@wjones127@jonkeane@ursabot@rok@jorisvandenbossche@pitrou@nealrichardson@paleolimbot@DavisVaughan
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' ARROW-13168: [C++][R] Enable runtime timezone database for Windows by wjones127 · Pull Request #12536 · apache/arrow · GitHub
Skip to content

ARROW-13168: [C++][R] Enable runtime timezone database for Windows - #12536

Closed
wjones127 wants to merge 35 commits into
apache:masterfrom
wjones127:ARROW-13168-timezone-database
Closed

ARROW-13168: [C++][R] Enable runtime timezone database for Windows#12536
wjones127 wants to merge 35 commits into
apache:masterfrom
wjones127:ARROW-13168-timezone-database

Conversation

@wjones127

@wjones127wjones127 commented Mar 1, 2022

Copy link
Copy Markdown
Member

This allows for runtime configuration of the timezone database on Windows for C++ and R. Python will be handled later because it's available timezone libraries use the binary rather than text format, which is not yet supported the vendored date library.

For R, Windows will only support the "C" locale, since (as far as I can tell) that's the only locale supported by the MingW std::locale implementation. I think R itself gets around this by implementing a completely custom version of strftime() and friends.

@github-actions

Copy link
Copy Markdown

@wjones127

Copy link
Copy Markdown
MemberAuthor

So timezone database seems to work, but methods that rely on std::local currently error with:

Error (test-dplyr-funcs-datetime.R:344:3): extract month from timestamp
Error: Invalid: Cannot find locale 'English_United States.1252': locale::facet::_S_create_c_locale name not valid
C:/Users/voltron/arrow/cpp/src/arrow/compute/kernels/scalar_temporal_unary.cc:1085 GetLocale(options.locale)
C:/Users/voltron/arrow/cpp/src/arrow/compute/kernels/scalar_temporal_unary.cc:1105 Make(ctx, *in.type)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec.cc:700 kernel_->exec(kernel_ctx_, batch, &out)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec.cc:641 ExecuteBatch(batch, listener)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec/expression.cc:547 executor->Execute(arguments, &listener)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec/expression.cc:533 ExecuteScalarExpression(call->arguments[i], input, exec_context)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec/project_node.cc:91 ExecuteScalarExpression(simplified_expr, target, plan()->exec_context())
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec/exec_plan.cc:484 iterator_.Next()
C:/Users/voltron/arrow/cpp/src/arrow/record_batch.cc:336 ReadNext(&batch)
C:/Users/voltron/arrow/cpp/src/arrow/record_batch.cc:347 ReadAll(&batches)

These do work if you set Sys.setlocale("LC_TIME", "C"). If I don't find a fix for this, I may consider only supporting the "C" locale on Windows.

Comment threadr/R/arrow-package.R Outdated
Comment threadr/R/dplyr-funcs-datetime.R Outdated
Comment threadr/tests/testthat/test-dplyr-funcs-datetime.R Outdated
@wjones127
wjones127force-pushed the ARROW-13168-timezone-database branch from d8aeb45 to 2171629CompareMarch 8, 2022 18:08
@wjones127
wjones127force-pushed the ARROW-13168-timezone-database branch from 497aab6 to ab5d038CompareMarch 10, 2022 22:27
@wjones127

Copy link
Copy Markdown
MemberAuthor

CI failure is unrelated Flight error.

@wjones127

Copy link
Copy Markdown
MemberAuthor

cc @pitrou

@rem Download IANA Timezone Database for unit tests
@rem
@rem (Doc section: Download timezone database)
curl https://data.iana.org/time-zones/releases/tzdata2021e.tar.gz --output tzdata.tar.gz

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.

Will this always be the same DB that R and Python will be using?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

No that 2021e is a version, which won't necessarily align with the R and Python ones in the future. I don't think it matters that we update it, unless the format changes somehow. This is just for testing that it works, and we don't ship it.

But the R unit tests use the one provided by the tzdb package, so we are testing that as well.

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.

Currently US and EU have DST, but they plan to abolish it soon. At that point we will have Python and R DBs with fresh DSTless times and arrow c++ using DST for tests. In isolation that's ok, but we do have tests comparing pandas and pyarrow results and similar for lubridate. It's not a big problem for sure, but if there is like a tzdata-latest.tar.gz that would be great.

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.

The times in the past won't change, so unless we test against a random "now", updates to the timezone database (such as for DST policy changes) shouldn't impact those tests?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Yeah this should be fine as is. We will never be testing between timezone databases.

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.

We currently test arrow vs pandas tzdb in CI. We have a test for a timestamp in 2033 and if it is in DST and DST is abolished it will error if we'll be using a pre-abolishment db with arrow and post-abolishment db with pandas. This is super irrelevant and as it's a simple fix and I'm sorry for wasting your time :).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Ah got it. We'll address in the follow up PR where we'll have PyArrow use tzdb. For now the python timestamp tests are skipped on Windows

ifsys.platform=='win32':
# TODO: We should test on windows once ARROW-13168 is resolved.
pytest.skip('Timezone database is not available on Windows yet')

@pitroupitrou 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.

Thanks a lot for this @wjones127 . Here are some comments.

Comment threadcpp/src/arrow/config.h Outdated
Comment threadcpp/src/arrow/config.cc
Comment threadcpp/src/arrow/config.cc Outdated
Comment threadcpp/src/arrow/public_api_test.cc Outdated
Comment threadcpp/src/arrow/public_api_test.cc Outdated
Comment threaddocs/source/cpp/build_system.rst Outdated
Comment threaddocs/source/developers/cpp/windows.rst Outdated
Comment on lines +176 to +179
.. literalinclude:: ../../../ci/appveyor-cpp-setup.bat
:language: cmd
:start-after: @rem (Doc section: Download timezone database)
:end-before: @rem (Doc section: Download timezone database)

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'd rather if you copied the relevant snippet here, we shouldn't ideally rely on the contents of CI scripts (which may contain specific quirks that irrelevant to normal user setups) for the public docs.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Since we are pulling a specific part of the script, we should easily be able to avoid quirks? I like the idea of having our build instructions tested in CI. And we reference the CI scripts regularly when providing build instructions.

At the very least, if we get to a point where the public instructions and CI instructions diverge, we can easily separate them.


TEST_F(ScalarTemporalTest, StrftimeOtherLocale) {
#ifdef _WIN32
GTEST_SKIP() << "There is a known bug in strftime for locales on Windows (ARROW-15922)";

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 on Windows or specifically MinGW? i.e., would the non-MinGW Windows CI pass if you remove this skip? I'm wondering if we can narrow the condition.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

If failed on Windows 2019 C++17, which uses MSVC. But seems like it was actually passing on MinGW. So maybe I can try skipping for just MSVC?

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.

That's a bit weird, MinGW is just a different compiler but targetting the same runtime libraries...

@wjones127wjones127Mar 23, 2022

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Actually, I think the test is likely skipping on the LocaleExists("fr_FR.UTF-8") condition; IIRC MinGW doesn't support locales apart from "C" and "POSIX". Sadly, no indication in CI whether the test was skipped: https://github.com/apache/arrow/runs/5504310182?check_suite_focus=true

:start-after: @rem (Doc section: Download timezone database)
:end-before: @rem (Doc section: Download timezone database)

By default, the timezone database will be detected at ``%USERPROFILE%\Downloads\tzdata``,

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 a reliable location? Is there a risk that the downloads folder gets cleared from time to time?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

This is the behavior of the vendored datetime library, not something we chose. I think it's a fine default for testing and in production applications I expect users will manually specify a more appropriate path at runtime.

@jonkeanejonkeane 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.

A few things I noticed in CI

Comment threadr/src/config.cpp Outdated
Comment threadcpp/src/arrow/config.cc Outdated
wjones127and others added 2 commits March 24, 2022 19:40
Co-authored-by: Jonathan Keane <jkeane@gmail.com>
set -ex

# Download database
curl https://data.iana.org/time-zones/releases/tzdata2021e.tar.gz --output ~/Downloads/tzdata2021e.tar.gz

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.

FWIW, they just released 2022a a few days ago

Comment threadr/R/arrow-package.R Outdated
Co-authored-by: Davis Vaughan <davis@rstudio.com>
Comment threadr/tests/testthat/test-dplyr-funcs-datetime.R
@jonkeane

Copy link
Copy Markdown
Member

Are there any outstanding comments that we need to resolve before merging?

The failures in CI both look unrelated. I'm happy to merge if no one objects

@ursabot

ursabot commented Mar 28, 2022

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = 919d113 and contender = f4dfd6c. f4dfd6c is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️0.34% ⬆️0.0%] test-mac-arm
[Finished ⬇️0.36% ⬆️0.0%] ursa-i9-9960x
[Finished ⬇️1.02% ⬆️0.81%] ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python, R. Runs only benchmarks with cloud = True
test-mac-arm: Supported benchmark langs: C++, Python, R
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

@wjones127

Copy link
Copy Markdown
MemberAuthor

Follow-up Jira created: https://issues.apache.org/jira/browse/ARROW-16054

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.

9 participants

@wjones127@jonkeane@ursabot@rok@jorisvandenbossche@pitrou@nealrichardson@paleolimbot@DavisVaughan
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' ARROW-13168: [C++][R] Enable runtime timezone database for Windows by wjones127 · Pull Request #12536 · apache/arrow · GitHub
Skip to content

ARROW-13168: [C++][R] Enable runtime timezone database for Windows - #12536

Closed
wjones127 wants to merge 35 commits into
apache:masterfrom
wjones127:ARROW-13168-timezone-database
Closed

ARROW-13168: [C++][R] Enable runtime timezone database for Windows#12536
wjones127 wants to merge 35 commits into
apache:masterfrom
wjones127:ARROW-13168-timezone-database

Conversation

@wjones127

@wjones127wjones127 commented Mar 1, 2022

Copy link
Copy Markdown
Member

This allows for runtime configuration of the timezone database on Windows for C++ and R. Python will be handled later because it's available timezone libraries use the binary rather than text format, which is not yet supported the vendored date library.

For R, Windows will only support the "C" locale, since (as far as I can tell) that's the only locale supported by the MingW std::locale implementation. I think R itself gets around this by implementing a completely custom version of strftime() and friends.

@github-actions

Copy link
Copy Markdown

@wjones127

Copy link
Copy Markdown
MemberAuthor

So timezone database seems to work, but methods that rely on std::local currently error with:

Error (test-dplyr-funcs-datetime.R:344:3): extract month from timestamp
Error: Invalid: Cannot find locale 'English_United States.1252': locale::facet::_S_create_c_locale name not valid
C:/Users/voltron/arrow/cpp/src/arrow/compute/kernels/scalar_temporal_unary.cc:1085 GetLocale(options.locale)
C:/Users/voltron/arrow/cpp/src/arrow/compute/kernels/scalar_temporal_unary.cc:1105 Make(ctx, *in.type)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec.cc:700 kernel_->exec(kernel_ctx_, batch, &out)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec.cc:641 ExecuteBatch(batch, listener)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec/expression.cc:547 executor->Execute(arguments, &listener)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec/expression.cc:533 ExecuteScalarExpression(call->arguments[i], input, exec_context)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec/project_node.cc:91 ExecuteScalarExpression(simplified_expr, target, plan()->exec_context())
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec/exec_plan.cc:484 iterator_.Next()
C:/Users/voltron/arrow/cpp/src/arrow/record_batch.cc:336 ReadNext(&batch)
C:/Users/voltron/arrow/cpp/src/arrow/record_batch.cc:347 ReadAll(&batches)

These do work if you set Sys.setlocale("LC_TIME", "C"). If I don't find a fix for this, I may consider only supporting the "C" locale on Windows.

Comment threadr/R/arrow-package.R Outdated
Comment threadr/R/dplyr-funcs-datetime.R Outdated
Comment threadr/tests/testthat/test-dplyr-funcs-datetime.R Outdated
@wjones127
wjones127force-pushed the ARROW-13168-timezone-database branch from d8aeb45 to 2171629CompareMarch 8, 2022 18:08
@wjones127
wjones127force-pushed the ARROW-13168-timezone-database branch from 497aab6 to ab5d038CompareMarch 10, 2022 22:27
@wjones127

Copy link
Copy Markdown
MemberAuthor

CI failure is unrelated Flight error.

@wjones127

Copy link
Copy Markdown
MemberAuthor

cc @pitrou

@rem Download IANA Timezone Database for unit tests
@rem
@rem (Doc section: Download timezone database)
curl https://data.iana.org/time-zones/releases/tzdata2021e.tar.gz --output tzdata.tar.gz

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.

Will this always be the same DB that R and Python will be using?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

No that 2021e is a version, which won't necessarily align with the R and Python ones in the future. I don't think it matters that we update it, unless the format changes somehow. This is just for testing that it works, and we don't ship it.

But the R unit tests use the one provided by the tzdb package, so we are testing that as well.

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.

Currently US and EU have DST, but they plan to abolish it soon. At that point we will have Python and R DBs with fresh DSTless times and arrow c++ using DST for tests. In isolation that's ok, but we do have tests comparing pandas and pyarrow results and similar for lubridate. It's not a big problem for sure, but if there is like a tzdata-latest.tar.gz that would be great.

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.

The times in the past won't change, so unless we test against a random "now", updates to the timezone database (such as for DST policy changes) shouldn't impact those tests?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Yeah this should be fine as is. We will never be testing between timezone databases.

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.

We currently test arrow vs pandas tzdb in CI. We have a test for a timestamp in 2033 and if it is in DST and DST is abolished it will error if we'll be using a pre-abolishment db with arrow and post-abolishment db with pandas. This is super irrelevant and as it's a simple fix and I'm sorry for wasting your time :).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Ah got it. We'll address in the follow up PR where we'll have PyArrow use tzdb. For now the python timestamp tests are skipped on Windows

ifsys.platform=='win32':
# TODO: We should test on windows once ARROW-13168 is resolved.
pytest.skip('Timezone database is not available on Windows yet')

@pitroupitrou 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.

Thanks a lot for this @wjones127 . Here are some comments.

Comment threadcpp/src/arrow/config.h Outdated
Comment threadcpp/src/arrow/config.cc
Comment threadcpp/src/arrow/config.cc Outdated
Comment threadcpp/src/arrow/public_api_test.cc Outdated
Comment threadcpp/src/arrow/public_api_test.cc Outdated
Comment threaddocs/source/cpp/build_system.rst Outdated
Comment threaddocs/source/developers/cpp/windows.rst Outdated
Comment on lines +176 to +179
.. literalinclude:: ../../../ci/appveyor-cpp-setup.bat
:language: cmd
:start-after: @rem (Doc section: Download timezone database)
:end-before: @rem (Doc section: Download timezone database)

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'd rather if you copied the relevant snippet here, we shouldn't ideally rely on the contents of CI scripts (which may contain specific quirks that irrelevant to normal user setups) for the public docs.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Since we are pulling a specific part of the script, we should easily be able to avoid quirks? I like the idea of having our build instructions tested in CI. And we reference the CI scripts regularly when providing build instructions.

At the very least, if we get to a point where the public instructions and CI instructions diverge, we can easily separate them.


TEST_F(ScalarTemporalTest, StrftimeOtherLocale) {
#ifdef _WIN32
GTEST_SKIP() << "There is a known bug in strftime for locales on Windows (ARROW-15922)";

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 on Windows or specifically MinGW? i.e., would the non-MinGW Windows CI pass if you remove this skip? I'm wondering if we can narrow the condition.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

If failed on Windows 2019 C++17, which uses MSVC. But seems like it was actually passing on MinGW. So maybe I can try skipping for just MSVC?

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.

That's a bit weird, MinGW is just a different compiler but targetting the same runtime libraries...

@wjones127wjones127Mar 23, 2022

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Actually, I think the test is likely skipping on the LocaleExists("fr_FR.UTF-8") condition; IIRC MinGW doesn't support locales apart from "C" and "POSIX". Sadly, no indication in CI whether the test was skipped: https://github.com/apache/arrow/runs/5504310182?check_suite_focus=true

:start-after: @rem (Doc section: Download timezone database)
:end-before: @rem (Doc section: Download timezone database)

By default, the timezone database will be detected at ``%USERPROFILE%\Downloads\tzdata``,

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 a reliable location? Is there a risk that the downloads folder gets cleared from time to time?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

This is the behavior of the vendored datetime library, not something we chose. I think it's a fine default for testing and in production applications I expect users will manually specify a more appropriate path at runtime.

@jonkeanejonkeane 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.

A few things I noticed in CI

Comment threadr/src/config.cpp Outdated
Comment threadcpp/src/arrow/config.cc Outdated
wjones127and others added 2 commits March 24, 2022 19:40
Co-authored-by: Jonathan Keane <jkeane@gmail.com>
set -ex

# Download database
curl https://data.iana.org/time-zones/releases/tzdata2021e.tar.gz --output ~/Downloads/tzdata2021e.tar.gz

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.

FWIW, they just released 2022a a few days ago

Comment threadr/R/arrow-package.R Outdated
Co-authored-by: Davis Vaughan <davis@rstudio.com>
Comment threadr/tests/testthat/test-dplyr-funcs-datetime.R
@jonkeane

Copy link
Copy Markdown
Member

Are there any outstanding comments that we need to resolve before merging?

The failures in CI both look unrelated. I'm happy to merge if no one objects

@ursabot

ursabot commented Mar 28, 2022

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = 919d113 and contender = f4dfd6c. f4dfd6c is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️0.34% ⬆️0.0%] test-mac-arm
[Finished ⬇️0.36% ⬆️0.0%] ursa-i9-9960x
[Finished ⬇️1.02% ⬆️0.81%] ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python, R. Runs only benchmarks with cloud = True
test-mac-arm: Supported benchmark langs: C++, Python, R
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

@wjones127

Copy link
Copy Markdown
MemberAuthor

Follow-up Jira created: https://issues.apache.org/jira/browse/ARROW-16054

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.

9 participants

@wjones127@jonkeane@ursabot@rok@jorisvandenbossche@pitrou@nealrichardson@paleolimbot@DavisVaughan
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' ARROW-13168: [C++][R] Enable runtime timezone database for Windows by wjones127 · Pull Request #12536 · apache/arrow · GitHub
Skip to content

ARROW-13168: [C++][R] Enable runtime timezone database for Windows - #12536

Closed
wjones127 wants to merge 35 commits into
apache:masterfrom
wjones127:ARROW-13168-timezone-database
Closed

ARROW-13168: [C++][R] Enable runtime timezone database for Windows#12536
wjones127 wants to merge 35 commits into
apache:masterfrom
wjones127:ARROW-13168-timezone-database

Conversation

@wjones127

@wjones127wjones127 commented Mar 1, 2022

Copy link
Copy Markdown
Member

This allows for runtime configuration of the timezone database on Windows for C++ and R. Python will be handled later because it's available timezone libraries use the binary rather than text format, which is not yet supported the vendored date library.

For R, Windows will only support the "C" locale, since (as far as I can tell) that's the only locale supported by the MingW std::locale implementation. I think R itself gets around this by implementing a completely custom version of strftime() and friends.

@github-actions

Copy link
Copy Markdown

@wjones127

Copy link
Copy Markdown
MemberAuthor

So timezone database seems to work, but methods that rely on std::local currently error with:

Error (test-dplyr-funcs-datetime.R:344:3): extract month from timestamp
Error: Invalid: Cannot find locale 'English_United States.1252': locale::facet::_S_create_c_locale name not valid
C:/Users/voltron/arrow/cpp/src/arrow/compute/kernels/scalar_temporal_unary.cc:1085 GetLocale(options.locale)
C:/Users/voltron/arrow/cpp/src/arrow/compute/kernels/scalar_temporal_unary.cc:1105 Make(ctx, *in.type)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec.cc:700 kernel_->exec(kernel_ctx_, batch, &out)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec.cc:641 ExecuteBatch(batch, listener)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec/expression.cc:547 executor->Execute(arguments, &listener)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec/expression.cc:533 ExecuteScalarExpression(call->arguments[i], input, exec_context)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec/project_node.cc:91 ExecuteScalarExpression(simplified_expr, target, plan()->exec_context())
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec/exec_plan.cc:484 iterator_.Next()
C:/Users/voltron/arrow/cpp/src/arrow/record_batch.cc:336 ReadNext(&batch)
C:/Users/voltron/arrow/cpp/src/arrow/record_batch.cc:347 ReadAll(&batches)

These do work if you set Sys.setlocale("LC_TIME", "C"). If I don't find a fix for this, I may consider only supporting the "C" locale on Windows.

Comment threadr/R/arrow-package.R Outdated
Comment threadr/R/dplyr-funcs-datetime.R Outdated
Comment threadr/tests/testthat/test-dplyr-funcs-datetime.R Outdated
@wjones127
wjones127force-pushed the ARROW-13168-timezone-database branch from d8aeb45 to 2171629CompareMarch 8, 2022 18:08
@wjones127
wjones127force-pushed the ARROW-13168-timezone-database branch from 497aab6 to ab5d038CompareMarch 10, 2022 22:27
@wjones127

Copy link
Copy Markdown
MemberAuthor

CI failure is unrelated Flight error.

@wjones127

Copy link
Copy Markdown
MemberAuthor

cc @pitrou

@rem Download IANA Timezone Database for unit tests
@rem
@rem (Doc section: Download timezone database)
curl https://data.iana.org/time-zones/releases/tzdata2021e.tar.gz --output tzdata.tar.gz

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.

Will this always be the same DB that R and Python will be using?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

No that 2021e is a version, which won't necessarily align with the R and Python ones in the future. I don't think it matters that we update it, unless the format changes somehow. This is just for testing that it works, and we don't ship it.

But the R unit tests use the one provided by the tzdb package, so we are testing that as well.

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.

Currently US and EU have DST, but they plan to abolish it soon. At that point we will have Python and R DBs with fresh DSTless times and arrow c++ using DST for tests. In isolation that's ok, but we do have tests comparing pandas and pyarrow results and similar for lubridate. It's not a big problem for sure, but if there is like a tzdata-latest.tar.gz that would be great.

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.

The times in the past won't change, so unless we test against a random "now", updates to the timezone database (such as for DST policy changes) shouldn't impact those tests?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Yeah this should be fine as is. We will never be testing between timezone databases.

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.

We currently test arrow vs pandas tzdb in CI. We have a test for a timestamp in 2033 and if it is in DST and DST is abolished it will error if we'll be using a pre-abolishment db with arrow and post-abolishment db with pandas. This is super irrelevant and as it's a simple fix and I'm sorry for wasting your time :).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Ah got it. We'll address in the follow up PR where we'll have PyArrow use tzdb. For now the python timestamp tests are skipped on Windows

ifsys.platform=='win32':
# TODO: We should test on windows once ARROW-13168 is resolved.
pytest.skip('Timezone database is not available on Windows yet')

@pitroupitrou 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.

Thanks a lot for this @wjones127 . Here are some comments.

Comment threadcpp/src/arrow/config.h Outdated
Comment threadcpp/src/arrow/config.cc
Comment threadcpp/src/arrow/config.cc Outdated
Comment threadcpp/src/arrow/public_api_test.cc Outdated
Comment threadcpp/src/arrow/public_api_test.cc Outdated
Comment threaddocs/source/cpp/build_system.rst Outdated
Comment threaddocs/source/developers/cpp/windows.rst Outdated
Comment on lines +176 to +179
.. literalinclude:: ../../../ci/appveyor-cpp-setup.bat
:language: cmd
:start-after: @rem (Doc section: Download timezone database)
:end-before: @rem (Doc section: Download timezone database)

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'd rather if you copied the relevant snippet here, we shouldn't ideally rely on the contents of CI scripts (which may contain specific quirks that irrelevant to normal user setups) for the public docs.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Since we are pulling a specific part of the script, we should easily be able to avoid quirks? I like the idea of having our build instructions tested in CI. And we reference the CI scripts regularly when providing build instructions.

At the very least, if we get to a point where the public instructions and CI instructions diverge, we can easily separate them.


TEST_F(ScalarTemporalTest, StrftimeOtherLocale) {
#ifdef _WIN32
GTEST_SKIP() << "There is a known bug in strftime for locales on Windows (ARROW-15922)";

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 on Windows or specifically MinGW? i.e., would the non-MinGW Windows CI pass if you remove this skip? I'm wondering if we can narrow the condition.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

If failed on Windows 2019 C++17, which uses MSVC. But seems like it was actually passing on MinGW. So maybe I can try skipping for just MSVC?

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.

That's a bit weird, MinGW is just a different compiler but targetting the same runtime libraries...

@wjones127wjones127Mar 23, 2022

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Actually, I think the test is likely skipping on the LocaleExists("fr_FR.UTF-8") condition; IIRC MinGW doesn't support locales apart from "C" and "POSIX". Sadly, no indication in CI whether the test was skipped: https://github.com/apache/arrow/runs/5504310182?check_suite_focus=true

:start-after: @rem (Doc section: Download timezone database)
:end-before: @rem (Doc section: Download timezone database)

By default, the timezone database will be detected at ``%USERPROFILE%\Downloads\tzdata``,

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 a reliable location? Is there a risk that the downloads folder gets cleared from time to time?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

This is the behavior of the vendored datetime library, not something we chose. I think it's a fine default for testing and in production applications I expect users will manually specify a more appropriate path at runtime.

@jonkeanejonkeane 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.

A few things I noticed in CI

Comment threadr/src/config.cpp Outdated
Comment threadcpp/src/arrow/config.cc Outdated
wjones127and others added 2 commits March 24, 2022 19:40
Co-authored-by: Jonathan Keane <jkeane@gmail.com>
set -ex

# Download database
curl https://data.iana.org/time-zones/releases/tzdata2021e.tar.gz --output ~/Downloads/tzdata2021e.tar.gz

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.

FWIW, they just released 2022a a few days ago

Comment threadr/R/arrow-package.R Outdated
Co-authored-by: Davis Vaughan <davis@rstudio.com>
Comment threadr/tests/testthat/test-dplyr-funcs-datetime.R
@jonkeane

Copy link
Copy Markdown
Member

Are there any outstanding comments that we need to resolve before merging?

The failures in CI both look unrelated. I'm happy to merge if no one objects

@ursabot

ursabot commented Mar 28, 2022

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = 919d113 and contender = f4dfd6c. f4dfd6c is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️0.34% ⬆️0.0%] test-mac-arm
[Finished ⬇️0.36% ⬆️0.0%] ursa-i9-9960x
[Finished ⬇️1.02% ⬆️0.81%] ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python, R. Runs only benchmarks with cloud = True
test-mac-arm: Supported benchmark langs: C++, Python, R
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

@wjones127

Copy link
Copy Markdown
MemberAuthor

Follow-up Jira created: https://issues.apache.org/jira/browse/ARROW-16054

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.

9 participants

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

ARROW-13168: [C++][R] Enable runtime timezone database for Windows - #12536

Closed
wjones127 wants to merge 35 commits into
apache:masterfrom
wjones127:ARROW-13168-timezone-database
Closed

ARROW-13168: [C++][R] Enable runtime timezone database for Windows#12536
wjones127 wants to merge 35 commits into
apache:masterfrom
wjones127:ARROW-13168-timezone-database

Conversation

@wjones127

@wjones127wjones127 commented Mar 1, 2022

Copy link
Copy Markdown
Member

This allows for runtime configuration of the timezone database on Windows for C++ and R. Python will be handled later because it's available timezone libraries use the binary rather than text format, which is not yet supported the vendored date library.

For R, Windows will only support the "C" locale, since (as far as I can tell) that's the only locale supported by the MingW std::locale implementation. I think R itself gets around this by implementing a completely custom version of strftime() and friends.

@github-actions

Copy link
Copy Markdown

@wjones127

Copy link
Copy Markdown
MemberAuthor

So timezone database seems to work, but methods that rely on std::local currently error with:

Error (test-dplyr-funcs-datetime.R:344:3): extract month from timestamp
Error: Invalid: Cannot find locale 'English_United States.1252': locale::facet::_S_create_c_locale name not valid
C:/Users/voltron/arrow/cpp/src/arrow/compute/kernels/scalar_temporal_unary.cc:1085 GetLocale(options.locale)
C:/Users/voltron/arrow/cpp/src/arrow/compute/kernels/scalar_temporal_unary.cc:1105 Make(ctx, *in.type)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec.cc:700 kernel_->exec(kernel_ctx_, batch, &out)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec.cc:641 ExecuteBatch(batch, listener)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec/expression.cc:547 executor->Execute(arguments, &listener)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec/expression.cc:533 ExecuteScalarExpression(call->arguments[i], input, exec_context)
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec/project_node.cc:91 ExecuteScalarExpression(simplified_expr, target, plan()->exec_context())
C:/Users/voltron/arrow/cpp/src/arrow/compute/exec/exec_plan.cc:484 iterator_.Next()
C:/Users/voltron/arrow/cpp/src/arrow/record_batch.cc:336 ReadNext(&batch)
C:/Users/voltron/arrow/cpp/src/arrow/record_batch.cc:347 ReadAll(&batches)

These do work if you set Sys.setlocale("LC_TIME", "C"). If I don't find a fix for this, I may consider only supporting the "C" locale on Windows.

Comment threadr/R/arrow-package.R Outdated
Comment threadr/R/dplyr-funcs-datetime.R Outdated
Comment threadr/tests/testthat/test-dplyr-funcs-datetime.R Outdated
@wjones127
wjones127force-pushed the ARROW-13168-timezone-database branch from d8aeb45 to 2171629CompareMarch 8, 2022 18:08
@wjones127
wjones127force-pushed the ARROW-13168-timezone-database branch from 497aab6 to ab5d038CompareMarch 10, 2022 22:27
@wjones127

Copy link
Copy Markdown
MemberAuthor

CI failure is unrelated Flight error.

@wjones127

Copy link
Copy Markdown
MemberAuthor

cc @pitrou

@rem Download IANA Timezone Database for unit tests
@rem
@rem (Doc section: Download timezone database)
curl https://data.iana.org/time-zones/releases/tzdata2021e.tar.gz --output tzdata.tar.gz

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.

Will this always be the same DB that R and Python will be using?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

No that 2021e is a version, which won't necessarily align with the R and Python ones in the future. I don't think it matters that we update it, unless the format changes somehow. This is just for testing that it works, and we don't ship it.

But the R unit tests use the one provided by the tzdb package, so we are testing that as well.

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.

Currently US and EU have DST, but they plan to abolish it soon. At that point we will have Python and R DBs with fresh DSTless times and arrow c++ using DST for tests. In isolation that's ok, but we do have tests comparing pandas and pyarrow results and similar for lubridate. It's not a big problem for sure, but if there is like a tzdata-latest.tar.gz that would be great.

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.

The times in the past won't change, so unless we test against a random "now", updates to the timezone database (such as for DST policy changes) shouldn't impact those tests?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Yeah this should be fine as is. We will never be testing between timezone databases.

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.

We currently test arrow vs pandas tzdb in CI. We have a test for a timestamp in 2033 and if it is in DST and DST is abolished it will error if we'll be using a pre-abolishment db with arrow and post-abolishment db with pandas. This is super irrelevant and as it's a simple fix and I'm sorry for wasting your time :).

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Ah got it. We'll address in the follow up PR where we'll have PyArrow use tzdb. For now the python timestamp tests are skipped on Windows

ifsys.platform=='win32':
# TODO: We should test on windows once ARROW-13168 is resolved.
pytest.skip('Timezone database is not available on Windows yet')

@pitroupitrou 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.

Thanks a lot for this @wjones127 . Here are some comments.

Comment threadcpp/src/arrow/config.h Outdated
Comment threadcpp/src/arrow/config.cc
Comment threadcpp/src/arrow/config.cc Outdated
Comment threadcpp/src/arrow/public_api_test.cc Outdated
Comment threadcpp/src/arrow/public_api_test.cc Outdated
Comment threaddocs/source/cpp/build_system.rst Outdated
Comment threaddocs/source/developers/cpp/windows.rst Outdated
Comment on lines +176 to +179
.. literalinclude:: ../../../ci/appveyor-cpp-setup.bat
:language: cmd
:start-after: @rem (Doc section: Download timezone database)
:end-before: @rem (Doc section: Download timezone database)

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'd rather if you copied the relevant snippet here, we shouldn't ideally rely on the contents of CI scripts (which may contain specific quirks that irrelevant to normal user setups) for the public docs.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Since we are pulling a specific part of the script, we should easily be able to avoid quirks? I like the idea of having our build instructions tested in CI. And we reference the CI scripts regularly when providing build instructions.

At the very least, if we get to a point where the public instructions and CI instructions diverge, we can easily separate them.


TEST_F(ScalarTemporalTest, StrftimeOtherLocale) {
#ifdef _WIN32
GTEST_SKIP() << "There is a known bug in strftime for locales on Windows (ARROW-15922)";

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 on Windows or specifically MinGW? i.e., would the non-MinGW Windows CI pass if you remove this skip? I'm wondering if we can narrow the condition.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

If failed on Windows 2019 C++17, which uses MSVC. But seems like it was actually passing on MinGW. So maybe I can try skipping for just MSVC?

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.

That's a bit weird, MinGW is just a different compiler but targetting the same runtime libraries...

@wjones127wjones127Mar 23, 2022

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Actually, I think the test is likely skipping on the LocaleExists("fr_FR.UTF-8") condition; IIRC MinGW doesn't support locales apart from "C" and "POSIX". Sadly, no indication in CI whether the test was skipped: https://github.com/apache/arrow/runs/5504310182?check_suite_focus=true

:start-after: @rem (Doc section: Download timezone database)
:end-before: @rem (Doc section: Download timezone database)

By default, the timezone database will be detected at ``%USERPROFILE%\Downloads\tzdata``,

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 a reliable location? Is there a risk that the downloads folder gets cleared from time to time?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

This is the behavior of the vendored datetime library, not something we chose. I think it's a fine default for testing and in production applications I expect users will manually specify a more appropriate path at runtime.

@jonkeanejonkeane 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.

A few things I noticed in CI

Comment threadr/src/config.cpp Outdated
Comment threadcpp/src/arrow/config.cc Outdated
wjones127and others added 2 commits March 24, 2022 19:40
Co-authored-by: Jonathan Keane <jkeane@gmail.com>
set -ex

# Download database
curl https://data.iana.org/time-zones/releases/tzdata2021e.tar.gz --output ~/Downloads/tzdata2021e.tar.gz

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.

FWIW, they just released 2022a a few days ago

Comment threadr/R/arrow-package.R Outdated
Co-authored-by: Davis Vaughan <davis@rstudio.com>
Comment threadr/tests/testthat/test-dplyr-funcs-datetime.R
@jonkeane

Copy link
Copy Markdown
Member

Are there any outstanding comments that we need to resolve before merging?

The failures in CI both look unrelated. I'm happy to merge if no one objects

@ursabot

ursabot commented Mar 28, 2022

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = 919d113 and contender = f4dfd6c. f4dfd6c is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️0.34% ⬆️0.0%] test-mac-arm
[Finished ⬇️0.36% ⬆️0.0%] ursa-i9-9960x
[Finished ⬇️1.02% ⬆️0.81%] ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python, R. Runs only benchmarks with cloud = True
test-mac-arm: Supported benchmark langs: C++, Python, R
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

@wjones127

Copy link
Copy Markdown
MemberAuthor

Follow-up Jira created: https://issues.apache.org/jira/browse/ARROW-16054

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.

9 participants

@wjones127@jonkeane@ursabot@rok@jorisvandenbossche@pitrou@nealrichardson@paleolimbot@DavisVaughan