2 * Copyright (C) 1996-2017 The Squid Software Foundation and contributors
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.
9 #ifndef SQUID_FS_ROCK_HEADER_UPDATER_H
10 #define SQUID_FS_ROCK_HEADER_UPDATER_H
12 #include "base/AsyncJob.h"
14 #include "fs/rock/forward.h"
15 #include "fs/rock/RockSwapDir.h"
16 #include "ipc/StoreMap.h"
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
28 CBDATA_CHILD(HeaderUpdater
);
31 HeaderUpdater(const Rock::SwapDir::Pointer
&aStore
, const Ipc::StoreMapUpdate
&update
);
32 virtual ~HeaderUpdater() override
= default;
36 virtual void start() override
;
37 virtual bool doneAll() const override
;
38 virtual void swanSong() override
;
41 static StoreIOState::STRCB NoteRead
;
42 static StoreIOState::STIOCB NoteDoneReading
;
43 static StoreIOState::STIOCB NoteDoneWriting
;
46 void stopReading(const char *why
);
47 void readMore(const char *why
);
48 void noteRead(ssize_t result
);
49 void noteDoneReading(int errflag
);
50 void parseReadBytes();
53 void noteDoneWriting(int errflag
);
55 Rock::SwapDir::Pointer store
; ///< cache_dir where the entry is stored
56 Ipc::StoreMapUpdate update
; ///< Ipc::StoreMap update reservation
58 StoreIOState::Pointer reader
; ///< reads old headers and old data
59 StoreIOState::Pointer writer
; ///< writes new headers and old data
61 SBuf readerBuffer
; ///< I/O buffer for a single read operation
62 SBuf exchangeBuffer
; ///< bytes read but not yet discarded or written
63 uint64_t bytesRead
; ///< total entry bytes read from Store so far
65 int staleSwapHeaderSize
; ///< stored size of the stale entry metadata
67 SlotId staleSplicingPointNext
; ///< non-updatable old HTTP body suffix start
72 #endif /* SQUID_FS_ROCK_HEADER_UPDATER_H */