Rust-rocksdb: Suporte a serialização e desserialização WriteBatch.

Criado em 7 jan. 2021  ·  4Comentários  ·  Fonte: rust-rocksdb/rust-rocksdb

Olá, eu quero implementar a replicação entre instâncias rocksdb. Tanto quanto eu entendo, agora o rust-rocksdb suporta todas as APIs necessárias, exceto um último recurso - serialização writebatch. Eu quero criar WriteBatch de bytes e serializá-lo em bytes, para poder enviá-lo pela rede para replicação.

Existe alguma maneira de alcançá-lo? Ou eu posso fazer PR com minha solução.

Comentários muito úteis

Eu preciso de algo como:

impl WriteBatch {
    /// Tries to serialize writebatch as raw bytes vector with null values
    /// Its useful for sending write batches over network.
    pub fn try_into_raw(&self) -> Result<Vec<u8>, Error> {
        let data;
        unsafe {
            let mut repsize1: size_t = 0;
            let rep: *const i8 = ffi::rocksdb_writebatch_data(self.inner, &mut repsize1);
            let cs = slice_from_raw_parts(rep as *const u8, repsize1);
            data = cs.as_ref().ok_or_else(|| {
                Error::new("writeBatch reference is Null".to_string())
            })?.to_vec();
        }
        Ok(data)
    }

    /// creates writeBatch from raw input
    pub fn from_raw(data: &[u8]) -> Self {
        let u8slice = unsafe {
            &*(data as *const _ as *const [i8])
        };
        WriteBatch {
            inner: unsafe { ffi::rocksdb_writebatch_create_from(u8slice.as_ptr(), data.len() as size_t) }
        }
    }
}

Com o valor bruto de writeBatch, eu seria capaz de enviá-lo pela rede para a réplica do banco de dados secundário.

Todos 4 comentários

Desculpe pelo atraso na resposta. Honestamente, estou menos envolvido com qualquer coisa relacionada ao RocksDB agora, então não entendo completamente sua situação. Você poderia por favor detalhar qual API precisa ser adicionada?

Eu preciso de algo como:

impl WriteBatch {
    /// Tries to serialize writebatch as raw bytes vector with null values
    /// Its useful for sending write batches over network.
    pub fn try_into_raw(&self) -> Result<Vec<u8>, Error> {
        let data;
        unsafe {
            let mut repsize1: size_t = 0;
            let rep: *const i8 = ffi::rocksdb_writebatch_data(self.inner, &mut repsize1);
            let cs = slice_from_raw_parts(rep as *const u8, repsize1);
            data = cs.as_ref().ok_or_else(|| {
                Error::new("writeBatch reference is Null".to_string())
            })?.to_vec();
        }
        Ok(data)
    }

    /// creates writeBatch from raw input
    pub fn from_raw(data: &[u8]) -> Self {
        let u8slice = unsafe {
            &*(data as *const _ as *const [i8])
        };
        WriteBatch {
            inner: unsafe { ffi::rocksdb_writebatch_create_from(u8slice.as_ptr(), data.len() as size_t) }
        }
    }
}

Com o valor bruto de writeBatch, eu seria capaz de enviá-lo pela rede para a réplica do banco de dados secundário.

Eu acho que faz sentido adicionar essa API. Deseja enviar uma solicitação de pull?

Certo.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

alex88 picture alex88  ·  7Comentários

jonhoo picture jonhoo  ·  22Comentários

iSynaptic picture iSynaptic  ·  12Comentários

iSynaptic picture iSynaptic  ·  31Comentários

spacejam picture spacejam  ·  3Comentários