]>
Commit | Line | Data |
---|---|---|
51ee7c82 | 1 | /* |
b8ae064d | 2 | * Copyright (C) 1996-2023 The Squid Software Foundation and contributors |
51ee7c82 | 3 | * |
bbc27441 AJ |
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. | |
51ee7c82 | 7 | */ |
8 | ||
ff9d9458 FC |
9 | #ifndef SQUID_SRC_STORESWAPLOGDATA_H |
10 | #define SQUID_SRC_STORESWAPLOGDATA_H | |
51ee7c82 | 11 | |
63be0a78 | 12 | /** |
13 | \defgroup FileFormatSwapStateAPI swap.state File Structure | |
14 | \ingroup FileSystems | |
15 | \section ImplementationNotes Implementation Notes | |
16 | \par | |
17 | * When writing an object to disk, we must first write the meta data. | |
d448e1eb | 18 | * Store::PackSwapMeta() serializes that meta data |
63be0a78 | 19 | * into a character buffer that we can write. |
26ac0430 | 20 | * |
63be0a78 | 21 | \note MemObject has a MemObject::swap_hdr_sz. |
22 | * This value is the size of that character buffer; the size of the | |
23 | * swap file meta data. The StoreEntry has a member | |
24 | * StoreEntry::swap_file_sz that represents the size of the disk file. | |
25 | * Thus, the size of the object "content" is | |
26 | \code StoreEntry->swap_file_sz - MemObject->swap_hdr_sz; \endcode | |
27 | \note The swap file content includes the HTTP reply headers and the HTTP reply body (if any). | |
26ac0430 | 28 | * |
63be0a78 | 29 | \par |
d448e1eb EB |
30 | * When reading a swap file, Store::Unpack*SwapMeta*() functions iterate |
31 | * over stored swap meta data header fields and also extract | |
63be0a78 | 32 | * the value for MemObject->swap_hdr_sz. |
33 | */ | |
34 | ||
582c2af2 | 35 | #include "md5.h" |
ed6e9fb9 | 36 | #include "mem/forward.h" |
2745fea5 | 37 | #include "store/forward.h" |
51ee7c82 | 38 | |
786f6516 | 39 | /// maintains a 24-bit checksum over integer fields |
d178daf7 A |
40 | class SwapChecksum24 |
41 | { | |
786f6516 AR |
42 | public: |
43 | SwapChecksum24() { raw[0] = raw[1] = raw[2] = 0; } | |
44 | ||
d178daf7 | 45 | bool operator ==(const SwapChecksum24 &o) const { |
786f6516 AR |
46 | return raw[0] == o.raw[0] && raw[1] == o.raw[1] && raw[2] == o.raw[2]; |
47 | } | |
48 | ||
d178daf7 | 49 | bool operator !=(const SwapChecksum24 &o) const { |
786f6516 AR |
50 | return !(*this == o); |
51 | } | |
52 | ||
53 | /// compute and store checksum based on three 32bit integers | |
54 | void set(uint32_t f1, uint32_t f2, uint32_t f3); | |
55 | ||
56 | /// compute and store checksum based on int32_t and uint64_t integers | |
57 | void set(int32_t f1, uint64_t f2); | |
58 | ||
59 | // printing for debugging | |
60 | std::ostream &print(std::ostream &os) const; | |
61 | ||
62 | private: | |
2f8abb64 | 63 | uint8_t raw[3]; // designed to follow "op" members, in padding space |
786f6516 AR |
64 | }; |
65 | ||
66 | inline std::ostream & | |
67 | operator <<(std::ostream &os, const SwapChecksum24 &sum) | |
68 | { | |
69 | return sum.print(os); | |
70 | } | |
71 | ||
63be0a78 | 72 | /** |
73 | \ingroup FielFormatSwapStateAPI | |
63be0a78 | 74 | * |
75 | \par | |
786f6516 | 76 | * Defines the structure of a binary swap.state file entry for UFS stores. |
73656056 | 77 | * TODO: Move to fs/ufs |
63be0a78 | 78 | * |
79 | \note StoreSwapLogData entries are written in native machine byte order | |
80 | * They are not necessarily portable across architectures. | |
51ee7c82 | 81 | */ |
51ee7c82 | 82 | class StoreSwapLogData |
83 | { | |
b001e822 | 84 | MEMPROXY_CLASS(StoreSwapLogData); |
786f6516 | 85 | |
741c2986 | 86 | public: |
786f6516 AR |
87 | /// type to use for storing time-related members; must be signed |
88 | typedef int64_t SwappedTime; | |
89 | ||
3f9d4dc2 AR |
90 | /// consistency self-check: whether the data appears to make sense |
91 | bool sane() const; | |
92 | ||
786f6516 AR |
93 | /// call this before storing the log entry |
94 | void finalize(); | |
95 | ||
63be0a78 | 96 | /** |
97 | * Either SWAP_LOG_ADD when an object is added to the disk storage, | |
98 | * or SWAP_LOG_DEL when an object is deleted. | |
99 | */ | |
4f3c41b3 | 100 | uint8_t op = 0; |
786f6516 AR |
101 | |
102 | /** | |
103 | * Fingerprint to weed out bogus/corrupted swap.state entries. | |
104 | */ | |
105 | SwapChecksum24 checksum; // follows "op" because compiler will pad anyway | |
63be0a78 | 106 | |
107 | /** | |
108 | * The 32-bit file number which maps to a pathname. | |
109 | * Only the low 24-bits are relevant. The high 8-bits are | |
110 | * used as an index to an array of storage directories, and | |
111 | * are set at run time because the order of storage directories | |
112 | * may change over time. | |
113 | */ | |
4f3c41b3 | 114 | sfileno swap_filen = 0; |
63be0a78 | 115 | |
116 | /** | |
786f6516 | 117 | * A Unix time value that represents the time when |
63be0a78 | 118 | * the origin server generated this response. If the response |
119 | * has a valid Date: header, this timestamp corresponds | |
120 | * to that time. Otherwise, it is set to the Squid process time | |
121 | * when the response is read (as soon as the end of headers are found). | |
122 | */ | |
4f3c41b3 | 123 | SwappedTime timestamp = 0; |
63be0a78 | 124 | |
125 | /** | |
126 | * The last time that a client requested this object. | |
63be0a78 | 127 | */ |
4f3c41b3 | 128 | SwappedTime lastref = 0; |
63be0a78 | 129 | |
130 | /** | |
131 | * The value of the response's Expires: header, if any. | |
132 | * If the response does not have an Expires: header, this | |
133 | * is set to -1. | |
2f8abb64 | 134 | * If the response has an invalid (unparsable) |
63be0a78 | 135 | * Expires: header, it is also set to -1. There are some cases |
136 | * where Squid sets expires to -2. This happens for the | |
137 | * internal "netdb" object and for FTP URL responses. | |
138 | */ | |
4f3c41b3 | 139 | SwappedTime expires = 0; |
63be0a78 | 140 | |
141 | /** | |
142 | * The value of the response's Last-modified: header, if any. | |
143 | * This is set to -1 if there is no Last-modified: header, | |
2f8abb64 | 144 | * or if it is unparsable. |
63be0a78 | 145 | */ |
4f3c41b3 | 146 | SwappedTime lastmod = 0; |
63be0a78 | 147 | |
148 | /** | |
149 | * This is the number of bytes that the object occupies on | |
150 | * disk. It includes the Squid "swap file header". | |
151 | */ | |
4f3c41b3 | 152 | uint64_t swap_file_sz = 0; |
63be0a78 | 153 | |
154 | /** | |
155 | * The number of times that this object has been accessed (referenced). | |
156 | * Since its a 16-bit quantity, it is susceptible to overflow | |
157 | * if a single object is accessed 65,536 times before being replaced. | |
158 | */ | |
f45dd259 | 159 | uint16_t refcount; |
63be0a78 | 160 | |
161 | /** | |
162 | * A copy of the StoreEntry flags field. Used as a sanity | |
163 | * check when rebuilding the cache at startup. Objects that | |
164 | * have the KEY_PRIVATE flag set are not added back to the cache. | |
165 | */ | |
4f3c41b3 | 166 | uint16_t flags = 0; |
63be0a78 | 167 | |
168 | /** | |
169 | * The 128-bit MD5 hash for this object. | |
170 | */ | |
4f3c41b3 | 171 | unsigned char key[SQUID_MD5_DIGEST_LENGTH] = {}; |
51ee7c82 | 172 | }; |
173 | ||
63be0a78 | 174 | /// \ingroup FileFormatSwapStateAPI |
786f6516 | 175 | /// Swap log starts with this binary structure. |
47f6e231 | 176 | class StoreSwapLogHeader |
177 | { | |
178 | public: | |
786f6516 | 179 | // sets default values for this Squid version; loaded values may differ |
26ac0430 | 180 | StoreSwapLogHeader(); |
786f6516 AR |
181 | |
182 | /// consistency self-check: whether the data appears to make sense | |
183 | bool sane() const; | |
184 | ||
185 | /// number of bytes after the log header before the first log entry | |
186 | size_t gapSize() const; | |
187 | ||
188 | uint8_t op; | |
189 | SwapChecksum24 checksum; // follows "op" because compiler will pad anyway | |
190 | int32_t version; | |
191 | int32_t record_size; | |
47f6e231 | 192 | }; |
193 | ||
ff9d9458 | 194 | #endif /* SQUID_SRC_STORESWAPLOGDATA_H */ |
f53969cc | 195 |