1 /*
2  * Copyright (C) 1996-2021 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 #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 {
28     CBDATA_CHILD(HeaderUpdater);
29 
30 public:
31     class IoCbParams {
32     public:
IoCbParams(const char * aBuf,ssize_t aSize)33         IoCbParams(const char *aBuf, ssize_t aSize) : buf(aBuf), size(aSize) {}
34         const char *buf;
35         ssize_t size;
36     };
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);
54     void noteRead(const IoCbParams result);
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 
76 inline
77 std::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 
83 } // namespace Rock
84 
85 #endif /* SQUID_FS_ROCK_HEADER_UPDATER_H */
86 
87