Skip to content

connection: fix logging of non-IP sockets - #279

Merged
Lorak-mmk merged 1 commit into
scylladb:masterfrom
constantfold:fix-log
Dec 18, 2023
Merged

connection: fix logging of non-IP sockets#279
Lorak-mmk merged 1 commit into
scylladb:masterfrom
constantfold:fix-log

Conversation

@constantfold

Copy link
Copy Markdown

Before this fix, the debug log would crash _connect_socket for UNIX domain sockets. getsockname() for UNIX domain sockets returns a single string instead of a tuple (as is the case for IPv4/IPv6). Therefore the code could crash as it tried to get the second element of a non-tuple (empty string):

Traceback (most recent call last):
File "/home/margdoc/Workspace/scylla/maintenance_mode_testing.py", line 5, in <module>
s = c.connect()
^^^^^^^^^^^
File "cassandra/cluster.py", line 1750, in cassandra.cluster.Cluster.connect
File "cassandra/cluster.py", line 1776, in cassandra.cluster.Cluster.connect
File "cassandra/cluster.py", line 1763, in cassandra.cluster.Cluster.connect
File "cassandra/cluster.py", line 3581, in cassandra.cluster.ControlConnection.connect
File "cassandra/cluster.py", line 3642, in cassandra.cluster.ControlConnection._reconnect_internal
cassandra.cluster.NoHostAvailable: ('Unable to connect to any servers', {'test_socket': IndexError('string index out of range')})

Fix the issue by not unpacking those values and just printing them as-is, relying on %s formatter to print all elements of a tuple (host, port) for IP sockets and string for UNIX domain sockets. The printed log is not formatted as nice as before, however this is a DEBUG print so few users will ever see it. The new approach should work with any format of getsockname().

Fixes#278

Before this fix, the debug log would crash _connect_socket for UNIX domain sockets. getsockname() for UNIX domain sockets returns a single string instead of a tuple (as is the case for IPv4/IPv6). Therefore the code could crash as it tried to get the second element of a non-tuple (empty string):
Traceback (most recent call last):
File "/home/margdoc/Workspace/scylla/maintenance_mode_testing.py", line 5, in <module>
s = c.connect()
^^^^^^^^^^^
File "cassandra/cluster.py", line 1750, in cassandra.cluster.Cluster.connect
File "cassandra/cluster.py", line 1776, in cassandra.cluster.Cluster.connect
File "cassandra/cluster.py", line 1763, in cassandra.cluster.Cluster.connect
File "cassandra/cluster.py", line 3581, in cassandra.cluster.ControlConnection.connect
File "cassandra/cluster.py", line 3642, in cassandra.cluster.ControlConnection._reconnect_internal
cassandra.cluster.NoHostAvailable: ('Unable to connect to any servers', {'test_socket': IndexError('string index out of range')})
Fix the issue by not unpacking those values and just printing them
as-is, relying on %s formatter to print all elements of a tuple (host,
port) for IP sockets and string for UNIX domain sockets. The printed log
is not formatted as nice as before, however this is a DEBUG print so few users will ever see it. The new approach should work with any format of getsockname().
Fixesscylladb#278
@mykaul

Copy link
Copy Markdown

Do we have tests for Unix sockets?

@constantfold

Copy link
Copy Markdown
Author

Sign up for freeto 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.

Connecting to Unix domain socket fails

3 participants

@constantfold@mykaul@Lorak-mmk