Prevent extra copy of key
Former-commit-id: 9c3ef97039e59c6b820f71a90f8a9fb4eae8a7b1
This commit is contained in:
parent
dcebb3ab11
commit
3aade2d1e6
14
src/db.cpp
14
src/db.cpp
@ -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());
|
||||
}
|
||||
sdsfree(sdsKey);
|
||||
m_spstorage->erase(key.get(), sdslen(key.get()));
|
||||
}
|
||||
}
|
||||
m_setchanged.clear();
|
||||
}
|
||||
m_vecchanged.clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
53
src/server.h
53
src/server.h
@ -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;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user