osi_uid_t debugID;
afs_uint64 cacheBlocks;
DWORD cacheSize;
+ DWORD blockSize;
long logChunkSize;
DWORD stats;
DWORD dwValue;
logChunkSize);
logChunkSize = CM_CONFIGDEFAULT_CHUNKSIZE;
}
- afsi_log("Chunk size %d", logChunkSize);
} else {
logChunkSize = CM_CONFIGDEFAULT_CHUNKSIZE;
- afsi_log("Default chunk size %d", logChunkSize);
}
cm_logChunkSize = logChunkSize;
cm_chunkSize = 1 << logChunkSize;
+ afsi_log("Chunk size %u (%d)", cm_chunkSize, cm_logChunkSize);
+
+ dummyLen = sizeof(blockSize);
+ code = RegQueryValueEx(parmKey, "blockSize", NULL, NULL,
+ (BYTE *) &blockSize, &dummyLen);
+ if (code == ERROR_SUCCESS) {
+ if (blockSize < 1 ||
+ (blockSize > 1024 && (blockSize % CM_CONFIGDEFAULT_BLOCKSIZE != 0)))
+ {
+ afsi_log("Invalid block size %u specified, using default", blockSize);
+ blockSize = CM_CONFIGDEFAULT_BLOCKSIZE;
+ } else {
+ /*
+ * if the blockSize is less than 1024 we permit the blockSize to be
+ * specified in multiples of the default blocksize
+ */
+ if (blockSize <= 1024)
+ blockSize *= CM_CONFIGDEFAULT_BLOCKSIZE;
+ }
+ } else {
+ blockSize = CM_CONFIGDEFAULT_BLOCKSIZE;
+ }
+ if (blockSize > cm_chunkSize) {
+ afsi_log("Block size cannot be larger than Chunk size.");
+ blockSize = cm_chunkSize;
+ }
+ afsi_log("Block size %u", blockSize);
dummyLen = sizeof(numBkgD);
code = RegQueryValueEx(parmKey, "Daemons", NULL, NULL,
RegCloseKey (parmKey);
- cacheBlocks = ((afs_uint64)cacheSize * 1024) / CM_CONFIGDEFAULT_BLOCKSIZE;
+ cacheBlocks = ((afs_uint64)cacheSize * 1024) / blockSize;
/* get network related info */
cm_noIPAddr = CM_MAXINTERFACE_ADDR;
cm_InitCallback();
- code = cm_InitMappedMemory(virtualCache, cm_CachePath, stats, cm_chunkSize, cacheBlocks);
+ code = cm_InitMappedMemory(virtualCache, cm_CachePath, stats, cm_chunkSize, cacheBlocks, blockSize);
afsi_log("cm_InitMappedMemory code %x", code);
if (code != 0) {
*reasonP = "error initializing cache file";
ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
ServiceStatus.dwWin32ExitCode = NO_ERROR;
ServiceStatus.dwCheckPoint = 1;
- ServiceStatus.dwWaitHint = 30000;
+ ServiceStatus.dwWaitHint = 120000;
/* accept Power Events */
ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_POWEREVENT | SERVICE_ACCEPT_PARAMCHANGE;
SetServiceStatus(StatusHandle, &ServiceStatus);
}
else
{
- /* allow another 15 seconds to start */
+ /* allow another 120 seconds to start */
ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
ServiceStatus.dwServiceSpecificExitCode = 0;
ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
ServiceStatus.dwWin32ExitCode = NO_ERROR;
ServiceStatus.dwCheckPoint = 2;
- ServiceStatus.dwWaitHint = 20000;
+ ServiceStatus.dwWaitHint = 120000;
/* accept Power Events */
ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_POWEREVENT | SERVICE_ACCEPT_PARAMCHANGE;
SetServiceStatus(StatusHandle, &ServiceStatus);
}
#ifndef NOTSERVICE
- ServiceStatus.dwCheckPoint++;
- ServiceStatus.dwWaitHint -= 5000;
+ ServiceStatus.dwCheckPoint = 3;
+ ServiceStatus.dwWaitHint = 30000;
SetServiceStatus(StatusHandle, &ServiceStatus);
#endif
code = afsd_InitDaemons(&reason);
}
#ifndef NOTSERVICE
- ServiceStatus.dwCheckPoint++;
- ServiceStatus.dwWaitHint -= 5000;
+ ServiceStatus.dwCheckPoint = 4;
+ ServiceStatus.dwWaitHint = 15000;
SetServiceStatus(StatusHandle, &ServiceStatus);
#endif
}
int
-cm_InitMappedMemory(DWORD virtualCache, char * cachePath, DWORD stats, DWORD chunkSize, afs_uint64 cacheBlocks)
+cm_InitMappedMemory(DWORD virtualCache, char * cachePath, DWORD stats, DWORD chunkSize,
+ afs_uint64 cacheBlocks, afs_uint32 blockSize)
{
HANDLE hf = INVALID_HANDLE_VALUE, hm;
PSECURITY_ATTRIBUTES psa;
volumeSerialNumber = GetVolSerialNumber(cachePath);
GetMachineSid(machineSid, sizeof(machineSid));
- mappingSize = ComputeSizeOfMappingFile(stats, maxVols, maxCells, chunkSize, cacheBlocks, CM_CONFIGDEFAULT_BLOCKSIZE);
+ mappingSize = ComputeSizeOfMappingFile(stats, maxVols, maxCells, chunkSize, cacheBlocks, blockSize);
if ( !virtualCache ) {
psa = CreateCacheFileSA();
config_data_p->maxCells == maxCells &&
config_data_p->chunkSize == chunkSize &&
config_data_p->buf_nbuffers == cacheBlocks &&
- config_data_p->blockSize == CM_CONFIGDEFAULT_BLOCKSIZE &&
+ config_data_p->blockSize == blockSize &&
config_data_p->bufferSize == mappingSize)
{
if ( config_data_p->dirty ) {
cm_data.baseAddress = baseAddress;
cm_data.stats = stats;
cm_data.chunkSize = chunkSize;
- cm_data.blockSize = CM_CONFIGDEFAULT_BLOCKSIZE;
+ cm_data.blockSize = blockSize;
cm_data.bufferSize = mappingSize;
cm_data.scacheHashTableSize = osi_PrimeLessThan(stats / 2 + 1);
cm_data.volumeHashTableSize = osi_PrimeLessThan((afs_uint32)(maxVols/7 + 1));
cm_data.buf_nbuffers = cacheBlocks;
cm_data.buf_nOrigBuffers = 0;
- cm_data.buf_blockSize = CM_BUF_BLOCKSIZE;
+ cm_data.buf_blockSize = blockSize;
cm_data.buf_hashSize = osi_PrimeLessThan((afs_uint32)(cacheBlocks/7 + 1));
cm_data.mountRootGen = time(NULL);
cm_data.bufHeaderBaseAddress = (cm_buf_t *) baseAddress;
baseAddress += ComputeSizeOfDataHeaders(cacheBlocks);
cm_data.bufDataBaseAddress = (char *) baseAddress;
- baseAddress += ComputeSizeOfDataBuffers(cacheBlocks, CM_CONFIGDEFAULT_BLOCKSIZE);
+ baseAddress += ComputeSizeOfDataBuffers(cacheBlocks, blockSize);
cm_data.bufEndOfData = (char *) baseAddress;
cm_data.buf_dirtyListp = NULL;
cm_data.buf_dirtyListEndp = NULL;
VOID FreeCacheFileSA(PSECURITY_ATTRIBUTES psa);
int cm_ShutdownMappedMemory(void);
int cm_ValidateMappedMemory(char * cachePath);
-int cm_InitMappedMemory(DWORD virtualCache, char * cachePath, DWORD stats, DWORD chunkSize, afs_uint64 cacheBlocks );
+int cm_InitMappedMemory(DWORD virtualCache, char * cachePath, DWORD stats, DWORD chunkSize, afs_uint64 cacheBlocks, afs_uint32 blockSize);
#endif /* CM_MEMMAP_H */
\ No newline at end of file