Rust-rocksdb: WriteBatchのシリアル化と逆シリアル化をサポートします。

作成日 2021年01月07日  ·  4コメント  ·  ソース: rust-rocksdb/rust-rocksdb

こんにちは、rocksdbインスタンス間のレプリケーションを実装したいと思います。 私が理解している限り、rust-rocksdbは、最後の1つの機能であるwritebatchシリアル化を除いて、必要なすべてのAPIをサポートしています。 レプリケーションのためにネットワーク経由で送信できるように、バイトからWriteBatchを作成し、バイトにシリアル化したい。

それを達成する方法はありますか? または、自分のソリューションでPRを行うことができます。

最も参考になるコメント

私は次のようなものが必要です:

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

writeBatchの生の値を使用すると、ネットワーク経由でセカンダリデータベースレプリカに送信できます。

全てのコメント4件

返事が遅れて申し訳ありません。 正直なところ、私は現在RocksDBに関連することにはあまり関わっていないので、あなたの状況を完全には理解していません。 追加する必要のあるAPIについて詳しく教えてください。

私は次のようなものが必要です:

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

writeBatchの生の値を使用すると、ネットワーク経由でセカンダリデータベースレプリカに送信できます。

そのようなAPIを追加するのは理にかなっていると思います。 プルリクエストを送信しますか?

もちろん。

このページは役に立ちましたか?
0 / 5 - 0 評価