/*
- * $Id: store_dir_diskd.cc,v 1.62 2002/04/06 08:49:43 adrian Exp $
+ * $Id: store_dir_diskd.cc,v 1.63 2002/04/06 12:54:42 hno Exp $
*
* DEBUG: section 47 Store Directory Routines
* AUTHOR: Duane Wessels
debug(50, 0) ("storeDiskdInit: msgget: %s\n", xstrerror());
fatal("msgget failed");
}
+ diskdinfo->shm.nbufs = diskdinfo->magic2 * 1.3;
diskdinfo->shm.id = shmget((key_t) (ikey + 2),
- SHMBUFS * SHMBUF_BLKSZ, 0600 | IPC_CREAT);
+ diskdinfo->shm.nbufs * SHMBUF_BLKSZ, 0600 | IPC_CREAT);
if (diskdinfo->shm.id < 0) {
debug(50, 0) ("storeDiskdInit: shmget: %s\n", xstrerror());
fatal("shmget failed");
debug(50, 0) ("storeDiskdInit: shmat: %s\n", xstrerror());
fatal("shmat failed");
}
- diskdinfo->shm.inuse_map = xcalloc((SHMBUFS + 7) / 8, 1);
- diskd_stats.shmbuf_count += SHMBUFS;
- for (i = 0; i < SHMBUFS; i++) {
+ diskdinfo->shm.inuse_map = xcalloc((diskdinfo->shm.nbufs + 7) / 8, 1);
+ diskd_stats.shmbuf_count += diskdinfo->shm.nbufs;
+ for (i = 0; i < diskdinfo->shm.nbufs; i++) {
CBIT_SET(diskdinfo->shm.inuse_map, i);
storeDiskdShmPut(sd, i * SHMBUF_BLKSZ);
}
char *buf = NULL;
diskdinfo_t *diskdinfo = sd->fsdata;
int i;
- for (i = 0; i < SHMBUFS; i++) {
+ for (i = 0; i < diskdinfo->shm.nbufs; i++) {
if (CBIT_TEST(diskdinfo->shm.inuse_map, i))
continue;
CBIT_SET(diskdinfo->shm.inuse_map, i);
}
assert(buf);
assert(buf >= diskdinfo->shm.buf);
- assert(buf < diskdinfo->shm.buf + (SHMBUFS * SHMBUF_BLKSZ));
+ assert(buf < diskdinfo->shm.buf + (diskdinfo->shm.nbufs * SHMBUF_BLKSZ));
diskd_stats.shmbuf_count++;
if (diskd_stats.max_shmuse < diskd_stats.shmbuf_count)
diskd_stats.max_shmuse = diskd_stats.shmbuf_count;
int i;
diskdinfo_t *diskdinfo = sd->fsdata;
assert(offset >= 0);
- assert(offset < SHMBUFS * SHMBUF_BLKSZ);
+ assert(offset < diskdinfo->shm.nbufs * SHMBUF_BLKSZ);
i = offset / SHMBUF_BLKSZ;
- assert(i < SHMBUFS);
+ assert(i < diskdinfo->shm.nbufs);
assert(CBIT_TEST(diskdinfo->shm.inuse_map, i));
CBIT_CLR(diskdinfo->shm.inuse_map, i);
diskd_stats.shmbuf_count--;
diskdinfo_t *diskdinfo = sd->fsdata;
int old_magic1 = diskdinfo->magic1;
diskdinfo->magic1 = atoi(value);
- if (reconfiguring && old_magic1 != diskdinfo->magic1)
+ if (!reconfiguring)
+ return;
+ if (old_magic1 < diskdinfo->magic1) {
+ /*
+ * This is because shm.nbufs is computed at startup, when
+ * we call shmget(). We can't increase the Q1/Q2 parameters
+ * beyond their initial values because then we might have
+ * more "Q2 messages" than shared memory chunks, and this
+ * will cause an assertion in storeDiskdShmGet().
+ */
+ debug(3, 1) ("WARNING: cannot increase cache_dir '%s' Q1 value while Squid is running.\n", sd->path);
+ diskdinfo->magic1 = old_magic1;
+ return;
+ }
+ if (old_magic1 != diskdinfo->magic1)
debug(3, 1) ("cache_dir '%s' new Q1 value '%d'\n",
sd->path, diskdinfo->magic1);
}
diskdinfo_t *diskdinfo = sd->fsdata;
int old_magic2 = diskdinfo->magic2;
diskdinfo->magic2 = atoi(value);
- if (reconfiguring && old_magic2 != diskdinfo->magic2)
+ if (!reconfiguring)
+ return;
+ if (old_magic2 < diskdinfo->magic2) {
+ /* See comments in Q1 function above */
+ debug(3, 1) ("WARNING: cannot increase cache_dir '%s' Q2 value while Squid is running.\n", sd->path);
+ diskdinfo->magic2 = old_magic2;
+ return;
+ }
+ if (old_magic2 != diskdinfo->magic2)
debug(3, 1) ("cache_dir '%s' new Q2 value '%d'\n",
sd->path, diskdinfo->magic2);
}