Rust-rocksdb: Admite serialización y deserialización de WriteBatch.

Creado en 7 ene. 2021  ·  4Comentarios  ·  Fuente: rust-rocksdb/rust-rocksdb

Hola, quiero implementar la replicación entre instancias de rocksdb. Según tengo entendido, ahora rust-rocksdb es compatible con todas las API necesarias, excepto una última característica: la serialización por lotes de escritura. Quiero crear WriteBatch a partir de bytes y serializarlo en bytes, para poder enviarlo a través de la red para su replicación.

¿Hay alguna forma de lograrlo? O puedo hacer relaciones públicas con mi solución.

Comentario más útil

Necesito 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) }
        }
    }
}

Con el valor bruto de writeBatch, podría enviarlo a través de la red a la réplica de la base de datos secundaria.

Todos 4 comentarios

Lo siento por la respuesta tardía. Honestamente, ahora estoy menos involucrado con cualquier cosa relacionada con RocksDB, por lo que no entiendo completamente su situación. ¿Podría explicar qué API debe agregarse?

Necesito 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) }
        }
    }
}

Con el valor bruto de writeBatch, podría enviarlo a través de la red a la réplica de la base de datos secundaria.

Supongo que tiene sentido agregar dicha API. ¿Le gustaría enviar una solicitud de extracción?

Seguro.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

iSynaptic picture iSynaptic  ·  31Comentarios

valeriansaliou picture valeriansaliou  ·  4Comentarios

iSynaptic picture iSynaptic  ·  11Comentarios

zach-schoenberger picture zach-schoenberger  ·  7Comentarios

zach-schoenberger picture zach-schoenberger  ·  5Comentarios