1 /* 2 * Copyright (C) 1996-2021 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_STORE_DISKS_H 10 #define SQUID_STORE_DISKS_H 11 12 #include "store/Controlled.h" 13 #include "store/forward.h" 14 15 namespace Store { 16 17 /// summary view of all disk caches (cache_dirs) combined 18 class Disks: public Controlled 19 { 20 public: 21 Disks(); 22 23 /* Storage API */ 24 virtual void create() override; 25 virtual void init() override; 26 virtual StoreEntry *get(const cache_key *) override; 27 virtual uint64_t maxSize() const override; 28 virtual uint64_t minSize() const override; 29 virtual uint64_t currentSize() const override; 30 virtual uint64_t currentCount() const override; 31 virtual int64_t maxObjectSize() const override; 32 virtual void getStats(StoreInfoStats &stats) const override; 33 virtual void stat(StoreEntry &) const override; 34 virtual void sync() override; 35 virtual void reference(StoreEntry &) override; 36 virtual bool dereference(StoreEntry &e) override; 37 virtual void updateHeaders(StoreEntry *) override; 38 virtual void maintain() override; 39 virtual bool anchorToCache(StoreEntry &e, bool &inSync) override; 40 virtual bool updateAnchored(StoreEntry &) override; 41 virtual void evictCached(StoreEntry &) override; 42 virtual void evictIfFound(const cache_key *) override; 43 virtual int callback() override; 44 45 /// slowly calculate (and cache) hi/lo watermarks and similar limits 46 void updateLimits(); 47 48 /// Additional unknown-size entry bytes required by disks in order to 49 /// reduce the risk of selecting the wrong disk cache for the growing entry. 50 int64_t accumulateMore(const StoreEntry&) const; 51 virtual bool smpAware() const override; 52 /// whether any of disk caches has entry with e.key 53 bool hasReadableEntry(const StoreEntry &) const; 54 55 private: 56 /* migration logic */ 57 SwapDir *store(int const x) const; 58 SwapDir &dir(int const idx) const; 59 60 int64_t largestMinimumObjectSize; ///< maximum of all Disk::minObjectSize()s 61 int64_t largestMaximumObjectSize; ///< maximum of all Disk::maxObjectSize()s 62 int64_t secondLargestMaximumObjectSize; ///< the second-biggest Disk::maxObjectSize() 63 }; 64 65 } // namespace Store 66 67 /* Store::Disks globals that should be converted to use RegisteredRunner */ 68 void storeDirOpenSwapLogs(void); 69 int storeDirWriteCleanLogs(int reopen); 70 void storeDirCloseSwapLogs(void); 71 72 /* Globals that should be converted to static Store::Disks methods */ 73 void allocate_new_swapdir(Store::DiskConfig *swap); 74 void free_cachedir(Store::DiskConfig *swap); 75 76 /* Globals that should be converted to Store::Disks private data members */ 77 typedef int STDIRSELECT(const StoreEntry *e); 78 extern STDIRSELECT *storeDirSelectSwapDir; 79 80 /* Globals that should be moved to some Store::UFS-specific logging module */ 81 void storeDirSwapLog(const StoreEntry *e, int op); 82 83 #endif /* SQUID_STORE_DISKS_H */ 84 85