]>
Commit | Line | Data |
---|---|---|
51ee7c82 | 1 | /* |
bbc27441 | 2 | * Copyright (C) 1996-2014 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 FC |
38 | #include "md5.h" |
39 | #include "MemPool.h" | |
40 | #include "typedefs.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: | |
66 | uint8_t raw[3]; // designed to follow "op" members, in pading space | |
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 | { | |
87 | ||
88 | public: | |
b001e822 | 89 | MEMPROXY_CLASS(StoreSwapLogData); |
786f6516 AR |
90 | |
91 | /// type to use for storing time-related members; must be signed | |
92 | typedef int64_t SwappedTime; | |
93 | ||
51ee7c82 | 94 | StoreSwapLogData(); |
63be0a78 | 95 | |
3f9d4dc2 AR |
96 | /// consistency self-check: whether the data appears to make sense |
97 | bool sane() const; | |
98 | ||
786f6516 AR |
99 | /// call this before storing the log entry |
100 | void finalize(); | |
101 | ||
63be0a78 | 102 | /** |
103 | * Either SWAP_LOG_ADD when an object is added to the disk storage, | |
104 | * or SWAP_LOG_DEL when an object is deleted. | |
105 | */ | |
786f6516 AR |
106 | uint8_t op; |
107 | ||
108 | /** | |
109 | * Fingerprint to weed out bogus/corrupted swap.state entries. | |
110 | */ | |
111 | SwapChecksum24 checksum; // follows "op" because compiler will pad anyway | |
63be0a78 | 112 | |
113 | /** | |
114 | * The 32-bit file number which maps to a pathname. | |
115 | * Only the low 24-bits are relevant. The high 8-bits are | |
116 | * used as an index to an array of storage directories, and | |
117 | * are set at run time because the order of storage directories | |
118 | * may change over time. | |
119 | */ | |
51ee7c82 | 120 | sfileno swap_filen; |
63be0a78 | 121 | |
122 | /** | |
786f6516 | 123 | * A Unix time value that represents the time when |
63be0a78 | 124 | * the origin server generated this response. If the response |
125 | * has a valid Date: header, this timestamp corresponds | |
126 | * to that time. Otherwise, it is set to the Squid process time | |
127 | * when the response is read (as soon as the end of headers are found). | |
128 | */ | |
786f6516 | 129 | SwappedTime timestamp; |
63be0a78 | 130 | |
131 | /** | |
132 | * The last time that a client requested this object. | |
63be0a78 | 133 | */ |
786f6516 | 134 | SwappedTime lastref; |
63be0a78 | 135 | |
136 | /** | |
137 | * The value of the response's Expires: header, if any. | |
138 | * If the response does not have an Expires: header, this | |
139 | * is set to -1. | |
140 | * If the response has an invalid (unparseable) | |
141 | * Expires: header, it is also set to -1. There are some cases | |
142 | * where Squid sets expires to -2. This happens for the | |
143 | * internal "netdb" object and for FTP URL responses. | |
144 | */ | |
786f6516 | 145 | SwappedTime expires; |
63be0a78 | 146 | |
147 | /** | |
148 | * The value of the response's Last-modified: header, if any. | |
149 | * This is set to -1 if there is no Last-modified: header, | |
150 | * or if it is unparseable. | |
151 | */ | |
786f6516 | 152 | SwappedTime lastmod; |
63be0a78 | 153 | |
154 | /** | |
155 | * This is the number of bytes that the object occupies on | |
156 | * disk. It includes the Squid "swap file header". | |
157 | */ | |
47f6e231 | 158 | uint64_t swap_file_sz; |
63be0a78 | 159 | |
160 | /** | |
161 | * The number of times that this object has been accessed (referenced). | |
162 | * Since its a 16-bit quantity, it is susceptible to overflow | |
163 | * if a single object is accessed 65,536 times before being replaced. | |
164 | */ | |
f45dd259 | 165 | uint16_t refcount; |
63be0a78 | 166 | |
167 | /** | |
168 | * A copy of the StoreEntry flags field. Used as a sanity | |
169 | * check when rebuilding the cache at startup. Objects that | |
170 | * have the KEY_PRIVATE flag set are not added back to the cache. | |
171 | */ | |
f45dd259 | 172 | uint16_t flags; |
63be0a78 | 173 | |
174 | /** | |
175 | * The 128-bit MD5 hash for this object. | |
176 | */ | |
c3031d67 | 177 | unsigned char key[SQUID_MD5_DIGEST_LENGTH]; |
51ee7c82 | 178 | }; |
179 | ||
d85b8894 | 180 | MEMPROXY_CLASS_INLINE(StoreSwapLogData); |
b001e822 | 181 | |
63be0a78 | 182 | /// \ingroup FileFormatSwapStateAPI |
786f6516 | 183 | /// Swap log starts with this binary structure. |
47f6e231 | 184 | class StoreSwapLogHeader |
185 | { | |
186 | public: | |
786f6516 | 187 | // sets default values for this Squid version; loaded values may differ |
26ac0430 | 188 | StoreSwapLogHeader(); |
786f6516 AR |
189 | |
190 | /// consistency self-check: whether the data appears to make sense | |
191 | bool sane() const; | |
192 | ||
193 | /// number of bytes after the log header before the first log entry | |
194 | size_t gapSize() const; | |
195 | ||
196 | uint8_t op; | |
197 | SwapChecksum24 checksum; // follows "op" because compiler will pad anyway | |
198 | int32_t version; | |
199 | int32_t record_size; | |
47f6e231 | 200 | }; |
201 | ||
51ee7c82 | 202 | #endif /* SQUID_STORESWAPLOGDATA_H */ |