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 ¶ms) 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