]>
Commit | Line | Data |
---|---|---|
abf396ec | 1 | /* |
f70aedc4 | 2 | * Copyright (C) 1996-2021 The Squid Software Foundation and contributors |
abf396ec AR |
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 | #ifndef SQUID_FS_ROCK_HEADER_UPDATER_H | |
10 | #define SQUID_FS_ROCK_HEADER_UPDATER_H | |
11 | ||
12 | #include "base/AsyncJob.h" | |
13 | #include "cbdata.h" | |
14 | #include "fs/rock/forward.h" | |
15 | #include "fs/rock/RockSwapDir.h" | |
16 | #include "ipc/StoreMap.h" | |
17 | ||
18 | namespace Rock | |
19 | { | |
20 | ||
21 | /// Updates HTTP headers of a single Rock store entry: | |
22 | /// * reads old body data in the same slot as the last old headers slot, if any | |
23 | /// * writes new headers (1+ slots) | |
24 | /// * writes old data (0-2 slots) | |
25 | /// * chains the new entry prefix (1+ slots) to the old entry suffix (0+ slots) | |
26 | class HeaderUpdater: public AsyncJob | |
27 | { | |
1625e4a1 | 28 | CBDATA_CHILD(HeaderUpdater); |
abf396ec AR |
29 | |
30 | public: | |
672337d1 CT |
31 | class IoCbParams { |
32 | public: | |
33 | IoCbParams(const char *aBuf, ssize_t aSize) : buf(aBuf), size(aSize) {} | |
34 | const char *buf; | |
35 | ssize_t size; | |
36 | }; | |
abf396ec AR |
37 | HeaderUpdater(const Rock::SwapDir::Pointer &aStore, const Ipc::StoreMapUpdate &update); |
38 | virtual ~HeaderUpdater() override = default; | |
39 | ||
40 | protected: | |
41 | /* AsyncJob API */ | |
42 | virtual void start() override; | |
43 | virtual bool doneAll() const override; | |
44 | virtual void swanSong() override; | |
45 | ||
46 | private: | |
47 | static StoreIOState::STRCB NoteRead; | |
48 | static StoreIOState::STIOCB NoteDoneReading; | |
49 | static StoreIOState::STIOCB NoteDoneWriting; | |
50 | ||
51 | void startReading(); | |
52 | void stopReading(const char *why); | |
53 | void readMore(const char *why); | |
672337d1 | 54 | void noteRead(const IoCbParams result); |
abf396ec AR |
55 | void noteDoneReading(int errflag); |
56 | void parseReadBytes(); | |
57 | ||
58 | void startWriting(); | |
59 | void noteDoneWriting(int errflag); | |
60 | ||
61 | Rock::SwapDir::Pointer store; ///< cache_dir where the entry is stored | |
62 | Ipc::StoreMapUpdate update; ///< Ipc::StoreMap update reservation | |
63 | ||
64 | StoreIOState::Pointer reader; ///< reads old headers and old data | |
65 | StoreIOState::Pointer writer; ///< writes new headers and old data | |
66 | ||
67 | SBuf readerBuffer; ///< I/O buffer for a single read operation | |
68 | SBuf exchangeBuffer; ///< bytes read but not yet discarded or written | |
69 | uint64_t bytesRead; ///< total entry bytes read from Store so far | |
70 | ||
71 | int staleSwapHeaderSize; ///< stored size of the stale entry metadata | |
72 | ||
73 | SlotId staleSplicingPointNext; ///< non-updatable old HTTP body suffix start | |
74 | }; | |
75 | ||
672337d1 CT |
76 | inline |
77 | std::ostream &operator <<(std::ostream &os, const HeaderUpdater::IoCbParams ¶ms) | |
78 | { | |
79 | os << static_cast<const void *>(params.buf) << "," << params.size; | |
80 | return os; | |
81 | } | |
82 | ||
abf396ec AR |
83 | } // namespace Rock |
84 | ||
85 | #endif /* SQUID_FS_ROCK_HEADER_UPDATER_H */ | |
86 |