]> git.ipfire.org Git - thirdparty/squid.git/blame - src/fs/rock/RockHeaderUpdater.h
Source Format Enforcement (#763)
[thirdparty/squid.git] / src / fs / rock / RockHeaderUpdater.h
CommitLineData
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
18namespace 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)
26class HeaderUpdater: public AsyncJob
27{
1625e4a1 28 CBDATA_CHILD(HeaderUpdater);
abf396ec
AR
29
30public:
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
40protected:
41 /* AsyncJob API */
42 virtual void start() override;
43 virtual bool doneAll() const override;
44 virtual void swanSong() override;
45
46private:
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
76inline
77std::ostream &operator <<(std::ostream &os, const HeaderUpdater::IoCbParams &params)
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