| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| if path[0] not in (0, '\x00'): | ||
| try: | ||
| if stat.S_ISSOCK(os.stat(path).st_mode): | ||
| os.remove(path) |
There was a problem hiding this comment.
What if the file exists and is not a socket?
Sorry, something went wrong.
There was a problem hiding this comment.
if stat.S_ISSOCK(os.stat(path).st_mode)
As much as we can. Let's kernel to decide what to do during bind()
Sorry, something went wrong.
There was a problem hiding this comment.
I don't understand: can stat.S_ISSOCK return True if it's not a socket?
Sorry, something went wrong.
There was a problem hiding this comment.
No, it can not. If this path refers to plain file, bind syscall will fail. We must not erase non-sockets in any case.
Sorry, something went wrong.
There was a problem hiding this comment.
Ah, OK, I now understand what was @ZhukovAlexander's question about.
Sorry, something went wrong.
There was a problem hiding this comment.
Do you still have a questions ?
Sorry, something went wrong.
There was a problem hiding this comment.
No, no further questions about this line :)
Sorry, something went wrong.
|
I think we should also remove the socket after the server is closed. |
Sorry, something went wrong.
| os.remove(path) | ||
| except OSError: | ||
| # Directory may have permissions only to create socket. | ||
| pass |
There was a problem hiding this comment.
I think we need to log this.
Sorry, something went wrong.
There was a problem hiding this comment.
Sure, but we should introduce something like log = logging.getLogger(__name__). Please tell where to do that.
Sorry, something went wrong.
There was a problem hiding this comment.
Look at how base_events.py logs stuff.
Sorry, something went wrong.
There was a problem hiding this comment.
fixed
Sorry, something went wrong.
| with self.assertRaisesRegex(OSError, | ||
| 'Address.*is already in use'): | ||
| self.loop.run_until_complete(coro) | ||
| self.loop.run_until_complete(coro) |
There was a problem hiding this comment.
How does this work? We have a live socket, bound to path. Then we create a server. Does this mean that the first socket is in an invalid state? Or they are both bound to path now?
Sorry, something went wrong.
There was a problem hiding this comment.
Seems, potential client will connect to second socket. First one will be hidden.
Sorry, something went wrong.
There was a problem hiding this comment.
I did not check. Maybe it is implementation specific - i.e. Different on bsd and linux.
Sorry, something went wrong.
There was a problem hiding this comment.
Please try to figure out what exactly is going on in this unittest.
Sorry, something went wrong.
There was a problem hiding this comment.
I have checked. If socket-inode on FS is deleted, no one can connect. If it overrided with another UNIX-socket, all clients will be connected to that new one, as I expect eariler.
import socket
import os
if os.path.exists('/tmp/qwe'):
os.unlink('/tmp/qwe')
sock1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock1.bind('/tmp/qwe')
sock1.listen()
os.unlink('/tmp/qwe')
sock2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock2.bind('/tmp/qwe')
sock2.listen()
#os.unlink('/tmp/qwe')
sock3 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock3.connect('/tmp/qwe')
sock3.send(b'asd')
(sk, addr) = sock2.accept()
print(sk.recv(6))
Sorry, something went wrong.
There was a problem hiding this comment.
I can not find POSIX standard, describinf this...reading man 7 unix say that many things are implementation specific.
Sorry, something went wrong.
There was a problem hiding this comment.
I think, that unittests are fine. Unittests must check that all assertions are not failed on target OS.
Sorry, something went wrong.
There was a problem hiding this comment.
What assertions? Clearly, there is some system-depending behaviour here: some systems allow Unix sockets to bind to existing in-use Unix sockets paths. Why should we have a test for that?
Sorry, something went wrong.
There was a problem hiding this comment.
Well. I will remove that test.
Sorry, something went wrong.
There was a problem hiding this comment.
I transform that test: It now checks that binding to same path as CLOSED socket works. This will improve code-coverage. And also I have found a bug with logging :).
Sorry, something went wrong.
|
@socketpair FWIW we're just a couple days from a complete feature freeze of asyncio. Will you have time to finish this, or should I submit a new PR? |
Sorry, something went wrong.
| 'path was not specified, and no sock specified') | ||
|
|
||
| if sock.family != socket.AF_UNIX: | ||
| if sock.family != socket.AF_UNIX or sock.type != socket.SOCK_STREAM: |
There was a problem hiding this comment.
BTW, I've just committed this check to asyncio, please rebase your PR. Regardless of this PR, this is something that needed to be fixed (I wanted to fix this before 3.5 came out, but completely forgot about it). /cc @gvanrossum
Sorry, something went wrong.
There was a problem hiding this comment.
done
Sorry, something went wrong.
Actually (as I think), removing before binding and removing after closing should be done at Python's socket level, not at asyncio level. But this is another sad story. |
Sorry, something went wrong.
Maybe. But let's fix this in asyncio first. |
Sorry, something went wrong.
@1st1 Can you advice best way to add unlink() after closing ? |
Sorry, something went wrong.
After giving this some thought - let's not add this. I now remember an issue with uvloop: originally I was removing the path, but then someone's program broke because it was cleaning up the path manually and assumed it's always there. Trying to remove the path before connecting to it makes total sense, removing it after is nice, but not strictly necessary. |
Sorry, something went wrong.
|
Thank you, Mark! |
Sorry, something went wrong.
| Back | FazBrowse Home | New Git URL |
No description provided.