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