--------------------- PatchSet 331 Date: 2002/12/12 11:02:32 Author: rbcollins Branch: unify-io Tag: (none) Log: diskd write separation Members: src/fs/diskd/store_diskd.h:1.1.20.31->1.1.20.32 src/fs/diskd/store_io_diskd.cc:1.1.20.37->1.1.20.38 Index: squid3/src/fs/diskd/store_diskd.h =================================================================== RCS file: /cvsroot/squid-sf//squid3/src/fs/diskd/Attic/store_diskd.h,v retrieving revision 1.1.20.31 retrieving revision 1.1.20.32 diff -u -r1.1.20.31 -r1.1.20.32 --- squid3/src/fs/diskd/store_diskd.h 12 Dec 2002 10:37:03 -0000 1.1.20.31 +++ squid3/src/fs/diskd/store_diskd.h 12 Dec 2002 11:02:32 -0000 1.1.20.32 @@ -47,6 +47,7 @@ void openDone(diomsg *); void createDone (diomsg *); void readDone (diomsg *); + void writeDone (diomsg *); void closeDone (diomsg *); int mode; void notifyClient(); Index: squid3/src/fs/diskd/store_io_diskd.cc =================================================================== RCS file: /cvsroot/squid-sf//squid3/src/fs/diskd/Attic/store_io_diskd.cc,v retrieving revision 1.1.20.37 retrieving revision 1.1.20.38 diff -u -r1.1.20.37 -r1.1.20.38 --- squid3/src/fs/diskd/store_io_diskd.cc 12 Dec 2002 10:37:03 -0000 1.1.20.37 +++ squid3/src/fs/diskd/store_io_diskd.cc 12 Dec 2002 11:02:32 -0000 1.1.20.38 @@ -1,6 +1,6 @@ /* - * $Id: store_io_diskd.cc,v 1.1.20.37 2002/12/12 10:37:03 rbcollins Exp $ + * $Id: store_io_diskd.cc,v 1.1.20.38 2002/12/12 11:02:32 rbcollins Exp $ * * DEBUG: section 79 Squid-side DISKD I/O functions. * AUTHOR: Duane Wessels @@ -352,7 +352,7 @@ readDone(M); break; case _MQD_WRITE: - assert (0); + writeDone(M); break; case _MQD_UNLINK: assert (0); @@ -455,7 +455,10 @@ return; } assert (!closing); - assert (0); + debug(79, 3) ("diskd::ioCompleted: dirno %d, fileno %08x status %d\n", swap_dirn, swap_filen, theFile->error()); + /* Ok, notification past open means an error has occured */ + assert (theFile->error()); + storeDiskdIOCallback(this, DISK_ERROR); } void @@ -484,37 +487,37 @@ void DiskdFile::write(char const *buf, size_t size, off_t offset, FREE *free_func) { - assert (0); -} - -void -diskdstate_t::write(char *buf, size_t size, off_t offset, FREE * free_func) -{ - SwapDir *SD = INDEXSD(swap_dirn); - int x; - char *sbuf; off_t shm_offset; - debug(79, 3) ("storeDiskdWrite: dirno %d, fileno %08X\n", swap_dirn, swap_filen); - assert(!closing); - writing = true; - sbuf = (char *)((DiskdIO *)SD->IO)->shm.get(&shm_offset); + char *sbuf = (char *)IO->shm.get(&shm_offset); xmemcpy(sbuf, buf, size); if (free_func) - free_func(buf); - x = storeDiskdSend(_MQD_WRITE, - (DiskdIO *)SD->IO, -((DiskdFile *)theFile.getRaw())->getID(), + free_func(const_cast(buf)); + int x = storeDiskdSend(_MQD_WRITE, + IO, + id, this, (int) size, (int) offset, shm_offset); if (x < 0) { + errorOccured = true; debug(79, 1) ("storeDiskdSend WRITE: %s\n", xstrerror()); - ((DiskdIO *)SD->IO)->shm.put (shm_offset); - storeDiskdIOCallback(this, DISK_ERROR); + IO->shm.put (shm_offset); + notifyClient(); + ioRequestor = NULL; + return; } diskd_stats.write.ops++; } + +void +diskdstate_t::write(char *buf, size_t size, off_t offset, FREE * free_func) +{ + debug(79, 3) ("storeDiskdWrite: dirno %d, fileno %08X\n", swap_dirn, swap_filen); + assert(!closing); + writing = true; + theFile->write(buf,size,offset,free_func); +} void storeDiskdUnlink(SwapDir * SD, StoreEntry * e) @@ -617,25 +620,27 @@ void diskdstate_t::writeCompleted(int errflag, size_t len) { - assert (0); + writing = false; + debug(79, 3) ("storeDiskdWriteDone: dirno %d, fileno %08x status %d\n", + swap_dirn, swap_filen, len); + offset_ += len; + if (errflag) + storeDiskdIOCallback(this, DISK_ERROR); } -static void -storeDiskdWriteDone(diomsg * M) +void +DiskdFile::writeDone(diomsg *M) { - storeIOState *sio = static_cast(M->callback_data); - diskdstate_t *diskdstate = dynamic_cast(sio); statCounter.syscalls.disk.writes++; - diskdstate->writing = false; - debug(79, 3) ("storeDiskdWriteDone: dirno %d, fileno %08x status %d\n", - sio->swap_dirn, sio->swap_filen, M->status); + debug(79, 3) ("storeDiskdWriteDone: status %d\n", M->status); if (M->status < 0) { + errorOccured = true; diskd_stats.write.fail++; - storeDiskdIOCallback(sio, DISK_ERROR); + ioRequestor->writeCompleted (DISK_ERROR,0); return; } diskd_stats.write.success++; - sio->offset_ += M->status; + ioRequestor->writeCompleted (DISK_OK,M->status); } static void @@ -670,10 +675,8 @@ case _MQD_CREATE: case _MQD_CLOSE: case _MQD_READ: - assert (0); - break; case _MQD_WRITE: - storeDiskdWriteDone(M); + assert (0); break; case _MQD_UNLINK: storeDiskdUnlinkDone(M);