Rust-rocksdb: Unterstützt WriteBatch-Serialisierung und -Deserialisierung.

Erstellt am 7. Jan. 2021  ·  4Kommentare  ·  Quelle: rust-rocksdb/rust-rocksdb

Hallo, ich möchte die Replikation zwischen rocksdb-Instanzen implementieren. Soweit ich weiß, unterstützt rust-rocksdb jetzt alle erforderlichen APIs, mit Ausnahme einer letzten Funktion - Writebatch-Serialisierung. Ich möchte WriteBatch aus Bytes erstellen und in Bytes serialisieren, um es zur Replikation über das Netzwerk senden zu können.

Gibt es eine Möglichkeit, dies zu erreichen? Oder ich kann mit meiner Lösung PR machen.

Hilfreichster Kommentar

Ich brauche so etwas wie:

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

Mit dem Rohwert von writeBatch könnte ich ihn über das Netzwerk an das Replikat der sekundären Datenbank senden.

Alle 4 Kommentare

Entschuldigung für die späte Antwort. Ehrlich gesagt bin ich jetzt weniger mit RocksDB zu tun, daher verstehe ich Ihre Situation nicht ganz. Könnten Sie bitte erläutern, welche API hinzugefügt werden muss?

Ich brauche so etwas wie:

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

Mit dem Rohwert von writeBatch könnte ich ihn über das Netzwerk an das Replikat der sekundären Datenbank senden.

Ich denke, es macht Sinn, eine solche API hinzuzufügen. Möchten Sie einen Pull-Request senden?

Sicher.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

valeriansaliou picture valeriansaliou  ·  4Kommentare

eupn picture eupn  ·  3Kommentare

iSynaptic picture iSynaptic  ·  5Kommentare

benoitc picture benoitc  ·  7Kommentare

iSynaptic picture iSynaptic  ·  12Kommentare