summaryrefslogtreecommitdiff
path: root/indra/llfilesystem/lldiskcache.h
diff options
context:
space:
mode:
authorAndrey Lihatskiy <alihatskiy@productengine.com>2021-03-09 21:59:04 +0200
committerAndrey Lihatskiy <alihatskiy@productengine.com>2021-03-09 21:59:04 +0200
commit28d4ac1cdc8e21460152e70ee347ca22b9caaf9a (patch)
tree75eee84887a34d962226b3512489d6169aca3c0d /indra/llfilesystem/lldiskcache.h
parent367be4d1888dd0b60100350b2190bbee93d5ac9e (diff)
parent88d837c16e768c5262073a7df965066d4bd8842c (diff)
Merge branch 'master' into DRTVWR-486
Diffstat (limited to 'indra/llfilesystem/lldiskcache.h')
-rw-r--r--indra/llfilesystem/lldiskcache.h183
1 files changed, 0 insertions, 183 deletions
diff --git a/indra/llfilesystem/lldiskcache.h b/indra/llfilesystem/lldiskcache.h
deleted file mode 100644
index 997884da31..0000000000
--- a/indra/llfilesystem/lldiskcache.h
+++ /dev/null
@@ -1,183 +0,0 @@
-/**
- * @file lldiskcache.h
- * @brief The disk cache implementation declarations.
- *
- * @Description:
- * This code implements a disk cache using the following ideas:
- * 1/ The metadata for a file can be encapsulated in the filename.
- The filenames will be composed of the following fields:
- Prefix: Used to identify the file as a part of the cache.
- An additional reason for using a prefix is that it
- might be possible, either accidentally or maliciously
- to end up with the cache dir set to a non-cache
- location such as your OS system dir or a work folder.
- Purging files from that would obviously be a disaster
- so this is an extra step to help avoid that scenario.
- ID: Typically the asset ID (UUID) of the asset being
- saved but can be anything valid for a filename
- Extra Info: A field for use in the future that can be used
- to store extra identifiers - e.g. the discard
- level of a JPEG2000 file
- Asset Type: A text string created from the LLAssetType enum
- that identifies the type of asset being stored.
- .asset A file extension of .asset is used to help
- identify this as a Viewer asset file
- * 2/ The time of last access for a file can be updated instantly
- * for file reads and automatically as part of the file writes.
- * 3/ The purge algorithm collects a list of all files in the
- * directory, sorts them by date of last access (write) and then
- * deletes any files based on age until the total size of all
- * the files is less than the maximum size specified.
- * 4/ An LLSingleton idiom is used since there will only ever be
- * a single cache and we want to access it from numerous places.
- * 5/ Performance on my modest system seems very acceptable. For
- * example, in testing, I was able to purge a directory of
- * 10,000 files, deleting about half of them in ~ 1700ms. For
- * the same sized directory of files, writing the last updated
- * time to each took less than 600ms indicating that this
- * important part of the mechanism has almost no overhead.
- *
- * $LicenseInfo:firstyear=2009&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2020, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#ifndef _LLDISKCACHE
-#define _LLDISKCACHE
-
-#include "llsingleton.h"
-
-class LLDiskCache :
- public LLParamSingleton<LLDiskCache>
-{
- public:
- /**
- * Since this is using the LLSingleton pattern but we
- * want to allow the constructor to be called first
- * with various parameters, we also invoke the
- * LLParamSingleton idiom and use it to initialize
- * the class via a call in LLAppViewer.
- */
- LLSINGLETON(LLDiskCache,
- /**
- * The full name of the cache folder - typically a
- * a child of the main Viewer cache directory. Defined
- * by the setting at 'DiskCacheDirName'
- */
- const std::string cache_dir,
- /**
- * The maximum size of the cache in bytes - Based on the
- * setting at 'CacheSize' and 'DiskCachePercentOfTotal'
- */
- const int max_size_bytes,
- /**
- * A flag that enables extra cache debugging so that
- * if there are bugs, we can ask uses to enable this
- * setting and send us their logs
- */
- const bool enable_cache_debug_info);
-
- virtual ~LLDiskCache() = default;
-
- public:
- /**
- * Construct a filename and path to it based on the file meta data
- * (id, asset type, additional 'extra' info like discard level perhaps)
- * Worth pointing out that this function used to be in LLFileSystem but
- * so many things had to be pushed back there to accomodate it, that I
- * decided to move it here. Still not sure that's completely right.
- */
- const std::string metaDataToFilepath(const std::string id,
- LLAssetType::EType at,
- const std::string extra_info);
-
- /**
- * Update the "last write time" of a file to "now". This must be called whenever a
- * file in the cache is read (not written) so that the last time the file was
- * accessed is up to date (This is used in the mechanism for purging the cache)
- */
- void updateFileAccessTime(const std::string file_path);
-
- /**
- * Purge the oldest items in the cache so that the combined size of all files
- * is no bigger than mMaxSizeBytes.
- */
- void purge();
-
- /**
- * Clear the cache by removing all the files in the specified cache
- * directory individually. Only the files that contain a prefix defined
- * by mCacheFilenamePrefix will be removed.
- */
- void clearCache();
-
- /**
- * Return some information about the cache for use in About Box etc.
- */
- const std::string getCacheInfo();
-
- private:
- /**
- * Utility function to gather the total size the files in a given
- * directory. Primarily used here to determine the directory size
- * before and after the cache purge
- */
- uintmax_t dirFileSize(const std::string dir);
-
- /**
- * Utility function to convert an LLAssetType enum into a
- * string that we use as part of the cache file filename
- */
- const std::string assetTypeToString(LLAssetType::EType at);
-
- private:
- /**
- * The maximum size of the cache in bytes. After purge is called, the
- * total size of the cache files in the cache directory will be
- * less than this value
- */
- uintmax_t mMaxSizeBytes;
-
- /**
- * The folder that holds the cached files. The consumer of this
- * class must avoid letting the user set this location as a malicious
- * setting could potentially point it at a non-cache directory (for example,
- * the Windows System dir) with disastrous results.
- */
- std::string mCacheDir;
-
- /**
- * The prefix inserted at the start of a cache file filename to
- * help identify it as a cache file. It's probably not required
- * (just the presence in the cache folder is enough) but I am
- * paranoid about the cache folder being set to something bad
- * like the users' OS system dir by mistake or maliciously and
- * this will help to offset any damage if that happens.
- */
- std::string mCacheFilenamePrefix;
-
- /**
- * When enabled, displays additional debugging information in
- * various parts of the code
- */
- bool mEnableCacheDebugInfo;
-};
-
-#endif // _LLDISKCACHE