MCPcopy Create free account
hub / github.com/Snapchat/KeyDB / loadWorkerThreadMain

Method loadWorkerThreadMain

src/rdb.cpp:2976–3039  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2974 }
2975
2976 static void loadWorkerThreadMain(rdbAsyncWorkThread *pqueue) {
2977 rdbAsyncWorkThread &queue = *pqueue;
2978 redisServerThreadVars vars = {};
2979 vars.clients_pending_asyncwrite = listCreate();
2980 serverTL = &vars;
2981 aeSetThreadOwnsLockOverride(true);
2982
2983#ifdef __linux__
2984 // We will inheret the server thread's affinity mask, clear it as we want to run on a different core.
2985 cpu_set_t *cpuset = CPU_ALLOC(std::thread::hardware_concurrency());
2986 if (cpuset != nullptr) {
2987 size_t size = CPU_ALLOC_SIZE(std::thread::hardware_concurrency());
2988 CPU_ZERO_S(size, cpuset);
2989 for (unsigned i = 0; i < std::thread::hardware_concurrency(); ++i) {
2990 CPU_SET_S(i, size, cpuset);
2991 }
2992 pthread_setaffinity_np(pthread_self(), size, cpuset);
2993 CPU_FREE(cpuset);
2994 }
2995#endif
2996
2997 for (;;) {
2998 if (queue.queueJobs.size_approx() == 0) {
2999 if (queue.fExit.load(std::memory_order_relaxed))
3000 break;
3001 }
3002
3003 if (queue.fExit.load(std::memory_order_seq_cst) && queue.queueJobs.size_approx() == 0)
3004 break;
3005
3006 vars.gcEpoch = g_pserver->garbageCollector.startEpoch();
3007 JobBase *rgjob[64];
3008 int cjobs = 0;
3009 while ((cjobs = pqueue->queueJobs.wait_dequeue_bulk_timed(rgjob, 64, std::chrono::milliseconds(5))) > 0) {
3010 std::unique_lock<fastlock> ulPause(pqueue->m_lockPause);
3011
3012 for (int ijob = 0; ijob < cjobs; ++ijob) {
3013 JobBase *pjob = rgjob[ijob];
3014 switch (pjob->type)
3015 {
3016 case JobBase::JobType::Insert:
3017 pqueue->processJob(*static_cast<rdbInsertJob*>(pjob));
3018 break;
3019
3020 case JobBase::JobType::Function:
3021 static_cast<rdbFunctionJob*>(pjob)->m_fn();
3022 break;
3023 }
3024 delete pjob;
3025 }
3026 }
3027 g_pserver->garbageCollector.endEpoch(vars.gcEpoch);
3028 }
3029
3030 if (g_pserver->m_pstorageFactory) {
3031 for (int idb = 0; idb < cserver.dbnum; ++idb)
3032 g_pserver->db[idb]->processChangesAsync(queue.cstorageWritesInFlight);
3033 }

Callers

nothing calls this directly

Calls 10

listCreateFunction · 0.85
listReleaseFunction · 0.85
processJobMethod · 0.80
processChangesAsyncMethod · 0.80
size_approxMethod · 0.45
startEpochMethod · 0.45
endEpochMethod · 0.45

Tested by

no test coverage detected