| 2981 | } |
| 2982 | |
| 2983 | void redisDbPersistentData::processChangesAsync(std::atomic<int> &pendingJobs) |
| 2984 | { |
| 2985 | ++pendingJobs; |
| 2986 | serverAssert(!m_fAllChanged); |
| 2987 | dictEmpty(m_dictChanged, nullptr); |
| 2988 | dict *dictNew = dictCreate(&dbDictType, nullptr); |
| 2989 | std::swap(dictNew, m_pdict); |
| 2990 | m_cnewKeysPending = 0; |
| 2991 | g_pserver->asyncworkqueue->AddWorkFunction([dictNew, this, &pendingJobs]{ |
| 2992 | dictIterator *di = dictGetIterator(dictNew); |
| 2993 | dictEntry *de; |
| 2994 | std::vector<sds> veckeys; |
| 2995 | std::vector<size_t> veccbkeys; |
| 2996 | std::vector<sds> vecvals; |
| 2997 | std::vector<size_t> veccbvals; |
| 2998 | while ((de = dictNext(di)) != nullptr) |
| 2999 | { |
| 3000 | robj *o = (robj*)dictGetVal(de); |
| 3001 | sds temp = serializeStoredObjectAndExpire(o); |
| 3002 | veckeys.push_back((sds)dictGetKey(de)); |
| 3003 | veccbkeys.push_back(sdslen((sds)dictGetKey(de))); |
| 3004 | vecvals.push_back(temp); |
| 3005 | veccbvals.push_back(sdslen(temp)); |
| 3006 | } |
| 3007 | m_spstorage->bulkInsert(veckeys.data(), veccbkeys.data(), vecvals.data(), veccbvals.data(), veckeys.size()); |
| 3008 | for (auto val : vecvals) |
| 3009 | sdsfree(val); |
| 3010 | dictReleaseIterator(di); |
| 3011 | dictRelease(dictNew); |
| 3012 | --pendingJobs; |
| 3013 | }); |
| 3014 | } |
| 3015 | |
| 3016 | /* This function is to bulk insert directly to storage provider bypassing in memory, assumes rgKeys and rgVals are not sds strings */ |
| 3017 | void redisDbPersistentData::bulkDirectStorageInsert(char **rgKeys, size_t *rgcbKeys, char **rgVals, size_t *rgcbVals, size_t celem) |
no test coverage detected