4.12 Stable versus unstable writes
Connected: An Internet Encyclopedia
4.12 Stable versus unstable writes
Up:
Connected: An Internet Encyclopedia
Up:
Requests For Comments
Up:
RFC 1813
Up:
4. Implementation issues
Prev: 4.11 Caching policies
Next: 4.13 32 bit clients/servers and 64 bit clients/servers
4.12 Stable versus unstable writes
4.12 Stable versus unstable writes
The setting of the stable field in the WRITE arguments, that
is whether or not to do asynchronous WRITE requests, is
straightforward on a UNIX client. If the NFS version 3
protocol client receives a write request that is not marked
as being asynchronous, it should generate the RPC with stable
set to TRUE. If the request is marked as being asynchronous,
the RPC should be generated with stable set to FALSE. If the
response comes back with the committed field set to TRUE, the
client should just mark the write request as done and no
further action is required. If committed is set to FALSE,
indicating that the buffer was not synchronized with the
server's disk, the client will need to mark the buffer in
some way which indicates that a copy of the buffer lives on
the server and that a new copy does not need to be sent to
the server, but that a commit is required.
Note that this algorithm introduces a new state for buffers,
thus there are now three states for buffers. The three states
are dirty, done but needs to be committed, and done. This
extra state on the client will likely require modifications
to the system outside of the NFS version 3 protocol client.
One proposal that was rejected was the addition of a boolean
commit argument to the WRITE operation. It would be used to
indicate whether the server should do a full file commit
after doing the write. This seems as if it could be useful if
the client knew that it was doing the last write on the file.
It is difficult to see how this could be used, given existing
client architectures though.
The asynchronous write opens up the window of problems
associated with write sharing. For example: client A writes
some data asynchronously. Client A is still holding the
buffers cached, waiting to commit them later. Client B reads
the modified data and writes it back to the server. The
server then crashes. When it comes back up, client A issues a
COMMIT operation which returns with a different cookie as
well as changed attributes. In this case, the correct action
may or may not be to retransmit the cached buffers.
Unfortunately, client A can't tell for sure, so it will need
to retransmit the buffers, thus overwriting the changes from
client B. Fortunately, write sharing is rare and the
solution matches the current write sharing situation. Without
using locking for synchronization, the behaviour will be
indeterminate.
In a high availability (redundant system) server
implementation, two cases exist which relate to the verf
changing. If the high availability server implementation
does not use a shared-memory scheme, then the verf should
change on failover, since the unsynchronized data is not
available to the second processor and there is no guarantee
that the system which had the data cached was able to flush
it to stable storage before going down. The client will need
to retransmit the data to be safe. In a shared-memory high
availability server implementation, the verf would not need
to change because the server would still have the cached data
available to it to be flushed. The exact policy regarding the
verf in a shared memory high availability implementation,
however, is up to the server implementor.
Next: 4.13 32 bit clients/servers and 64 bit clients/servers
Connected: An Internet Encyclopedia
4.12 Stable versus unstable writes
|