You've already forked mariadb-columnstore-engine
mirror of
https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
synced 2025-12-10 22:42:30 +03:00
Made Cache populate Sync with jobs for the pre-existing stuff in the cache
on startup.
This commit is contained in:
@@ -112,7 +112,9 @@ Cache::Cache() : currentCacheSize(0)
|
|||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
|
|
||||||
populate();
|
lru_mutex.lock(); // unlocked by populate() when it's done
|
||||||
|
boost::thread t([this] { this->populate(); });
|
||||||
|
t.detach();
|
||||||
}
|
}
|
||||||
|
|
||||||
Cache::~Cache()
|
Cache::~Cache()
|
||||||
@@ -121,8 +123,10 @@ Cache::~Cache()
|
|||||||
|
|
||||||
void Cache::populate()
|
void Cache::populate()
|
||||||
{
|
{
|
||||||
|
Synchronizer *sync = Synchronizer::get();
|
||||||
bf::directory_iterator dir(prefix);
|
bf::directory_iterator dir(prefix);
|
||||||
bf::directory_iterator dend;
|
bf::directory_iterator dend;
|
||||||
|
vector<string> newObjects;
|
||||||
while (dir != dend)
|
while (dir != dend)
|
||||||
{
|
{
|
||||||
// put everything in lru & m_lru
|
// put everything in lru & m_lru
|
||||||
@@ -133,13 +137,17 @@ void Cache::populate()
|
|||||||
auto last = lru.end();
|
auto last = lru.end();
|
||||||
m_lru.insert(--last);
|
m_lru.insert(--last);
|
||||||
currentCacheSize += bf::file_size(*dir);
|
currentCacheSize += bf::file_size(*dir);
|
||||||
|
newObjects.push_back(p.filename().string());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
logger->log(LOG_WARNING, "Cache: found something in the cache that does not belong '%s'", p.string().c_str());
|
logger->log(LOG_WARNING, "Cache: found something in the cache that does not belong '%s'", p.string().c_str());
|
||||||
++dir;
|
++dir;
|
||||||
}
|
}
|
||||||
|
sync->newObjects(newObjects);
|
||||||
|
newObjects.clear();
|
||||||
|
|
||||||
// account for what's in the journal dir
|
// account for what's in the journal dir
|
||||||
|
vector<pair<string, size_t> > newJournals;
|
||||||
dir = bf::directory_iterator(journalPrefix);
|
dir = bf::directory_iterator(journalPrefix);
|
||||||
while (dir != dend)
|
while (dir != dend)
|
||||||
{
|
{
|
||||||
@@ -147,7 +155,11 @@ void Cache::populate()
|
|||||||
if (bf::is_regular_file(p))
|
if (bf::is_regular_file(p))
|
||||||
{
|
{
|
||||||
if (p.extension() == ".journal")
|
if (p.extension() == ".journal")
|
||||||
currentCacheSize += bf::file_size(*dir);
|
{
|
||||||
|
size_t s = bf::file_size(*dir);
|
||||||
|
currentCacheSize += s;
|
||||||
|
newJournals.push_back(pair<string, size_t>(p.stem().string(), s));
|
||||||
|
}
|
||||||
else
|
else
|
||||||
logger->log(LOG_WARNING, "Cache: found a file in the journal dir that does not belong '%s'", p.string().c_str());
|
logger->log(LOG_WARNING, "Cache: found a file in the journal dir that does not belong '%s'", p.string().c_str());
|
||||||
}
|
}
|
||||||
@@ -155,7 +167,10 @@ void Cache::populate()
|
|||||||
logger->log(LOG_WARNING, "Cache: found something in the journal dir that does not belong '%s'", p.string().c_str());
|
logger->log(LOG_WARNING, "Cache: found something in the journal dir that does not belong '%s'", p.string().c_str());
|
||||||
++dir;
|
++dir;
|
||||||
}
|
}
|
||||||
|
lru_mutex.unlock();
|
||||||
|
sync->newJournalEntries(newJournals);
|
||||||
}
|
}
|
||||||
|
|
||||||
// be careful using this! SM should be idle. No ongoing reads or writes.
|
// be careful using this! SM should be idle. No ongoing reads or writes.
|
||||||
void Cache::validateCacheSize()
|
void Cache::validateCacheSize()
|
||||||
{
|
{
|
||||||
@@ -284,7 +299,7 @@ void Cache::read(const vector<string> &keys)
|
|||||||
// DNE or if there's an existing download that hasn't finished yet. Starting the download
|
// DNE or if there's an existing download that hasn't finished yet. Starting the download
|
||||||
// includes waiting for an existing download to finish, which from this class's pov is the
|
// includes waiting for an existing download to finish, which from this class's pov is the
|
||||||
// same thing.
|
// same thing.
|
||||||
if (doNotEvict.find(key) == doNotEvict.end() || downloader.inProgress(key))
|
if (doNotEvict.find(key) == doNotEvict.end() || downloader->inProgress(key))
|
||||||
keysToFetch.push_back(&key);
|
keysToFetch.push_back(&key);
|
||||||
else
|
else
|
||||||
cout << "Cache: detected and stopped a racey download" << endl;
|
cout << "Cache: detected and stopped a racey download" << endl;
|
||||||
@@ -476,8 +491,6 @@ void Cache::_makeSpace(size_t size)
|
|||||||
ssize_t thisMuch = currentCacheSize + size - maxCacheSize;
|
ssize_t thisMuch = currentCacheSize + size - maxCacheSize;
|
||||||
if (thisMuch <= 0)
|
if (thisMuch <= 0)
|
||||||
return;
|
return;
|
||||||
if (thisMuch > (ssize_t) currentCacheSize)
|
|
||||||
thisMuch = currentCacheSize;
|
|
||||||
|
|
||||||
LRU_t::iterator it;
|
LRU_t::iterator it;
|
||||||
while (thisMuch > 0 && !lru.empty())
|
while (thisMuch > 0 && !lru.empty())
|
||||||
@@ -487,6 +500,7 @@ void Cache::_makeSpace(size_t size)
|
|||||||
// makeSpace() call.
|
// makeSpace() call.
|
||||||
while (it != lru.end())
|
while (it != lru.end())
|
||||||
{
|
{
|
||||||
|
// make sure it's not currently being read or being flushed by another _makeSpace() call
|
||||||
if ((doNotEvict.find(it) == doNotEvict.end()) && (toBeDeleted.find(it) == toBeDeleted.end()))
|
if ((doNotEvict.find(it) == doNotEvict.end()) && (toBeDeleted.find(it) == toBeDeleted.end()))
|
||||||
break;
|
break;
|
||||||
++it;
|
++it;
|
||||||
|
|||||||
@@ -180,9 +180,9 @@ ssize_t IOCoordinator::read(const char *_filename, uint8_t *data, off_t offset,
|
|||||||
}
|
}
|
||||||
else if (errno != ENOENT)
|
else if (errno != ENOENT)
|
||||||
{
|
{
|
||||||
|
int l_errno = errno;
|
||||||
fileLock.unlock();
|
fileLock.unlock();
|
||||||
cache->doneReading(keys);
|
cache->doneReading(keys);
|
||||||
int l_errno = errno;
|
|
||||||
logger->log(LOG_CRIT, "IOCoordinator::read(): Got an unexpected error opening %s, error was '%s'",
|
logger->log(LOG_CRIT, "IOCoordinator::read(): Got an unexpected error opening %s, error was '%s'",
|
||||||
filename.c_str(), strerror_r(l_errno, buf, 80));
|
filename.c_str(), strerror_r(l_errno, buf, 80));
|
||||||
errno = l_errno;
|
errno = l_errno;
|
||||||
@@ -194,9 +194,9 @@ ssize_t IOCoordinator::read(const char *_filename, uint8_t *data, off_t offset,
|
|||||||
fd = ::open(filename.c_str(), O_RDONLY);
|
fd = ::open(filename.c_str(), O_RDONLY);
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
{
|
{
|
||||||
|
int l_errno = errno;
|
||||||
fileLock.unlock();
|
fileLock.unlock();
|
||||||
cache->doneReading(keys);
|
cache->doneReading(keys);
|
||||||
int l_errno = errno;
|
|
||||||
logger->log(LOG_CRIT, "IOCoordinator::read(): Got an unexpected error opening %s, error was '%s'",
|
logger->log(LOG_CRIT, "IOCoordinator::read(): Got an unexpected error opening %s, error was '%s'",
|
||||||
filename.c_str(), strerror_r(l_errno, buf, 80));
|
filename.c_str(), strerror_r(l_errno, buf, 80));
|
||||||
errno = l_errno;
|
errno = l_errno;
|
||||||
|
|||||||
Reference in New Issue
Block a user