Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

Add Windows support to file locking #1157

Open
wants to merge 2 commits into
base: main
Choose a base branch
from

Conversation

chrisjbremner
Copy link
Contributor

While this project does not officially support Windows, it was compatible with 1.x.x versions of this package, and there's minimal changes necessary to restore that functionality in future 2.x.x versions as well. The only noticeable incompatibility at the moment is around the use of fcntl for file locking, which is not available in Windows (msvcrt is the alternative), which was discussed in #1155. This PR adds logic to choose the correct package for file locking based on what platform is being used.

I was able to successfully build and test a .pex file on Windows 10 after making this change. As noted here, a user will need to build the .pex as an Administrator, Developer Mode, or enable the SeCreateSymbolicLinkPrivilege privilege in order for symlinking to occur correctly.

@jsirois
Copy link
Member

jsirois commented Dec 30, 2020

Thanks @chrisjbremner. I hope it was clear from #1155 that the blocking issue from the Pex side is having CI set up. I do not want to continue to give a false impression that Pex supports Windows. It does not. Even with this fix it does not. Only with this fix + a CI setup for Windows that's green can Pex support Windows in good faith now and going forward. What's your plan or suggestion to get the CI side of this squared away?

fcntl.lockf(lock_fd, fcntl.LOCK_EX) # A blocking write lock.
if WINDOWS:
while True:
# Force the non-blocking lock to be blocking. LK_LOCK is msvcrt's implementation of
Copy link
Member

@jsirois jsirois Dec 30, 2020

Choose a reason for hiding this comment

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

Nit: presumably then using LK_LOCK is a bit better here. You still need to loop, but presumably its slightly more efficient to let Windows do the 1st 10 tries before sleeping here and looping than to do the 1st 10 tries here manually.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Makes sense, it also raises a clearer error (OSError: [Errno 36] Resource deadlock avoided) when the locking operation times out after 10 tries, so we can use that directly rather than an OSError catchall. Fixed in edc8435

Copy link
Member

Choose a reason for hiding this comment

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

Excellent - that's much better.

@chrisjbremner
Copy link
Contributor Author

chrisjbremner commented Dec 30, 2020

What's your plan or suggestion to get the CI side of this squared away?

I am willing to try and help set up some CI for this. I haven't worked much with Travis before, but can give it a shot. What's the process for getting started (do I need access to somewhere else to add a pipeline)?

@jsirois
Copy link
Member

jsirois commented Dec 30, 2020

What's the process for getting started (do I need access to somewhere else to add a pipeline)?

That's kind of the point - no clue here - I've never set up a Windows CI for an OSS project and haven't used Windows in ~15 years.

It does look like Travis may support Windows now: https://docs.travis-ci.com/user/reference/windows/. If you want to try that you'd just make the appropriate edits to the .travis.yml in this commit.

But Travis is not a requirement. I've seen https://www.appveyor.com/ used over in the Pip project and I'm sure there are other options too. If you're willing to dive in I can provide any support needed to click buttons to enable services for the pantsbuild org / the pex repo.

@chrisjbremner
Copy link
Contributor Author

Sounds good, I'll survey other OSS projects to get an idea of what they do, then let you know.

Is CI a blocker for merging of this PR, or just to add the Operating System :: Microsoft :: Windows classifier to the project?

@jsirois
Copy link
Member

jsirois commented Dec 30, 2020

Is CI a blocker for merging of this PR

It's a blocker for this PR. All other PRs must be green and this one is only fake green. We really need to know it works independently of you or I. Thanks for taking a crack at all this.

@chrisjbremner
Copy link
Contributor Author

Ok, I've created #1158 for the Windows CI effort

@chrisjbremner
Copy link
Contributor Author

I've spent quite a while trying to figure out why some tests are failing on Windows and it seems to be isolated to Tox (wheels get downloaded, but not installed for a currently unknown reason), since I am able to build a Pex successfully outside of Tox. While I will continue trying to get Windows CI to work, I don't necessarily think it should be a requirement to merge this PR. Given the presence of pex.compatibility.WINDOWS, it seems like Windows was previously intended to be supported, so wouldn't it make sense to implement this fix so that anyone who depended on it in previous versions (like myself) can continue to use it as they were?

@jsirois
Copy link
Member

jsirois commented Jan 10, 2021

Since you are our current Windows expert, you should feel free to not use tox for the windows CI. Whatever works and can also be easily run by a Windows maintainer on their own machine is great. That could simply be a PowerShell script or batch file that wraps up the testing and can be used both locally and in CI.

As to needing CI green to land any Windows fixes, I really don't want to budge on that. We need to make forward progress, and the only way to do that is with a green base. Forward progress for you is modern Pex working on Windows - I understand - but that is not forward progress for the project - its just the status quo - Windows is still unsupported and will break at any minute.

Given the presence of pex.compatibility.WINDOWS, it seems like Windows was previously intended to be supported, ...

No. See the limp along comment below, but I've been the primary maintainer for 2+ years and - at least to me - no open source project should ever support something it doesn't test (you can be assured I was not around to accept the compatibility change you referenced).

so wouldn't it make sense to implement this fix so that anyone who depended on it in previous versions (like myself) can continue to use it as they were?

For that - you can just use older versions. If you need newer features of Pex then we really need you, or some one, to own getting CI working; otherwise, we just re-engage limp along mode where Pex happens to work on Windows but is not at all supported.

Base automatically changed from master to main March 18, 2021 21:23
@jcar87
Copy link

jcar87 commented Nov 16, 2023

Landed here after trying things out on WIndows (didn't really check it wasn't supported).

This PR was helpful and I was able to hack around and factor it into atomic_directory.py. There's quite a few other things that needed tweaks - although I suspect I was only using a fraction of the functionality and barely scratching the surface. Mostly what I found had to do with deriving the location of the interpreter (there's usually no bin/python3, but rather Scripts/python.exe), and some interesting issue with path comparisons with strings failing because Windows paths contain (or may contain) \ instead of forward slashes.

@jsirois, I can see that at some point progress was made towards Windows compatibility (as per this comment #111 (comment)). Is the CI issue mentioned in the past "easier" now that GitHub actions are used?

Was wondering since some of the tweaks I've made could potentially be worked into proper patches that don't cause regressions for already supporting platforms, but would be good to have CI test coverage - even if pex isn't fully functional on Windows yet

@jsirois
Copy link
Member

jsirois commented Nov 16, 2023

@jcar87 the issue has never really been getting Windows boxes for CI, its been my insistence that Windows support is added with green CI to back it up. No one has been willing to put in all that work.

I made significant progress (https://github.com/jsirois/pex/tree/Windows/wip) but when I was last diverted to other priorities, there were still ~80 integration tests failing (I believe I got all unit tests passing).

My stance on only going forward with Windows support under a fully green CI PR remains and I will circle back to that branch, but that's cold comfort with no schedule. If you want to put in the work to meet the fully green CI goal, that works too of course. It's alot of work though!

@jsirois
Copy link
Member

jsirois commented Nov 16, 2023

@jcar87 I assume you're aware Pex works fine under WSL, but in case not. In fact, I bought a Windows laptop a year or so ago just to be able to finish this project. I've been torturing myself with Windows as my OS as a result and living mainly in WSL. The self-flagellation has not been enough to get this done yet, but it will! I look forward to wiping Windows and installing Linux again. I just want Pex support done right and completely so that it is supportable going forward by a limited set of maintainers, none of which use Windows.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants