]> git.ipfire.org Git - thirdparty/squid.git/blame - src/fs/rock/RockRebuild.h
Bug 5428: Warn if pkg-config is not found (#1902)
[thirdparty/squid.git] / src / fs / rock / RockRebuild.h
CommitLineData
bbc27441 1/*
b8ae064d 2 * Copyright (C) 1996-2023 The Squid Software Foundation and contributors
bbc27441
AJ
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
ff9d9458
FC
9#ifndef SQUID_SRC_FS_ROCK_ROCKREBUILD_H
10#define SQUID_SRC_FS_ROCK_ROCKREBUILD_H
e2851fe7 11
078274f6 12#include "base/AsyncJob.h"
8ecbe78d 13#include "base/RunnersRegistry.h"
211e9ce2 14#include "cbdata.h"
aac0df40 15#include "fs/rock/forward.h"
8ecbe78d
EB
16#include "ipc/mem/Pointer.h"
17#include "ipc/StoreMap.h"
50dc81ec 18#include "MemBuf.h"
211e9ce2 19#include "store_rebuild.h"
e2851fe7 20
9199139f
AR
21namespace Rock
22{
e2851fe7 23
50dc81ec 24class LoadingEntry;
abf396ec
AR
25class LoadingSlot;
26class LoadingParts;
e2851fe7
AR
27
28/// \ingroup Rock
29/// manages store rebuild process: loading meta information from db on disk
8ecbe78d 30class Rebuild: public AsyncJob, private IndependentRunner
9199139f 31{
d836b06f 32 CBDATA_CHILD(Rebuild);
5c2f68b7 33
e2851fe7 34public:
8ecbe78d
EB
35 /// cache_dir indexing statistics shared across same-kid process restarts
36 class Stats
37 {
38 public:
39 static SBuf Path(const char *dirPath);
40 static Ipc::Mem::Owner<Stats> *Init(const SwapDir &);
41
42 static size_t SharedMemorySize() { return sizeof(Stats); }
43 size_t sharedMemorySize() const { return SharedMemorySize(); }
44
45 /// whether the rebuild is finished already
46 bool completed(const SwapDir &) const;
47
48 StoreRebuildData counts;
49 };
50
51 /// starts indexing the given cache_dir if that indexing is necessary
52 /// \returns whether the indexing was necessary (and, hence, started)
53 static bool Start(SwapDir &dir);
e2851fe7 54
63d73bab
EB
55 /* AsyncJob API */
56 virtual void callException(const std::exception &) override;
57
078274f6 58protected:
8b082ed9 59 /// whether the current kid is responsible for rebuilding the given cache_dir
8ecbe78d
EB
60 static bool IsResponsible(const SwapDir &);
61
62 Rebuild(SwapDir *dir, const Ipc::Mem::Pointer<Stats> &);
337b9aa4 63 ~Rebuild() override;
8ecbe78d
EB
64
65 /* Registered Runner API */
337b9aa4 66 void startShutdown() override;
8ecbe78d 67
078274f6 68 /* AsyncJob API */
337b9aa4
AR
69 void start() override;
70 bool doneAll() const override;
71 void swanSong() override;
e2851fe7 72
abf396ec
AR
73 bool doneLoading() const;
74 bool doneValidating() const;
75
078274f6 76private:
e2851fe7
AR
77 void checkpoint();
78 void steps();
50dc81ec
AR
79 void loadingSteps();
80 void validationSteps();
81 void loadOneSlot();
abf396ec
AR
82 void validateOneEntry(const sfileno fileNo);
83 void validateOneSlot(const SlotId slotId);
50dc81ec
AR
84 bool importEntry(Ipc::StoreMapAnchor &anchor, const sfileno slotId, const DbCellHeader &header);
85 void freeBadEntry(const sfileno fileno, const char *eDescription);
86
e2851fe7 87 void failure(const char *msg, int errNo = 0);
50dc81ec 88
abf396ec 89 LoadingEntry loadingEntry(const sfileno fileNo);
50dc81ec
AR
90 void startNewEntry(const sfileno fileno, const SlotId slotId, const DbCellHeader &header);
91 void primeNewEntry(Ipc::StoreMapAnchor &anchor, const sfileno fileno, const DbCellHeader &header);
abf396ec
AR
92 void finalizeOrFree(const sfileno fileNo, LoadingEntry &le);
93 void finalizeOrThrow(const sfileno fileNo, LoadingEntry &le);
50dc81ec
AR
94 void addSlotToEntry(const sfileno fileno, const SlotId slotId, const DbCellHeader &header);
95 void useNewSlot(const SlotId slotId, const DbCellHeader &header);
96
abf396ec 97 LoadingSlot loadingSlot(const SlotId slotId);
50dc81ec 98 void mapSlot(const SlotId slotId, const DbCellHeader &header);
abf396ec 99 void freeUnusedSlot(const SlotId slotId, const bool invalid);
50dc81ec
AR
100 void freeSlot(const SlotId slotId, const bool invalid);
101
abf396ec
AR
102 template <class SlotIdType>
103 void chainSlots(SlotIdType &from, const SlotId to);
104
50dc81ec
AR
105 bool sameEntry(const sfileno fileno, const DbCellHeader &header) const;
106
8ecbe78d
EB
107 SBuf progressDescription() const;
108
e2851fe7 109 SwapDir *sd;
abf396ec 110 LoadingParts *parts; ///< parts of store entries being loaded from disk
e2851fe7 111
8ecbe78d
EB
112 Ipc::Mem::Pointer<Stats> stats; ///< indexing statistics in shared memory
113
e2851fe7 114 int64_t dbSize;
36c84e19 115 int dbSlotSize; ///< the size of a db cell, including the cell header
8ecbe78d
EB
116 int64_t dbSlotLimit; ///< total number of db cells
117 int64_t dbEntryLimit; ///< maximum number of entries that can be stored in db
e2851fe7
AR
118
119 int fd; // store db file descriptor
8ecbe78d
EB
120 int64_t dbOffset; // TODO: calculate in a method, using loadingPos
121 int64_t loadingPos; ///< index of the db slot being loaded from disk now
122 int64_t validationPos; ///< index of the loaded db slot being validated now
6d68a230 123 MemBuf buf; ///< space to load current db slot (and entry metadata) into
93910d5c 124
8ecbe78d
EB
125 StoreRebuildData &counts; ///< a reference to the shared memory counters
126
127 /// whether we have started indexing this cache_dir before,
128 /// presumably in the previous process performing the same-kid role
129 const bool resuming;
e2851fe7
AR
130
131 static void Steps(void *data);
132};
133
134} // namespace Rock
135
ff9d9458 136#endif /* SQUID_SRC_FS_ROCK_ROCKREBUILD_H */
f53969cc 137