Browse Source

Don't repeat handshake.

This little thing can cause a deadlock, because taste mechanism start
to work after creation of ggate provider and I/O requests are sent from
other classes from the g_event thread, so number of pending events isn't 0.
Now ggatec(8) start second handshake and ggated(8) is trying to open
GEOM provider (for example md(4)) and it can't, because it hangs on
g_waitidle() in g_dev_open(). g_waitidle() cannot finish because
there is a pending read on event queue, and this read can't be
finished, because ggated(8) can't open target device.
GEOM Gate will recover from this deadlock, because requests will
timeout, but it of course isn't the best solution and I don't know
better one for now, so we should avoid opening GEOM providers while
there are pending requests in event queue.
tags/ggatessh-v1.0.0
pjd 20 years ago
parent
commit
8063783c14
1 changed files with 4 additions and 4 deletions
  1. +4
    -4
      ggatec/ggatec.c

+ 4
- 4
ggatec/ggatec.c View File

@@ -289,15 +289,15 @@ serve_loop(int sfd)
for (;;) {
int error;

error = serve(sfd);
close(sfd);
if (error != EAGAIN)
g_gate_xlog("%s.", strerror(error));
sfd = handshake();
if (sfd < 0) {
sleep(2);
continue;
}
error = serve(sfd);
close(sfd);
if (error != EAGAIN)
g_gate_xlog("%s.", strerror(error));
}
}



Loading…
Cancel
Save