> (you don't have to strictly follow this form)

**Use case**

Support manually snapshot for Keeper.

**Describe the solution you'd like**

Throught 4lw commands, such as `csnp`.


nuraft::cb_func::ReturnCode callbackFunc(nuraft::cb_func::Type type, nuraft::cb_func::Param * param);
    
    
    void launchRaftServer(const Poco::Util::AbstractConfiguration & config, bool enable_ipv6);
    void shutdownRaftServer();
    void loadLatestConfig();
    void enterRecoveryMode(nuraft::raft_params & params);
    std::atomic_bool is_recovering = false;
    std::shared_ptr<KeeperContext> keeper_context;
    const bool create_snapshot_on_exit;
public:
    KeeperServer(
        const KeeperConfigurationAndSettingsPtr & settings_,
        const Poco::Util::AbstractConfiguration & config_,
        ResponsesQueue & responses_queue_,
        SnapshotsQueue & snapshots_queue_,
        KeeperSnapshotManagerS3 & snapshot_manager_s3);
    
    void startup(const Poco::Util::AbstractConfiguration & config, bool enable_ipv6 = true);
    
    
    void putLocalReadRequest(const KeeperStorage::RequestForSession & request);
    bool isRecovering() const { return is_recovering; }
    
    
    RaftAppendResult putRequestBatch(const KeeperStorage::RequestsForSessions & requests);
    
    std::vector<int64_t> getDeadSessions();
    nuraft::ptr<KeeperStateMachine> getKeeperStateMachine() const { return state_machine; }