StoreSwapLogData.cc
Go to the documentation of this file.
1/*
2 * Copyright (C) 1996-2023 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/* DEBUG: section 47 Store Directory Routines */
10
11#include "squid.h"
12#include "StoreSwapLogData.h"
13#include "swap_log_op.h"
14
15#include <ostream>
16
17// Based on Internet Checksum (RFC 1071) algorithm but takes three 32bit ints.
18// TODO: Consider Fletcher's checksum algorithm as a higher quality alternative
19void
20SwapChecksum24::set(uint32_t f1, uint32_t f2, uint32_t f3)
21{
22 uint64_t sum = f1;
23 sum += f2;
24 sum += f3;
25
26 while (const uint64_t higherBits = sum >> 24)
27 sum = (sum & 0xFFFFFF) + higherBits;
28
29 sum = ~sum;
30
31 raw[0] = static_cast<uint8_t>(sum);
32 raw[1] = static_cast<uint8_t>(sum >> 8);
33 raw[2] = static_cast<uint8_t>(sum >> 16);
34}
35
37void
38SwapChecksum24::set(int32_t f1, uint64_t f2)
39{
40 // split the second 64bit word into two 32bit words
41 set(static_cast<uint32_t>(f1),
42 static_cast<uint32_t>(f2 >> 32),
43 static_cast<uint32_t>(f2 & 0xFFFFFFFF));
44}
45
46std::ostream &
47SwapChecksum24::print(std::ostream &os) const
48{
49 return os << raw[0] << '-' << raw[1] << '-' << raw[2];
50}
51
52bool
54{
55 SwapChecksum24 actualSum;
56 actualSum.set(swap_filen, swap_file_sz);
57 if (checksum != actualSum)
58 return false;
59
60 const time_t minTime = -2; // -1 is common; expires sometimes uses -2
61
62 // Check what we safely can; for some fields any value might be valid
63 return SWAP_LOG_NOP < op && op < SWAP_LOG_MAX &&
64 swap_filen >= 0 &&
65 timestamp >= minTime &&
66 lastref >= minTime &&
67 expires >= minTime &&
68 lastmod >= minTime &&
69 swap_file_sz > 0; // because swap headers ought to consume space
70}
71
72void
74{
76}
77
79 record_size(sizeof(StoreSwapLogData))
80{
82}
83
84bool
86{
87 SwapChecksum24 actualSum;
88 actualSum.set(version, record_size, 0);
89 if (checksum != actualSum)
90 return false;
91
92 return op == SWAP_LOG_VERSION && version >= 2 && record_size > 0;
93}
94
95size_t
97{
99 assert(static_cast<size_t>(record_size) > sizeof(*this));
100 return static_cast<size_t>(record_size) - sizeof(*this);
101}
102
#define assert(EX)
Definition: assert.h:17
static int version
SwappedTime timestamp
bool sane() const
consistency self-check: whether the data appears to make sense
void finalize()
call this before storing the log entry
SwapChecksum24 checksum
size_t gapSize() const
number of bytes after the log header before the first log entry
bool sane() const
consistency self-check: whether the data appears to make sense
SwapChecksum24 checksum
maintains a 24-bit checksum over integer fields
void set(uint32_t f1, uint32_t f2, uint32_t f3)
compute and store checksum based on three 32bit integers
std::ostream & print(std::ostream &os) const
@ SWAP_LOG_MAX
Definition: swap_log_op.h:17
@ SWAP_LOG_NOP
Definition: swap_log_op.h:13
@ SWAP_LOG_VERSION
Definition: swap_log_op.h:16

 

Introduction

Documentation

Support

Miscellaneous

Web Site Translations

Mirrors