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 else
{ {
for (auto &str : m_setchanged) for (auto &key : m_vecchanged)
{ {
sds sdsKey = sdsnewlen(str.data(), str.size()); robj *o = find(key.get());
robj *o = find(sdsKey);
if (o != nullptr) if (o != nullptr)
{ {
storeKey(str.data(), str.size(), o); storeKey(key.get(), sdslen(key.get()), o);
} }
else 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 decrRefCount(robj_roptr o);
void incrRefCount(robj_roptr o); void incrRefCount(robj_roptr o);
class robj_sharedptr class robj_sharedptr
@ -1215,7 +1264,7 @@ public:
void trackkey(const char *key) void trackkey(const char *key)
{ {
if (m_fTrackingChanges && !m_fAllChanged) 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) dict_iter find(const char *key)
@ -1299,7 +1348,7 @@ private:
dict *m_pdictTombstone = nullptr; /* Track deletes when we have a snapshot */ dict *m_pdictTombstone = nullptr; /* Track deletes when we have a snapshot */
int m_fTrackingChanges = 0; // Note: Stack based int m_fTrackingChanges = 0; // Note: Stack based
bool m_fAllChanged = false; bool m_fAllChanged = false;
std::set<std::string> m_setchanged; std::vector<unique_sds_ptr> m_vecchanged;
std::shared_ptr<IStorage> m_spstorage = nullptr; std::shared_ptr<IStorage> m_spstorage = nullptr;
uint64_t mvccCheckpoint = 0; uint64_t mvccCheckpoint = 0;