linkrs-storage 0.1.0

Storage engine with CSR and memory-mapped containers
Documentation
use crate::index::types::EdgeIdentity;
use crate::index::{EdgeIndexOps, VertexIndexOps};
use linkrs_core::types::Timestamp;
use linkrs_core::{StorageResult, Value};
use std::sync::Arc;

use super::context::GraphStorageContext;

pub fn update_vertex_indexes_mvcc(
    ctx: &GraphStorageContext,
    space_id: u64,
    vertex_id: &Value,
    index_name: &str,
    props: &[(Arc<str>, Value)],
    ts: Timestamp,
) -> StorageResult<()> {
    // Acquire the rebuild gate before the manager write lock. Rebuilds use
    // the same order, which keeps the snapshot/catch-up/publish protocol
    // free of a lock inversion.
    let rebuild_gate = ctx.index_data_manager().read().rebuild_gate();
    let _write_gate = rebuild_gate.read();
    ctx.index_data_manager()
        .write()
        .update_vertex_indexes_mvcc(space_id, vertex_id, index_name, props, ts)
}

pub fn delete_vertex_indexes_mvcc(
    ctx: &GraphStorageContext,
    space_id: u64,
    vertex_id: &Value,
    index_names: &[String],
    ts: Timestamp,
) -> StorageResult<()> {
    let rebuild_gate = ctx.index_data_manager().read().rebuild_gate();
    let _write_gate = rebuild_gate.read();
    ctx.index_data_manager().write().delete_vertex_indexes_mvcc(
        space_id,
        vertex_id,
        index_names,
        ts,
    )
}

pub fn update_edge_indexes_mvcc(
    ctx: &GraphStorageContext,
    edge: &EdgeIdentity<'_>,
    index_name: &str,
    props: &[(Arc<str>, Value)],
    ts: Timestamp,
) -> StorageResult<()> {
    let rebuild_gate = ctx.index_data_manager().read().rebuild_gate();
    let _write_gate = rebuild_gate.read();
    ctx.index_data_manager()
        .write()
        .update_edge_indexes_mvcc(edge, index_name, props, ts)
}

pub fn delete_edge_indexes_mvcc(
    ctx: &GraphStorageContext,
    edge: &EdgeIdentity<'_>,
    index_names: &[String],
    ts: Timestamp,
) -> StorageResult<()> {
    let rebuild_gate = ctx.index_data_manager().read().rebuild_gate();
    let _write_gate = rebuild_gate.read();
    ctx.index_data_manager()
        .write()
        .delete_edge_indexes_mvcc(edge, index_names, ts)
}