When a cm_MergeStatus operation determines that the current data buffers
are out of date, remove them from the buffer hash tables in order to speed
the lookup of valid data buffers.
after removing cm_buf_t objects from the hash tables, clear the HT list
pointers to make debugging easier.
when modifying data version values in buf_ForceDataVersion() grab a
read lock on buf_globalLock instead of a write lock. A write lock is
only required if the hash table linked lists are being modified.
The dataVersion itself is protected by the cm_scache_t mx mutex being
held.
Windows requires open() to be called with O_BINARY otherwise Ctrl-Z
means EOF which breaks dumpfile processing.
Be consistent about writing/reading time as afs_uint32 instead of
writing as afs_uint32 and reading as time_t since time_t can be 32-bit
or 64-bit depending on the platform.
Add a registry value, GiveUpAllCallBacks, that can be used to enable/disable
the use of the GiveUpAllCallBacks RPC. Due to the fact that calling this RPC
can destablize pre-1.4.6 file servers since they do not include DELTA
giveupallcallbacks-locking-20071121, the default is being set to disabled.
We can re-enable the functionality by default only after sufficient time
has been given for orgs to update their file servers.
It turns out that LsaCallAuthenticationPackage can succeed but still
fail with an extended error. The one case that we have seen reported
is STATUS_NO_MEMORY which would be produced when the paging file is
full. This could be a transient error that will be resolved after
Windows increases the paging file size.
Instead of crashing under this condition we should force the authentication
to fail and permit the client to retry.
The cm_Daemon() thread did not check after each operation whether or
not the service is in the process of shutting down. As a result the
thread could access data, locks, etc. that had been freed by other
threads.
====================
This delta was composed from multiple commits as part of the CVS->Git migration.
The checkin message with each commit was inconsistent.
The following are the additional commit messages.
====================
this should fix the issue with cbfree being corrupted. a more exhaustive pointer-blunting patch should probably be pulled in, but, this is simple and obvious
add -ctime parameter which produces human readable expiration times.
Doesn't work with OpenAFS for Windows prior to 1.5.28 because time()
was not used in those versions for tracking expiration times.
A .readonly volume callback applies to the entire volume. Track it
in the cm_volume_t cbExpiresRO field and apply it to all cm_scache_t
objects with valid callbacks that are associated with that volume upon
each daemon callback check. This will prevent premature callback
expiration.
Also, attempt to automatically refresh the callbacks every 30 minutes
by obtaining a callback on the volume root. This value is configurable
with the "daemonCheckVolCBInterval" registry value.
Change from osi_Time() to time() for expiration values in order to
permit conversion to human readable values in cmdebug.
the difference between osi_assert() and osi_assertx() is whether or not
a description is specified as part of the call. When no message is
specified afsd_notifier() is called with a NULL msgp parameter. This
results in a null pointer dereference during the EventLog() call.
As a result, none of the information describing the assertion is written
to the log file.
This commit sets a default message for use when no other message is
provided and it replaces all calls to osi_assert with osi_assertx and
adds descriptions.
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.
Reorganize the locking for cm_BeginDirOp and cm_EndDirOp.
There are a number of locations where locks are obtained, dropped, and
reobtained. This reorganization attempts to accomplish several things:
(1) be optimistic for the most common case so it will be fast
(2) add consistency checks after each location where locks are dropped
and re-obtained. If we lose a race in cm_BeginDirOp and the bplus
tree is out of date, retry until we get to a consistent state
that we can use.
(3) Ensure that all operations take place with the correct locks.
replace all OutputDebugString calls with osi_LogX calls
modify bestMatch to special case the return values for leaf nodes.
If an entry is above or below the values available in the leaf node
return BTLOWER or BTUPPER instead of BTERROR.
In insert and delete operations check for BTLOWER/BTUPPER and isleaf,
if true convert to either slot 0 or Max and perform the insertion.
This produces easier to read code when performing lookups.