Hi Timo,
Hi *,

in 1.2 the dict server (tested with sqlite backend) is somewhat broken.
It bails out regularly with "Fatal: dict: Socket already exists: ..."
(looks like a race condition as it doesn't fail always).

We discovered that this new code in dict-server.c seems to be the problem:

        server->fd = net_listen_unix_unlink_stale(path, 64);
        if (server->fd == -1) {
                if (errno == EADDRINUSE)
                        i_fatal("Socket already exists: %s", path);
                else
                        i_fatal("net_listen_unix(%s) failed: %m", path);
        }

replacing it with the old code:

        int i = 0;
  [...]
        while (server->fd == -1) {
                server->fd = net_listen_unix(path, 64);
                if (server->fd != -1)
                        break;

                if (errno != EADDRINUSE || ++i == 2)
                        i_fatal("net_listen_unix(%s) failed: %m", path);

                /* see if it really exists */
                if (net_connect_unix(path) != -1 || errno != ECONNREFUSED)
                        i_fatal("Socket already exists: %s", path);

                /* delete and try again */
                if (unlink(path) < 0)
                        i_fatal("unlink(%s) failed: %m", path);
        }

"fixes" the problem.  But I think the real fix would have to be done in
the new function `net_listen_unix_unlink_stale'.

cheers
sascha
-- 
Sascha Wilde                                      OpenPGP key: 4BB86568
Intevation GmbH, Osnabrück             http://www.intevation.de/~wilde/
Amtsgericht Osnabrück, HR B 18998             http://www.intevation.de/
Geschäftsführer: Frank Koormann, Bernhard Reiter, Dr. Jan-Oliver Wagner

Attachment: pgpAC1O2gXijB.pgp
Description: PGP signature

Reply via email to