mirror of
https://git.openafs.org/openafs.git
synced 2025-01-18 06:50:12 +00:00
2b9ba03ef7
Currently, our HashTable for FileEntry structs is a fixed size (FEHASH_SIZE, 512). If we have a large number of callbacks, this can lead to very long hash chains, which can cause the fileserver to consume high amounts of CPU when finding, deleting, or especially adding new callbacks. This is especially bad since callbacks are managed under the global H_LOCK. To improve this, use our configured callback limit (-cb) to build an appropriately-sized HashTable at initialization, instead of using a hard-coded size. We compute this by dividing the -cb value by the desired hash chain length (FE_CHAIN_TARGET, 16), then rounding up to the nearest power of 2 at least as big as the old FEHASH_SIZE, 512. For DAFS, a copy of our HashTable is included in the fsstate.dat file on disk, so changing our hashtable size potentially changes the data in fsstate.dat. However, we currently do not read in the hashtable data from fsstate.dat, since it's not very useful; we only write it out in case other utilities or older fileservers need it. Older fileservers, however, will not read an fsstate.dat with a hashtable that does not have exactly FEHASH_SIZE. So if we have a differently-sized hash table, we're breaking compatibility with those fileservers anyway, so don't write out our hashtable data at all. This commit also changes the format of the callback.dump file, since it did not allow for a variable-length hashtable. We create a new MAGICV3 magic to define the new format, and add some logic to the 'cbd' utility to understand it. We still write out our hashtable to this file since it's for debugging, and the hashtable data may be useful in that context. Move FEHash to callback.c, since it now relies on the callback.c-only FEhashsize, and move FEHASH_SIZE_OLD along with it. [adeason@sinenomine.net: Don't write out non-old-sized hashtable. Move FEHash &co to callback.c. Various other minor edits.] Change-Id: I54de91c54c5fcb526f880bc63ba10c1b3eb0aaf0 Reviewed-on: https://gerrit.openafs.org/14731 Reviewed-by: Mark Vitale <mvitale@sinenomine.net> Tested-by: BuildBot <buildbot@rampaginggeek.com> Reviewed-by: Cheyenne Wills <cwills@sinenomine.net> Reviewed-by: Michael Meffie <mmeffie@sinenomine.net> Reviewed-by: Andrew Deason <adeason@sinenomine.net> |
||
---|---|---|
build-tools | ||
doc | ||
src | ||
tests | ||
.gitignore | ||
.gitreview | ||
.mailmap | ||
.splintrc | ||
acinclude.m4 | ||
CODING | ||
configure-libafs.ac | ||
configure.ac | ||
CONTRIBUTING | ||
INSTALL | ||
libafsdep | ||
LICENSE | ||
Makefile-libafs.in | ||
Makefile.in | ||
NEWS | ||
NTMakefile | ||
README | ||
README-WINDOWS | ||
regen.sh |
AFS is a distributed file system that enables users to share and access all of the files stored in a network of computers as easily as they access the files stored on their local machines. The file system is called distributed for this exact reason: files can reside on many different machines, but are available to users on every machine. OpenAFS 1.0 was originally released by IBM under the terms of the IBM Public License 1.0 (IPL10). For details on IPL10 see the LICENSE file in this directory. The current OpenAFS distribution is licensed under a combination of the IPL10 and many other licenses as granted by the relevant copyright holders. The LICENSE file in this directory contains more details, thought it is not a comprehensive statement. See INSTALL for information about building and installing OpenAFS on various platforms. See CODING for developer information and guidelines. See NEWS for recent changes to OpenAFS.