]> git.ipfire.org Git - thirdparty/squid.git/blob - src/store_swapin.cc
SourceFormat Enforcement
[thirdparty/squid.git] / src / store_swapin.cc
1 /*
2 * Copyright (C) 1996-2017 The Squid Software Foundation and contributors
3 *
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.
7 */
8
9 /* DEBUG: section 20 Storage Manager Swapin Functions */
10
11 #include "squid.h"
12 #include "globals.h"
13 #include "StatCounters.h"
14 #include "Store.h"
15 #include "store_swapin.h"
16 #include "StoreClient.h"
17
18 static StoreIOState::STIOCB storeSwapInFileClosed;
19 static StoreIOState::STFNCB storeSwapInFileNotify;
20
21 void
22 storeSwapInStart(store_client * sc)
23 {
24 StoreEntry *e = sc->entry;
25
26 if (!EBIT_TEST(e->flags, ENTRY_VALIDATED)) {
27 /* We're still reloading and haven't validated this entry yet */
28 return;
29 }
30
31 if (e->mem_status != NOT_IN_MEMORY)
32 debugs(20, 3, HERE << "already IN_MEMORY");
33
34 debugs(20, 3, "storeSwapInStart: called for : " << e->swap_dirn << " " <<
35 std::hex << std::setw(8) << std::setfill('0') << std::uppercase <<
36 e->swap_filen << " " << e->getMD5Text());
37
38 if (e->swap_status != SWAPOUT_WRITING && e->swap_status != SWAPOUT_DONE) {
39 debugs(20, DBG_IMPORTANT, "storeSwapInStart: bad swap_status (" << swapStatusStr[e->swap_status] << ")");
40 return;
41 }
42
43 if (e->swap_filen < 0) {
44 debugs(20, DBG_IMPORTANT, "storeSwapInStart: swap_filen < 0");
45 return;
46 }
47
48 assert(e->mem_obj != NULL);
49 debugs(20, 3, "storeSwapInStart: Opening fileno " << std::hex << std::setw(8) << std::setfill('0') << std::uppercase << e->swap_filen);
50 sc->swapin_sio = storeOpen(e, storeSwapInFileNotify, storeSwapInFileClosed, sc);
51 }
52
53 static void
54 storeSwapInFileClosed(void *data, int errflag, StoreIOState::Pointer)
55 {
56 store_client *sc = (store_client *)data;
57 debugs(20, 3, "storeSwapInFileClosed: sio=" << sc->swapin_sio.getRaw() << ", errflag=" << errflag);
58 sc->swapin_sio = NULL;
59
60 if (sc->_callback.pending()) {
61 assert (errflag <= 0);
62 sc->callback(0, errflag ? true : false);
63 }
64
65 ++statCounter.swap.ins;
66 }
67
68 static void
69 storeSwapInFileNotify(void *data, int, StoreIOState::Pointer)
70 {
71 store_client *sc = (store_client *)data;
72 StoreEntry *e = sc->entry;
73
74 debugs(1, 3, "storeSwapInFileNotify: changing " << e->swap_filen << "/" <<
75 e->swap_dirn << " to " << sc->swapin_sio->swap_filen << "/" <<
76 sc->swapin_sio->swap_dirn);
77
78 assert(e->swap_filen < 0); // if this fails, call SwapDir::disconnect(e)
79 e->swap_filen = sc->swapin_sio->swap_filen;
80 e->swap_dirn = sc->swapin_sio->swap_dirn;
81 }
82