68 if (theFile->error()) {
76 }
else if ((
FILE_MODE(mode) == O_RDONLY) && !closing) {
81 if (flags.try_closing)
84 debugs(79, 3,
"UFSStoreState::openDone: exiting");
91 debugs(79, 3,
"dirno " << swap_dirn <<
92 ", fileno " <<
asHex(swap_filen).minDigits(8) <<
93 " status " << theFile->error());
95 if (theFile->error()) {
96 debugs(79,3,
"theFile->error() ret " << theFile->error());
118 debugs(79, 3,
"dirno " << swap_dirn <<
119 ", fileno " <<
asHex(swap_filen).upperCase().minDigits(8));
126 assert(read.callback ==
nullptr);
127 assert(read.callback_data ==
nullptr);
132 if (!theFile->canRead()) {
133 debugs(79, 3,
"queueing read because theFile can't read");
135 pending_reads.emplace(buf,
size, aOffset, aCallback, aCallbackData);
139 read.callback = aCallback;
141 debugs(79, 3,
"dirno " << swap_dirn <<
142 ", fileno " <<
asHex(swap_filen).minDigits(8));
160 debugs(79, 3,
"dirno " << swap_dirn <<
161 ", fileno " <<
asHex(swap_filen).minDigits(8));
163 if (theFile->error()) {
166 free_func((
void*)buf);
171 if (
static_cast<uint64_t
>(offset_ +
size) >
static_cast<uint64_t
>(dir.
maxObjectSize())) {
172 debugs(79, 2,
"accepted unknown-size entry grew too big: " <<
174 free_func((
void*)buf);
179 debugs(79, 3, (
void*)
this <<
" queueing write of size " <<
size);
180 pending_writes.emplace(buf,
size, aOffset, free_func);
194 debugs(79, 3, (
void*)
this);
196 assert(theFile->canWrite());
198 if (pending_writes.empty()) {
199 debugs(79, 3, (
void*)
this <<
" write queue is empty");
203 auto &q = pending_writes.front();
205 if (theFile->error()) {
207 pending_writes.pop();
221 debugs(79, 3, (
void*)
this <<
" calling theFile->write(" << q.size <<
")");
223 theFile->write(
new WriteRequest(q.buf, q.offset, q.size, q.free_func));
225 pending_writes.pop();
233 debugs(79, 3,
"dirno " << swap_dirn <<
234 ", fileno " <<
asHex(swap_filen).minDigits(8) <<
240 STRCB *callback_ = read.callback;
244 read.callback =
nullptr;
261 if (len > 0 && read_buf != buf)
262 memcpy(read_buf, buf, len);
264 callback_(
cbdata, read_buf, len,
this);
267 if (flags.try_closing || (theFile !=
nullptr && theFile->error()) )
274 debugs(79, 3,
"dirno " << swap_dirn <<
275 ", fileno " <<
asHex(swap_filen).upperCase().minDigits(8) <<
285 if (theFile->error()) {
286 debugs(79,2,
" detected an error, will try to close");
300 debugs(79, 3,
"storeUfsIOCallback: errflag=" << errflag);
309 STIOCB *theCallback = callback;
315 theCallback(
cbdata, errflag,
this);
342 flags.write_draining =
false;
343 flags.try_closing =
false;
348 assert(pending_reads.empty());
349 assert(pending_writes.empty());
355 while (!pending_reads.empty())
357 debugs(79, 3,
"freed pending reads");
359 while (!pending_writes.empty())
360 pending_writes.pop();
361 debugs(79, 3,
"freed pending writes");
367 if (pending_reads.empty())
370 auto &q = pending_reads.front();
372 debugs(79, 3,
"reading queued request of " << q.size <<
" bytes");
377 read_(q.buf, q.size, q.offset, q.callback,
cbdata);
379 debugs(79, 2,
"this=" << (
void*)
this <<
" cbdataReferenceValidDone returned false." <<
380 " closing: " << closing <<
" flags.try_closing: " << flags.try_closing);
404 if (flags.write_draining)
407 if (!theFile || !theFile->canWrite())
410 flags.write_draining =
true;
412 while (!pending_writes.empty())
415 flags.write_draining =
false;
417 if (flags.try_closing)
431 debugs(79,3,
this <<
" tryClosing()" <<
432 " closing = " << closing <<
433 " flags.try_closing = " << flags.try_closing <<
434 " ioInProgress = " << theFile->ioInProgress());
436 if (theFile->ioInProgress()) {
438 " won't close since ioInProgress is true, bailing");
439 flags.try_closing =
true;
444 flags.try_closing =
false;
AsHex< Integer > asHex(const Integer n)
a helper to ease AsHex object creation
#define cbdataReference(var)
#define cbdataReferenceValidDone(var, ptr)
#define CBDATA_NAMESPACED_CLASS_INIT(namespace, type)
virtual bool error() const =0
~UFSStoreState() override
virtual void doCloseCallback(int errflag)
void closeCompleted() override
void read_(char *buf, size_t size, off_t offset, STRCB *callback, void *callback_data) override
void writeCompleted(int errflag, size_t len, RefCount< WriteRequest >) override
bool write(char const *buf, size_t size, off_t offset, FREE *free_func) override
UFSStoreState(SwapDir *SD, StoreEntry *anEntry, STIOCB *callback_, void *callback_data_)
struct Fs::Ufs::UFSStoreState::@51 flags
void close(int how) override
finish or abort swapping per CloseHow
void readCompleted(const char *buf, int len, int errflag, RefCount< ReadRequest >) override
RefCount< DiskFile > theFile
void ioCompletedNotification() override
sfileno swap_filen
unique ID inside a cache_dir for swapped out entries; -1 for others
manages a single cache_dir
int64_t maxObjectSize() const override
the maximum size of a storable object; -1 if unlimited
#define debugs(SECTION, LEVEL, CONTENT)