Prevent extra copy of key

Former-commit-id: 9c3ef97039e59c6b820f71a90f8a9fb4eae8a7b1
This commit is contained in:
John Sully 2019-12-08 16:02:24 -05:00
parent dcebb3ab11
commit 3aade2d1e6
2 changed files with 56 additions and 9 deletions

View File

@ -2126,22 +2126,20 @@ void redisDbPersistentData::processChanges()
}
else
{
for (auto &str : m_setchanged)
for (auto &key : m_vecchanged)
{
sds sdsKey = sdsnewlen(str.data(), str.size());
robj *o = find(sdsKey);
robj *o = find(key.get());
if (o != nullptr)
{
storeKey(str.data(), str.size(), o);
storeKey(key.get(), sdslen(key.get()), o);
}
else
{
m_spstorage->erase(str.data(), str.size());
m_spstorage->erase(key.get(), sdslen(key.get()));
}
sdsfree(sdsKey);
}
}
m_setchanged.clear();
m_vecchanged.clear();
}
}
}

View File

@ -155,6 +155,55 @@ public:
}
};
class unique_sds_ptr
{
sds m_str;
public:
unique_sds_ptr()
: m_str(nullptr)
{}
explicit unique_sds_ptr(sds str)
: m_str(str)
{}
~unique_sds_ptr()
{
if (m_str)
sdsfree(m_str);
}
unique_sds_ptr(unique_sds_ptr &&other)
{
m_str = other.m_str;
other.m_str = nullptr;
}
bool operator==(const unique_sds_ptr &other) const
{
return m_str == other.m_str;
}
bool operator!=(const unique_sds_ptr &other) const
{
return m_str != other.m_str;
}
sds operator->() const
{
return m_str;
}
bool operator!() const
{
return !m_str;
}
bool operator<(const unique_sds_ptr &other) const { return m_str < other.m_str; }
sds get() const { return m_str; }
};
void decrRefCount(robj_roptr o);
void incrRefCount(robj_roptr o);
class robj_sharedptr
@ -1215,7 +1264,7 @@ public:
void trackkey(const char *key)
{
if (m_fTrackingChanges && !m_fAllChanged)
m_setchanged.insert(std::string(key, sdslen(key)));
m_vecchanged.push_back(unique_sds_ptr(sdsdup(key)));
}
dict_iter find(const char *key)
@ -1299,7 +1348,7 @@ private:
dict *m_pdictTombstone = nullptr; /* Track deletes when we have a snapshot */
int m_fTrackingChanges = 0; // Note: Stack based
bool m_fAllChanged = false;
std::set<std::string> m_setchanged;
std::vector<unique_sds_ptr> m_vecchanged;
std::shared_ptr<IStorage> m_spstorage = nullptr;
uint64_t mvccCheckpoint = 0;