[rds-devel] OK - so what is a common completion model / unified
poll in RDS anyway ?
Richard Frank
richard.frank at oracle.com
Wed Nov 14 18:45:51 PST 2007
While it is possible to wait for rdma operations synchronously, via
blocking socket operations, and or via a blocking rds barrier operation
- when waiting in these services the waiter would not be awakened for
incoming messages, and or send socket space availability, and or RDS
congestion messages.
Generally, a higher performing solution can be achieved via a single /
common / unified wait service.
Poll for RDS sockets it cabable of detecting all of the following events
and waking a waiter:
a) incoming messages (pollin)
b) send space available (pollout)
c) any rdma completion or a specific rdma completion (pollin)
d) congestion removed from a destination (pollin)
Waiting for any rdma operation to complete: no setup is required, after
initiating an rdma operation, call poll to wait for pollin. When poll
returns use the rds barrier operation to detect if the rdma operation
requested is complete and if not - poll again (but process any other
events first, like incoming messages, socket space, congestion, etc).
Furthermore, poll in conjunction with a non-blocking barrier can be used
to wake a poll waiter when a specific rdma operation completes. After
initiating one or more rdma operations issue an non-blocking rds barrier
with the rdma id of any of the outstanding rdma operations. Ideally,
the last rdma operation, that way, when it completes - all other
preceding operations (to the same destination) are guaranteed to be
complete too. If the rdma operation is complete the barrier will return
success - otherwise - the rds barrier will arm the socket with the rdma
id specified in the barrier and return eagain. A subsequent call to poll
will wait for the armed rdma id to complete.
Note that it is possible for poll to return early. Therefore, when poll
returns - a subsequent call to rds barrier is required to determine if
the requested rdma operation (and all preceding) is complete.
So what is RDS congestion ?
When an application is recving RDS messages, they are queued at the
socket. If the application is not draining these messages promptly then
they may queue at the socket up until so_rcvbuf limit is reached. If
so_rcvbuf limit is reached RDS sends a back pressure message (congestion
update) to the RDS sender node informing it to back pressure sends to
the specific destination. When an RDS sender attempts to send to a
congested recv socket the sender is back pressured via eagain.
A back pressured sender can either issue a blocking send and wait for
can wait in poll with pollin. When the recv socket is un-congested - the
process pulls off messages, a congestion update message is sent to nodes
with back pressured senders which results in waking poll waiters with
pollin.
More information about the rds-devel
mailing list