• Yanqi Lv's avatar
    Refine the purpose of rdb saving with accurate flags (#12925) · 62153b3b
    Yanqi Lv authored
    In Redis, rdb is produced in three scenarios mainly.
    
    - backup, such as `bgsave` and `save` command
    - full sync in replication
    - aof rewrite if `aof-use-rdb-preamble` is yes
    
    We also have some RDB flags to identify the purpose of rdb saving.
    ```C
    /* flags on the purpose of rdb save or load */
    #define RDBFLAGS_NONE 0                 /* No special RDB loading. */
    #define RDBFLAGS_AOF_PREAMBLE (1<<0)    /* Load/save the RDB as AOF preamble. */
    #define RDBFLAGS_REPLICATION (1<<1)     /* Load/save for SYNC. */
    ```
    
    But currently, it seems that these flags and purposes of rdb saving
    don't exactly match. I find it in `rdbSaveRioWithEOFMark` which calls
    `startSaving` with `RDBFLAGS_REPLICATION` but `rdbSaveRio` with
    `RDBFLAGS_NONE`.
    ```C
    int rdbSaveRioWithEOFMark(int req, rio *rdb, int *error, rdbSaveInfo *rsi) {
        char eofmark[RDB_EOF_MARK_SIZE];
    
        startSaving(RDBFLAGS_REPLICATION);
        getRandomHexChars(eofmark,RDB_EOF_MARK_SIZE);
        if (error) *error = 0;
        if (rioWrite(rdb,"$EOF:",5) == 0) goto werr;
        if (rioWrite(rdb,eofmark,RDB_EOF_MARK_SIZE) == 0) goto werr;
        if (rioWrite(rdb,"\r\n",2) == 0) goto werr;
        if (rdbSaveRio(req,rdb,error,RDBFLAGS_NONE,rsi) == C_ERR) goto werr;
        if (rioWrite(rdb,eofmark,RDB_EOF_MARK_SIZE) == 0) goto werr;
        stopSaving(1);
        return C_OK;
    
    werr: /* Write error. */
        /* Set 'error' only if not already set by rdbSaveRio() call. */
        if (error && *error == 0) *error = errno;
        stopSaving(0);
        return C_ERR;
    }
    ```
    
    In this PR, I refine the purpose of rdb saving with accurate flags.
    62153b3b
rdb.h 8.75 KB