| 1561 | }; |
| 1562 | |
| 1563 | void *rdbSaveThread(void *vargs) |
| 1564 | { |
| 1565 | aeThreadOnline(); |
| 1566 | serverAssert(!g_pserver->rdbThreadVars.fDone); |
| 1567 | rdbSaveThreadArgs *args = reinterpret_cast<rdbSaveThreadArgs*>(vargs); |
| 1568 | serverAssert(serverTL == nullptr); |
| 1569 | redisServerThreadVars vars; |
| 1570 | serverTL = &vars; |
| 1571 | vars.gcEpoch = g_pserver->garbageCollector.startEpoch(); |
| 1572 | |
| 1573 | int retval = rdbSave(args->rgpdb, &args->rsi); |
| 1574 | if (retval == C_OK) |
| 1575 | sendChildCowInfo(CHILD_INFO_TYPE_RDB_COW_SIZE, "RDB"); |
| 1576 | |
| 1577 | // If we were told to cancel the requesting thread holds the lock for us |
| 1578 | ssize_t cbStart = zmalloc_used_memory(); |
| 1579 | for (int idb = 0; idb < cserver.dbnum; ++idb) |
| 1580 | g_pserver->db[idb]->endSnapshotAsync(args->rgpdb[idb]); |
| 1581 | |
| 1582 | args->~rdbSaveThreadArgs(); |
| 1583 | zfree(args); |
| 1584 | ssize_t cbDiff = (cbStart - (ssize_t)zmalloc_used_memory()); |
| 1585 | g_pserver->garbageCollector.endEpoch(vars.gcEpoch); |
| 1586 | |
| 1587 | if (cbDiff > 0) |
| 1588 | { |
| 1589 | serverLog(LL_NOTICE, |
| 1590 | "%s: %zd MB of memory used by copy-on-write", |
| 1591 | "RDB",cbDiff/(1024*1024)); |
| 1592 | } |
| 1593 | aeThreadOffline(); |
| 1594 | g_pserver->rdbThreadVars.fDone = true; |
| 1595 | return (retval == C_OK) ? (void*)0 : (void*)1; |
| 1596 | } |
| 1597 | |
| 1598 | int rdbSaveBackgroundFork(rdbSaveInfo *rsi) { |
| 1599 | pid_t childpid; |
nothing calls this directly
no test coverage detected