Rust-rocksdb: Prend en charge la sérialisation et la désérialisation WriteBatch.

Créé le 7 janv. 2021  ·  4Commentaires  ·  Source: rust-rocksdb/rust-rocksdb

Bonjour, je souhaite implémenter la réplication entre les instances rocksdb. Autant que je sache, rust-rocksdb prend désormais en charge toutes les API nécessaires, à l'exception d'une dernière fonctionnalité - la sérialisation writebatch. Je veux créer WriteBatch à partir d'octets et le sérialiser en octets, pour pouvoir l'envoyer sur le réseau pour la réplication.

Existe-t-il un moyen d'y parvenir? Ou je peux faire des relations publiques avec ma solution.

Commentaire le plus utile

J'ai besoin de quelque chose comme :

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

Avec la valeur brute de writeBatch, je pourrais l'envoyer sur le réseau à la réplique de la base de données secondaire.

Tous les 4 commentaires

Désolé pour la réponse tardive. Honnêtement, je suis moins impliqué dans tout ce qui concerne RocksDB maintenant, donc je ne comprends pas entièrement votre situation. Pourriez-vous s'il vous plaît préciser quelle API doit être ajoutée?

J'ai besoin de quelque chose comme :

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

Avec la valeur brute de writeBatch, je pourrais l'envoyer sur le réseau à la réplique de la base de données secondaire.

Je suppose qu'il est logique d'ajouter une telle API. Souhaitez-vous soumettre une demande de tirage ?

Sûr.

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

rohitjoshi picture rohitjoshi  ·  10Commentaires

cetra3 picture cetra3  ·  9Commentaires

yiyanwannian picture yiyanwannian  ·  6Commentaires

eupn picture eupn  ·  3Commentaires

iSynaptic picture iSynaptic  ·  12Commentaires