windows-scache-syncop-waiters-20071103
authorAsanka Herath <asanka@secure-endpoints.com>
Sat, 3 Nov 2007 16:31:50 +0000 (16:31 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Sat, 3 Nov 2007 16:31:50 +0000 (16:31 +0000)
commit45e2d81aa3f62927adc85e4e23daf511478829e4
treeac8263b682d71ad0e16f0ba105e9e25454128e9d
parent2c45d9ec9fc888c2c6eed46538fe4a9c440e3c8c
windows-scache-syncop-waiters-20071103

One of the issues that has become a serious problem since the addition
of the local directory updates is that although cm_SyncOp synchronizes
operations, it does not preserve the order of requests.  This has always
been a problem in that it has been possible for a request to fail to
complete due to its worker thread's bad luck.  When a request takes
longer than the Windows SMB Redirector's timeout, the SMB Redirector
tears down the SMB virtual circuit.

When using the local directory updates it is really important that
the directory update operations complete in the order that they were
sent to the file server.  If they don't, then the local directory
state and the file server state will not match and the local directory
state must be discarded which in turn forces a new read of the entire
directory contents over the network.

This patch adds a new cm_scache_waiter_t object that is used to store
the current thread, buffer, and syncop flags within a waiters queue
on each cm_scache_t object.  If a thread is forced to sleep in cm_SyncOp,
upon waking it will check to see if there are any other threads waiting
that are attempting to perform a similar task ahead of it in the queue.
If yes, the thread goes back to sleep.  If not, it goes ahead and
enters the cm_SyncOp conflict resolution block.

This patch has the additional side effect of reducing the number of
competing threads that must obtain the cm_scache_t mutex and process
the cm_SyncOp conflict resolution block.  As a result, the overall
CPU utilization of the service and the clock time associated with
processing requests will be reduced.
src/WINNT/afsd/cm_scache.c
src/WINNT/afsd/cm_scache.h