]>
git.ipfire.org Git - thirdparty/squid.git/blob - src/DiskIO/DiskThreads/DiskThreadsDiskFile.cc
7007b4c10133ea3eb711365fcf29eee93b57201d
2 * Copyright (C) 1996-2021 The Squid Software Foundation and contributors
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
9 /* DEBUG: section 79 Disk IO Routines */
12 #include "DiskIO/IORequestor.h"
13 #include "DiskIO/ReadRequest.h"
14 #include "DiskIO/WriteRequest.h"
15 #include "DiskThreadsDiskFile.h"
20 #include "StatCounters.h"
25 /* === PUBLIC =========================================================== */
27 CBDATA_CLASS_INIT(DiskThreadsDiskFile
);
29 DiskThreadsDiskFile::DiskThreadsDiskFile(char const *aPath
)
32 debugs(79, 3, "UFSFile::UFSFile: " << aPath
);
33 path_
= xstrdup(aPath
);
36 DiskThreadsDiskFile::~DiskThreadsDiskFile()
43 DiskThreadsDiskFile::open(int flags
, mode_t mode
, RefCount
<IORequestor
> callback
)
45 ++statCounter
.syscalls
.disk
.opens
;
48 fd
= file_open(path_
, flags
);
51 debugs(79, 3, "DiskThreadsDiskFile::open: got failure (" << errno
<< ")");
59 ioRequestor
= callback
;
65 aioOpen(path_
, flags
, mode
, DiskThreadsDiskFile::OpenDone
, this);
69 openDone(fd
, NULL
, fd
, 0);
75 DiskThreadsDiskFile::read(ReadRequest
* request
)
77 debugs(79, 3, "DiskThreadsDiskFile::read: " << this << ", size " << request
->len
);
79 assert (ioRequestor
.getRaw());
80 ++statCounter
.syscalls
.disk
.reads
;
84 aioRead(fd
, request
->offset
, request
->len
, ReadDone
, new IoResult
<ReadRequest
>(this, request
));
87 file_read(fd
, request
->buf
, request
->len
, request
->offset
, ReadDone
, new IoResult
<ReadRequest
>(this, request
));
92 DiskThreadsDiskFile::create(int flags
, mode_t mode
, RefCount
<IORequestor
> callback
)
94 ++statCounter
.syscalls
.disk
.opens
;
97 int fd
= file_open(path_
, flags
);
100 debugs(79, 3, "DiskThreadsDiskFile::create: got failure (" << errno
<< ")");
108 ioRequestor
= callback
;
114 aioOpen(path_
, flags
, mode
, DiskThreadsDiskFile::OpenDone
, this);
118 openDone (fd
, NULL
, fd
, 0);
124 DiskThreadsDiskFile::error() const
130 DiskThreadsDiskFile::OpenDone(int fd
, void *cbdata
, const char *buf
, int aio_return
, int aio_errno
)
132 DiskThreadsDiskFile
*myFile
= static_cast<DiskThreadsDiskFile
*>(cbdata
);
133 myFile
->openDone (fd
, buf
, aio_return
, aio_errno
);
137 DiskThreadsDiskFile::openDone(int, const char *, int anFD
, int errflag
)
139 debugs(79, 3, "DiskThreadsDiskFile::openDone: FD " << anFD
<< ", errflag " << errflag
);
144 if (errflag
|| fd
< 0) {
145 debugs(79, DBG_CRITICAL
, MYNAME
<< xstrerr(errflag
));
146 debugs(79, DBG_IMPORTANT
, "\t" << path_
);
149 ++store_open_disk_fd
;
150 commSetCloseOnExec(fd
);
151 fd_open(fd
, FD_FILE
, path_
);
154 IORequestor::Pointer t
= ioRequestor
;
156 t
->ioCompletedNotification();
158 debugs(79, 3, "DiskThreadsDiskFile::openDone: exiting");
161 void DiskThreadsDiskFile::doClose()
164 ++statCounter
.syscalls
.disk
.closes
;
175 --store_open_disk_fd
;
181 DiskThreadsDiskFile::close()
183 debugs(79, 3, "DiskThreadsDiskFile::close: " << this << " closing for " << ioRequestor
.getRaw());
185 if (!ioInProgress()) {
187 assert (ioRequestor
!= NULL
);
188 ioRequestor
->closeCompleted();
191 debugs(79, DBG_CRITICAL
, HERE
<< "DiskThreadsDiskFile::close: " <<
192 "did NOT close because ioInProgress() is true. now what?");
197 DiskThreadsDiskFile::canRead() const
199 debugs(79, 3, "DiskThreadsDiskFile::canRead: fd is " << fd
);
204 DiskThreadsDiskFile::write(WriteRequest
* writeRequest
)
206 debugs(79, 3, "DiskThreadsDiskFile::write: FD " << fd
);
207 ++statCounter
.syscalls
.disk
.writes
;
211 aioWrite(fd
, writeRequest
->offset
, (char *)writeRequest
->buf
, writeRequest
->len
, WriteDone
, new IoResult
<WriteRequest
>(this, writeRequest
),
212 writeRequest
->free_func
);
215 file_write(fd
, writeRequest
->offset
, (char *)writeRequest
->buf
, writeRequest
->len
, WriteDone
, new IoResult
<WriteRequest
>(this, writeRequest
),
216 writeRequest
->free_func
);
221 DiskThreadsDiskFile::canWrite() const
227 DiskThreadsDiskFile::ioInProgress() const
229 return inProgressIOs
> 0;
232 /* === STATIC =========================================================== */
236 DiskThreadsDiskFile::ReadDone(int fd
, void *my_data
, const char *buf
, int len
, int errflag
)
239 DiskThreadsDiskFile::ReadDone(int fd
, const char *buf
, int len
, int errflag
, void *my_data
)
242 IoResult
<ReadRequest
> * result
= static_cast<IoResult
<ReadRequest
> *>(my_data
);
244 result
->file
->readDone(fd
, buf
, len
, errflag
, result
->request
);
249 DiskThreadsDiskFile::readDone(int rvfd
, const char *buf
, int len
, int errflag
, RefCount
<ReadRequest
> request
)
251 debugs(79, 3, "DiskThreadsDiskFile::readDone: FD " << rvfd
);
257 debugs(79, 3, "DiskThreadsDiskFile::readDone: got failure (" << errflag
<< ")");
260 rlen
= (ssize_t
) len
;
264 /* translate errflag from errno to Squid disk error */
268 errflag
= DISK_ERROR
;
274 if (errflag
== DISK_EOF
)
275 errflag
= DISK_OK
; /* EOF is signalled by len == 0, not errors... */
281 ioRequestor
->readCompleted(buf
, rlen
, errflag
, request
);
285 DiskThreadsDiskFile::
287 WriteDone(int fd
, void *my_data
, const char *buf
, int len
, int errflag
)
289 WriteDone(int fd
, int errflag
, size_t len
, void *my_data
)
292 IoResult
<WriteRequest
> * result
= static_cast<IoResult
<WriteRequest
> *>(my_data
);
294 result
->file
->writeDone(fd
, errflag
, len
, result
->request
);
299 DiskThreadsDiskFile::writeDone(int rvfd
, int errflag
, size_t len
, RefCount
<WriteRequest
> request
)
302 static int loop_detect
= 0;
305 /* Translate from errno to Squid disk error */
308 errflag
= errflag
== ENOSPC
? DISK_NO_SPACE_LEFT
: DISK_ERROR
;
314 debugs(79, 3, "DiskThreadsDiskFile::writeDone: FD " << fd
<< ", len " << len
<< ", err=" << errflag
);
317 assert(loop_detect
< 10);
321 ioRequestor
->writeCompleted(errflag
, len
, request
);
326 /** \cond AUTODOCS_IGNORE */
328 cbdata_type IoResult
<RT
>::CBDATA_IoResult
= CBDATA_UNKNOWN
;