summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
2312c42)
Currently, if we see an error when writing to a client, we free the
client immediately. This means that any pending reads will be discarded.
Additionally, if a client disconnects before we have finished the writes in
discover_server_process_connection, we won't register the waiter to read
from the socket.
Instead of freeing the client on write failure, this change sets a flag
(se we don't continue to write), and we rely on the read EOF to free the
client. This means we don't drop incoming messages.
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
struct list_item list;
struct waiter *waiter;
int fd;
struct list_item list;
struct waiter *waiter;
int fd;
+ if (client->remote_closed)
+ return -1;
+
rc = pb_protocol_write_message(client->fd, message);
if (rc)
rc = pb_protocol_write_message(client->fd, message);
if (rc)
+ client->remote_closed = true;
client->fd = fd;
client->server = server;
client->fd = fd;
client->server = server;
+ client->waiter = waiter_register_io(server->waitset, client->fd,
+ WAIT_IN, discover_server_process_message,
+ client);
/* send sysinfo to client */
rc = write_system_info_message(server, client, system_info_get());
/* send sysinfo to client */
rc = write_system_info_message(server, client, system_info_get());
- client->waiter = waiter_register_io(server->waitset, client->fd,
- WAIT_IN, discover_server_process_message,
- client);
-