Don't preallocate m_pendingDocIds when we're not going to use it

This commit is contained in:
Ai Lin Chia
2017-03-15 15:58:52 +01:00
parent b54795202b
commit 21efc82b90
3 changed files with 20 additions and 16 deletions

@ -228,7 +228,7 @@ bool RdbBase::init(const char *dir,
if (m_useIndexFile) {
char indexName[64];
sprintf(indexName, "%s-saved.idx", m_dbname);
m_treeIndex.set(m_collectionDirName, indexName, m_fixedDataSize, m_useHalfKeys, m_ks, m_rdb->getRdbId());
m_treeIndex.set(m_collectionDirName, indexName, m_fixedDataSize, m_useHalfKeys, m_ks, m_rdb->getRdbId(), false);
// only attempt to read/generate when we have tree/bucket
if ((m_tree && m_tree->getNumUsedNodes() > 0) || (m_buckets && m_buckets->getNumKeys() > 0)) {
@ -1004,7 +1004,7 @@ int32_t RdbBase::addFile ( bool isNew, int32_t fileId, int32_t fileId2, int32_t
// set the index file's filename
generateIndexFilename(indexName,sizeof(indexName),fileId,fileId2,0,-1);
in->set(dirName, indexName, m_fixedDataSize, m_useHalfKeys, m_ks, m_rdb->getRdbId());
in->set(dirName, indexName, m_fixedDataSize, m_useHalfKeys, m_ks, m_rdb->getRdbId(), !isNew);
if (!isNew && !(in->readIndex() && in->verifyIndex())) {
// if out of memory, do not try to regen for that
if (g_errno == ENOMEM) {

@ -59,14 +59,16 @@ RdbIndex::~RdbIndex() {
}
}
void RdbIndex::reset() {
void RdbIndex::reset(bool isStatic) {
m_file.reset();
/// @todo ALC do we need to lock here?
m_docIds.reset(new docids_t);
m_pendingDocIds.reset(new docids_t);
m_pendingDocIds->reserve(m_generatingIndex ? s_generateReserveSize : s_defaultReserveSize);
if (!isStatic) {
m_pendingDocIds->reserve(m_generatingIndex ? s_generateReserveSize : s_defaultReserveSize);
}
m_prevPendingDocId = MAX_DOCID + 1;
m_lastMergeTime = gettimeofdayInMilliseconds();
@ -111,11 +113,11 @@ void RdbIndex::mergePendingDocIds(void *state) {
}
/// @todo ALC collapse RdbIndex::set into constructor
void RdbIndex::set(const char *dir, const char *indexFilename, int32_t fixedDataSize , bool useHalfKeys ,
char keySize, rdbid_t rdbId) {
void RdbIndex::set(const char *dir, const char *indexFilename, int32_t fixedDataSize, bool useHalfKeys,
char keySize, rdbid_t rdbId, bool isStatic) {
logTrace(g_conf.m_logTraceRdbIndex, "BEGIN. dir [%s], indexFilename [%s]", dir, indexFilename);
reset();
reset(isStatic);
m_fixedDataSize = fixedDataSize;
m_file.set(dir, indexFilename);
@ -123,9 +125,10 @@ void RdbIndex::set(const char *dir, const char *indexFilename, int32_t fixedData
m_ks = keySize;
m_rdbId = rdbId;
/// @todo ALC should we only register a sleep callback when we need it?
/// if we're not merging/adding record we don't need to merge
m_registeredCallback = g_loop.registerSleepCallback(1000, this, &timedMerge);
if (!isStatic) {
/// if we're not merging/adding record we don't need to merge
m_registeredCallback = g_loop.registerSleepCallback(1000, this, &timedMerge);
}
}
bool RdbIndex::close(bool urgent) {
@ -136,7 +139,7 @@ bool RdbIndex::close(bool urgent) {
// clears and frees everything
if (!urgent) {
reset();
reset(true);
}
if (m_registeredCallback) {
@ -441,7 +444,7 @@ void RdbIndex::addList(RdbList *list) {
}
bool RdbIndex::generateIndex(collnum_t collnum, const RdbTree *tree) {
reset();
reset(false);
if (g_conf.m_readOnlyMode) {
return false;
@ -475,7 +478,7 @@ bool RdbIndex::generateIndex(collnum_t collnum, const RdbTree *tree) {
}
bool RdbIndex::generateIndex(collnum_t collnum, const RdbBuckets *buckets) {
reset();
reset(false);
if (g_conf.m_readOnlyMode) {
return false;
@ -511,7 +514,7 @@ bool RdbIndex::generateIndex(collnum_t collnum, const RdbBuckets *buckets) {
// . attempts to auto-generate from data file, f
// . returns false and sets g_errno on error
bool RdbIndex::generateIndex(BigFile *f) {
reset();
reset(false);
if (g_conf.m_readOnlyMode) {
return false;

@ -27,10 +27,11 @@ public:
// . does not write data to disk
// . frees all
void reset();
void reset(bool isStatic);
// set the filename, and if it's fixed data size or not
void set(const char *dir, const char *indexFilename, int32_t fixedDataSize, bool useHalfKeys, char keySize, rdbid_t rdbId);
void set(const char *dir, const char *indexFilename, int32_t fixedDataSize, bool useHalfKeys, char keySize,
rdbid_t rdbId, bool isStatic);
bool rename(const char *newIndexFilename) {
return m_file.rename(newIndexFilename, NULL);