|
@@ -59,7 +59,7 @@
|
|
|
#include "keybuild.hpp"
|
|
|
#include "layouttrans.hpp"
|
|
|
|
|
|
-static CKeyStore *keyStore = NULL;
|
|
|
+static std::atomic<CKeyStore *> keyStore(nullptr);
|
|
|
static unsigned defaultKeyIndexLimit = 200;
|
|
|
static CNodeCache *nodeCache = NULL;
|
|
|
static CriticalSection *initCrit = NULL;
|
|
@@ -79,7 +79,7 @@ MODULE_INIT(INIT_PRIORITY_JHTREE_JHTREE)
|
|
|
MODULE_EXIT()
|
|
|
{
|
|
|
delete initCrit;
|
|
|
- delete keyStore;
|
|
|
+ delete keyStore.load(std::memory_order_relaxed);
|
|
|
::Release((CInterface*)nodeCache);
|
|
|
}
|
|
|
|
|
@@ -1282,6 +1282,7 @@ void CKeyStore::clearCacheEntry(const char *keyName)
|
|
|
if (!keyName || !*keyName)
|
|
|
return; // nothing to do
|
|
|
|
|
|
+ synchronized block(mutex);
|
|
|
Owned<CKeyIndexMRUCache::CMRUIterator> iter = keyIndexCache.getIterator();
|
|
|
|
|
|
StringArray goers;
|
|
@@ -1302,6 +1303,28 @@ void CKeyStore::clearCacheEntry(const char *keyName)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+void CKeyStore::clearCacheEntry(const IFileIO *io)
|
|
|
+{
|
|
|
+ synchronized block(mutex);
|
|
|
+ Owned<CKeyIndexMRUCache::CMRUIterator> iter = keyIndexCache.getIterator();
|
|
|
+
|
|
|
+ StringArray goers;
|
|
|
+ ForEach(*iter)
|
|
|
+ {
|
|
|
+ CKeyIndexMapping &mapping = iter->query();
|
|
|
+ IKeyIndex &index = mapping.query();
|
|
|
+ if (!index.IsShared())
|
|
|
+ {
|
|
|
+ if (index.queryFileIO()==io)
|
|
|
+ goers.append(mapping.queryFindString());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ForEachItemIn(idx, goers)
|
|
|
+ {
|
|
|
+ keyIndexCache.remove(goers.item(idx));
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
// CKeyIndex impl.
|
|
|
|
|
|
CKeyIndex::CKeyIndex(int _iD, const char *_name) : name(_name)
|
|
@@ -2003,6 +2026,7 @@ public:
|
|
|
virtual offset_t queryMetadataHead() { return checkOpen().queryMetadataHead(); }
|
|
|
virtual IPropertyTree * getMetadata() { return checkOpen().getMetadata(); }
|
|
|
virtual unsigned getNodeSize() { return checkOpen().getNodeSize(); }
|
|
|
+ virtual const IFileIO *queryFileIO() const override { return iFileIO->queryFileIO(); }
|
|
|
};
|
|
|
|
|
|
extern jhtree_decl IKeyIndex *createKeyIndex(const char *keyfile, unsigned crc, IFileIO &iFileIO, bool isTLK, bool preloadAllowed)
|
|
@@ -2038,6 +2062,11 @@ extern jhtree_decl void clearKeyStoreCacheEntry(const char *name)
|
|
|
queryKeyStore()->clearCacheEntry(name);
|
|
|
}
|
|
|
|
|
|
+extern jhtree_decl void clearKeyStoreCacheEntry(const IFileIO *io)
|
|
|
+{
|
|
|
+ queryKeyStore()->clearCacheEntry(io);
|
|
|
+}
|
|
|
+
|
|
|
extern jhtree_decl StringBuffer &getIndexMetrics(StringBuffer &ret)
|
|
|
{
|
|
|
return queryKeyStore()->getMetrics(ret);
|