]> git.ipfire.org Git - thirdparty/squid.git/blob - src/fs/rock/RockRebuild.h
SourceFormat Enforcement
[thirdparty/squid.git] / src / fs / rock / RockRebuild.h
1 /*
2 * Copyright (C) 1996-2017 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 #ifndef SQUID_FS_ROCK_REBUILD_H
10 #define SQUID_FS_ROCK_REBUILD_H
11
12 #include "base/AsyncJob.h"
13 #include "cbdata.h"
14 #include "fs/rock/forward.h"
15 #include "MemBuf.h"
16 #include "store_rebuild.h"
17
18 namespace Rock
19 {
20
21 class LoadingEntry;
22 class LoadingSlot;
23 class LoadingParts;
24
25 /// \ingroup Rock
26 /// manages store rebuild process: loading meta information from db on disk
27 class Rebuild: public AsyncJob
28 {
29 CBDATA_CHILD(Rebuild);
30
31 public:
32 Rebuild(SwapDir *dir);
33 virtual ~Rebuild() override;
34
35 protected:
36 /* AsyncJob API */
37 virtual void start() override;
38 virtual bool doneAll() const override;
39 virtual void swanSong() override;
40
41 bool doneLoading() const;
42 bool doneValidating() const;
43
44 private:
45 void checkpoint();
46 void steps();
47 void loadingSteps();
48 void validationSteps();
49 void loadOneSlot();
50 void validateOneEntry(const sfileno fileNo);
51 void validateOneSlot(const SlotId slotId);
52 bool importEntry(Ipc::StoreMapAnchor &anchor, const sfileno slotId, const DbCellHeader &header);
53 void freeBadEntry(const sfileno fileno, const char *eDescription);
54
55 void failure(const char *msg, int errNo = 0);
56
57 LoadingEntry loadingEntry(const sfileno fileNo);
58 void startNewEntry(const sfileno fileno, const SlotId slotId, const DbCellHeader &header);
59 void primeNewEntry(Ipc::StoreMapAnchor &anchor, const sfileno fileno, const DbCellHeader &header);
60 void finalizeOrFree(const sfileno fileNo, LoadingEntry &le);
61 void finalizeOrThrow(const sfileno fileNo, LoadingEntry &le);
62 void addSlotToEntry(const sfileno fileno, const SlotId slotId, const DbCellHeader &header);
63 void useNewSlot(const SlotId slotId, const DbCellHeader &header);
64
65 LoadingSlot loadingSlot(const SlotId slotId);
66 void mapSlot(const SlotId slotId, const DbCellHeader &header);
67 void freeUnusedSlot(const SlotId slotId, const bool invalid);
68 void freeSlot(const SlotId slotId, const bool invalid);
69
70 template <class SlotIdType>
71 void chainSlots(SlotIdType &from, const SlotId to);
72
73 bool sameEntry(const sfileno fileno, const DbCellHeader &header) const;
74
75 SwapDir *sd;
76 LoadingParts *parts; ///< parts of store entries being loaded from disk
77
78 int64_t dbSize;
79 int dbSlotSize; ///< the size of a db cell, including the cell header
80 int dbSlotLimit; ///< total number of db cells
81 int dbEntryLimit; ///< maximum number of entries that can be stored in db
82
83 int fd; // store db file descriptor
84 int64_t dbOffset;
85 sfileno loadingPos; ///< index of the db slot being loaded from disk now
86 sfileno validationPos; ///< index of the loaded db slot being validated now
87 MemBuf buf; ///< space to load current db slot (and entry metadata) into
88
89 StoreRebuildData counts;
90
91 static void Steps(void *data);
92 };
93
94 } // namespace Rock
95
96 #endif /* SQUID_FS_ROCK_REBUILD_H */
97