| 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 | } |
nothing calls this directly
no test coverage detected