Skip to content

Connecting to Unix domain socket fails #278

@margdoc

Description

@margdoc

When trying to connect to unix domain socket, python driver throws following error:

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')})

In function:

def _connect_socket(self):
sockerr = None
addresses = self._get_socket_addresses()
port = None
for (af, socktype, proto, _, sockaddr) in addresses:
try:
self._socket = self._socket_impl.socket(af, socktype, proto)
if self.ssl_context:
self._wrap_socket_from_context()
elif self.ssl_options:
if not self._ssl_impl:
raise RuntimeError("This version of Python was not compiled with SSL support")
self._socket = self._ssl_impl.wrap_socket(self._socket, **self.ssl_options)
self._socket.settimeout(self.connect_timeout)
self._initiate_connection(sockaddr)
self._socket.settimeout(None)
local_addr = self._socket.getsockname()
log.debug('Connection %s %s:%s -> %s:%s', id(self), local_addr[0], local_addr[1], sockaddr[0], sockaddr[1])
if self._check_hostname:
self._match_hostname()
sockerr = None
break
except socket.error as err:
if self._socket:
self._socket.close()
self._socket = None
sockerr = err
if sockerr:
raise socket.error(sockerr.errno, "Tried connecting to %s. Last error: %s" %
([a[4] for a in addresses], sockerr.strerror or sockerr))
if self.sockopts:
for args in self.sockopts:
self._socket.setsockopt(*args)

Line:

log.debug('Connection %s %s:%s -> %s:%s', id(self), local_addr[0], local_addr[1], sockaddr[0], sockaddr[1])

Reproducer:

Socket created in a terminal:

nc -lkU test_socket 

Code that uses python driver:

from cassandra.cluster import Cluster
from cassandra.connection import UnixSocketEndPoint

c = Cluster([UnixSocketEndPoint("test_socket")])
s = c.connect()

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions