Verified Commit eb4485a4 authored by Adam Mulvany's avatar Adam Mulvany Committed by GitLab
Browse files

chore(ontology): load embedded ontology once via shared Arc

parent 94deb58e
Loading
Loading
Loading
Loading
+12 −3
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@ use std::sync::Arc;

use clickhouse_client::ClickHouseConfiguration;
use labkit_rs::correlation::grpc::server_interceptor;
use ontology::Ontology;
use tonic::transport::Server as TonicServer;
use tracing::info;

@@ -27,10 +28,12 @@ impl GrpcServer {
    pub fn new(
        addr: SocketAddr,
        validator: Arc<JwtValidator>,
        ontology: Arc<Ontology>,
        clickhouse_config: &ClickHouseConfiguration,
        cluster_health: Arc<ClusterHealthChecker>,
    ) -> Self {
        let service = KnowledgeGraphServiceImpl::new(validator, clickhouse_config, cluster_health);
        let service =
            KnowledgeGraphServiceImpl::new(validator, ontology, clickhouse_config, cluster_health);
        Self {
            addr,
            service: KnowledgeGraphServiceServer::with_interceptor(service, server_interceptor),
@@ -61,10 +64,16 @@ mod tests {
        let addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 50054);
        let validator =
            Arc::new(JwtValidator::new("test-secret-that-is-at-least-32-bytes-long", 0).unwrap());
        let ontology = Arc::new(Ontology::load_embedded().expect("ontology must load"));
        let clickhouse_config = ClickHouseConfiguration::default();

        let cluster_health = ClusterHealthChecker::default().into_arc();
        let server = GrpcServer::new(addr, validator, &clickhouse_config, cluster_health);
        let server = GrpcServer::new(
            addr,
            validator,
            ontology,
            &clickhouse_config,
            cluster_health,
        );
        assert_eq!(server.addr(), addr);
    }
}
+14 −1
Original line number Diff line number Diff line
@@ -44,10 +44,10 @@ pub struct KnowledgeGraphServiceImpl {
impl KnowledgeGraphServiceImpl {
    pub fn new(
        validator: Arc<JwtValidator>,
        ontology: Arc<Ontology>,
        clickhouse_config: &ClickHouseConfiguration,
        cluster_health: Arc<ClusterHealthChecker>,
    ) -> Self {
        let ontology = Arc::new(Ontology::load_embedded().expect("Failed to load ontology"));
        let client = Arc::new(clickhouse_config.build_client());
        let tool_service = ToolService::new(Arc::clone(&ontology));
        let query_pipeline =
@@ -387,6 +387,10 @@ mod tests {
        JwtValidator::new("test-secret-that-is-at-least-32-bytes-long", 0).unwrap()
    }

    fn test_ontology() -> Arc<Ontology> {
        Arc::new(Ontology::load_embedded().expect("ontology must load"))
    }

    fn test_config() -> ClickHouseConfiguration {
        ClickHouseConfiguration::default()
    }
@@ -396,6 +400,7 @@ mod tests {
        let validator = Arc::new(mock_validator());
        let service = KnowledgeGraphServiceImpl::new(
            validator,
            test_ontology(),
            &test_config(),
            ClusterHealthChecker::default().into_arc(),
        );
@@ -421,6 +426,7 @@ mod tests {
        let validator = Arc::new(mock_validator());
        let service = KnowledgeGraphServiceImpl::new(
            validator,
            test_ontology(),
            &test_config(),
            ClusterHealthChecker::default().into_arc(),
        );
@@ -448,6 +454,7 @@ mod tests {
        let validator = Arc::new(mock_validator());
        let service = KnowledgeGraphServiceImpl::new(
            validator,
            test_ontology(),
            &test_config(),
            ClusterHealthChecker::default().into_arc(),
        );
@@ -481,6 +488,7 @@ mod tests {
        let validator = Arc::new(mock_validator());
        let service = KnowledgeGraphServiceImpl::new(
            validator,
            test_ontology(),
            &test_config(),
            ClusterHealthChecker::default().into_arc(),
        );
@@ -502,6 +510,7 @@ mod tests {
        let validator = Arc::new(mock_validator());
        let service = KnowledgeGraphServiceImpl::new(
            validator,
            test_ontology(),
            &test_config(),
            ClusterHealthChecker::default().into_arc(),
        );
@@ -517,6 +526,7 @@ mod tests {
        let validator = Arc::new(mock_validator());
        let service = KnowledgeGraphServiceImpl::new(
            validator,
            test_ontology(),
            &test_config(),
            ClusterHealthChecker::default().into_arc(),
        );
@@ -543,6 +553,7 @@ mod tests {
        let validator = Arc::new(mock_validator());
        let service = KnowledgeGraphServiceImpl::new(
            validator,
            test_ontology(),
            &test_config(),
            ClusterHealthChecker::default().into_arc(),
        );
@@ -564,6 +575,7 @@ mod tests {
        let validator = Arc::new(mock_validator());
        let service = KnowledgeGraphServiceImpl::new(
            validator,
            test_ontology(),
            &test_config(),
            ClusterHealthChecker::default().into_arc(),
        );
@@ -589,6 +601,7 @@ mod tests {
        let validator = Arc::new(mock_validator());
        let service = KnowledgeGraphServiceImpl::new(
            validator,
            test_ontology(),
            &test_config(),
            ClusterHealthChecker::default().into_arc(),
        );
+9 −5
Original line number Diff line number Diff line
@@ -30,7 +30,8 @@ async fn main() -> anyhow::Result<()> {

    let args = Args::parse();
    let config = AppConfig::load()?;
    ontology::constants::validate_ontology_constants();
    let ontology = Arc::new(ontology::Ontology::load_embedded().expect("ontology must load"));
    ontology::constants::validate_ontology_constants(&ontology);

    let _metrics = labkit_rs::metrics::try_init_with_config(config.metrics.clone()).ok();

@@ -47,7 +48,6 @@ async fn main() -> anyhow::Result<()> {
            let metrics = ScheduledTaskMetrics::new();
            let lock_service = services.lock_service.clone();

            let ontology = ontology::Ontology::load_embedded().expect("ontology must load");
            let deletion_graph = Arc::new(config.graph.build_client());
            let deletion_datalake = Arc::new(config.datalake.build_client());
            let deletion_store: Arc<dyn NamespaceDeletionStore> =
@@ -104,11 +104,11 @@ async fn main() -> anyhow::Result<()> {
                schedule: config.schedule.clone(),
                health_bind_address: config.indexer_health_bind_address,
            };
            indexer::run(&indexer_config, shutdown)
            indexer::run(&indexer_config, ontology, shutdown)
                .await
                .map_err(Into::into)
        }
        Mode::Webserver => run_webserver(&config).await,
        Mode::Webserver => run_webserver(&config, ontology).await,
    };

    signal_task.abort();
@@ -116,7 +116,10 @@ async fn main() -> anyhow::Result<()> {
    result
}

async fn run_webserver(config: &AppConfig) -> anyhow::Result<()> {
async fn run_webserver(
    config: &AppConfig,
    ontology: Arc<ontology::Ontology>,
) -> anyhow::Result<()> {
    let validator = Arc::new(JwtValidator::new(
        config.jwt_secret()?,
        config.jwt_clock_skew_secs,
@@ -131,6 +134,7 @@ async fn run_webserver(config: &AppConfig) -> anyhow::Result<()> {
    let grpc_server = GrpcServer::new(
        config.grpc_bind_address,
        validator,
        ontology,
        &config.graph,
        cluster_health,
    );
+5 −4
Original line number Diff line number Diff line
@@ -119,7 +119,11 @@ pub enum IndexerError {
}

/// Runs the indexer until completion or until the token is cancelled.
pub async fn run(config: &IndexerConfig, shutdown: CancellationToken) -> Result<(), IndexerError> {
pub async fn run(
    config: &IndexerConfig,
    ontology: Arc<ontology::Ontology>,
    shutdown: CancellationToken,
) -> Result<(), IndexerError> {
    info!(url = %config.nats.url, "connecting to NATS");
    let broker = Arc::new(NatsBroker::connect(&config.nats).await?);

@@ -138,9 +142,6 @@ pub async fn run(config: &IndexerConfig, shutdown: CancellationToken) -> Result<

    let registry = Arc::new(HandlerRegistry::default());

    info!("loading embedded ontology");
    let ontology = ontology::Ontology::load_embedded().map_err(HandlerInitError::new)?;

    info!("initializing SDLC handlers");
    modules::sdlc::register_handlers(&registry, config, &ontology).await?;

+3 −4
Original line number Diff line number Diff line
@@ -40,9 +40,7 @@ pub const TRAVERSAL_PATH_COLUMN: &str = "traversal_path";
/// Panics if compile-time constants diverge from the embedded ontology YAML.
///
/// Call this at startup and in a `#[test]` so CI catches stale constants.
pub fn validate_ontology_constants() {
    let ontology = crate::Ontology::load_embedded().expect("embedded ontology must be valid");

pub fn validate_ontology_constants(ontology: &crate::Ontology) {
    assert_eq!(
        ontology.table_prefix(),
        GL_TABLE_PREFIX,
@@ -66,6 +64,7 @@ mod tests {

    #[test]
    fn ontology_constants_match_yaml() {
        validate_ontology_constants();
        let ontology = crate::Ontology::load_embedded().expect("embedded ontology must be valid");
        validate_ontology_constants(&ontology);
    }
}