web queue: fix cache resizing utility + bug in indexer which would skip oldest entry

This commit is contained in:
Jean-Francois Dockes 2015-02-15 16:08:36 +01:00
parent 1f2776daf6
commit 9d26f4908a
2 changed files with 210 additions and 191 deletions

View file

@ -287,7 +287,8 @@ bool BeagleQueueIndexer::index()
if (!eof) if (!eof)
return false; return false;
} }
while (cc->next(eof)) { int nentries = 0;
do {
string udi; string udi;
if (!cc->getCurrentUdi(udi)) { if (!cc->getCurrentUdi(udi)) {
LOGERR(("BeagleQueueIndexer:: cache file damaged\n")); LOGERR(("BeagleQueueIndexer:: cache file damaged\n"));
@ -307,7 +308,8 @@ bool BeagleQueueIndexer::index()
return false; return false;
} }
} }
} nentries++;
} while (cc->next(eof));
} }
// Finally index the queue // Finally index the queue

View file

@ -156,7 +156,8 @@ public:
////// These are cache persistent state and written to the first block: ////// These are cache persistent state and written to the first block:
// Maximum file size, after which we begin reusing old space // Maximum file size, after which we begin reusing old space
off_t m_maxsize; off_t m_maxsize;
// Offset of the oldest header. // Offset of the oldest header, or max file offset (file size)
// while the file is growing. This is the next write position.
off_t m_oheadoffs; off_t m_oheadoffs;
// Offset of last write (newest header) // Offset of last write (newest header)
off_t m_nheadoffs; off_t m_nheadoffs;
@ -1132,8 +1133,19 @@ bool CirCache::rewind(bool& eof)
eof = false; eof = false;
// Read oldest header off_t fsize = lseek(m_d->m_fd, 0, SEEK_END);
if (fsize == (off_t)-1) {
LOGERR(("CirCache::rewind: seek to EOF failed\n"));
return false;
}
// Read oldest header. This is either at the position pointed to
// by oheadoffs, or after the first block if the file is still
// growing.
if (m_d->m_oheadoffs == fsize) {
m_d->m_itoffs = CIRCACHE_FIRSTBLOCK_SIZE;
} else {
m_d->m_itoffs = m_d->m_oheadoffs; m_d->m_itoffs = m_d->m_oheadoffs;
}
CCScanHook::status st = m_d->readEntryHeader(m_d->m_itoffs, m_d->m_ithd); CCScanHook::status st = m_d->readEntryHeader(m_d->m_itoffs, m_d->m_ithd);
switch(st) { switch(st) {
@ -1351,7 +1363,12 @@ bool resizecc(const string& dir, int newmbs)
} }
bool eof = false; bool eof = false;
occ->rewind(eof); if (!occ->rewind(eof)) {
if (!eof) {
cerr << "Initial rewind failed" << endl;
return false;
}
}
int nentries = 0; int nentries = 0;
while (!eof) { while (!eof) {
string udi, sdic, data; string udi, sdic, data;
@ -1403,14 +1420,14 @@ bool resizecc(const string& dir, int newmbs)
static char *thisprog; static char *thisprog;
static char usage [] = static char usage [] =
" -c [-u] <dirname> : create\n" " -c [-u] <dirname> : create\n"
" -p <dirname> <apath> [apath ...] : put files\n" " -p <dirname> <apath> [apath ...] : put files\n"
" -d <dirname> : dump\n" " -d <dirname> : dump\n"
" -g [-i instance] [-D] <dirname> <udi>: get\n" " -g [-i instance] [-D] <dirname> <udi>: get\n"
" -D: also dump data\n" " -D: also dump data\n"
" -e <dirname> <udi> : erase\n" " -e <dirname> <udi> : erase\n"
" -s <dirname> <newmbs> : resize\n" " -s <dirname> <newmbs> : resize\n"
; ;
static void static void
Usage(FILE *fp = stderr) Usage(FILE *fp = stderr)
{ {