Skip to content

Commit bc1aa6b

Browse files
committed
wip
1 parent a35b9f0 commit bc1aa6b

File tree

8 files changed

+86
-32
lines changed

8 files changed

+86
-32
lines changed

.tool-versions

Lines changed: 0 additions & 1 deletion
This file was deleted.

mise.toml

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,8 @@ echo
309309
mise --env tcp run postgres:setup
310310
mise --env tls run postgres:setup
311311
312+
mise run test:integration:showcase
313+
312314
echo
313315
echo '###############################################'
314316
echo '# Test: Prometheus'
@@ -377,10 +379,8 @@ echo '###############################################'
377379
echo '# Test: Showcase'
378380
echo '###############################################'
379381
echo
380-
mise --env tls run proxy:up proxy-tls --extra-args "--detach --wait"
381-
mise --env tls run test:wait_for_postgres_to_quack --port 6432 --max-retries 20 --tls
382-
RUST_BACKTRACE=full cargo run -p showcase
383-
mise --env tls run proxy:down
382+
383+
mise run test:integration:showcase
384384
385385
echo
386386
echo '###############################################'
@@ -637,6 +637,15 @@ else
637637
fi
638638
"""
639639

640+
[tasks."test:integration:showcase"]
641+
description = "Run Showcase integration test"
642+
run = """
643+
mise --env tls run proxy:up proxy-tls --extra-args "--detach --wait"
644+
mise --env tls run test:wait_for_postgres_to_quack --port 6432 --max-retries 20 --tls
645+
RUST_BACKTRACE=full cargo run -p showcase
646+
mise --env tls run proxy:down
647+
"""
648+
640649
[tasks.release]
641650
description = "Publish release artifacts"
642651
depends = ["release:docker"]

packages/cipherstash-proxy/src/postgresql/context/mod.rs

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ use std::{
2424
sync::{Arc, LazyLock, RwLock},
2525
time::{Duration, Instant},
2626
};
27+
use tokio::sync::oneshot;
2728
use tracing::{debug, error, warn};
2829
use uuid::Uuid;
2930

@@ -311,6 +312,10 @@ where
311312
}
312313

313314
pub fn set_schema_changed(&self) {
315+
debug!(target: CONTEXT,
316+
client_id = self.client_id,
317+
msg = "Schema changed"
318+
);
314319
let _ = self.schema_changed.write().map(|mut guard| *guard = true);
315320
}
316321

@@ -510,15 +515,38 @@ where
510515
}
511516

512517
pub async fn reload_schema(&self) {
513-
match self.reload_sender.send(ReloadCommand::DatabaseSchema) {
514-
Ok(_) => self.set_schema_changed(),
518+
let (responder, receiver) = oneshot::channel();
519+
520+
// let _ = self
521+
// .reload_sender
522+
// .send(ReloadCommand::DatabaseSchema(responder))
523+
// .inspect_err(|err| {
524+
// // Error means a fatal internal error in send.
525+
// // No recovery really possible
526+
// // Log because may break subsequent statements and lead to confusion
527+
// error!(
528+
// target: CONTEXT,
529+
// msg = "Database schema could not be reloaded",
530+
// error = err.to_string()
531+
// )
532+
// });
533+
534+
match self
535+
.reload_sender
536+
.send(ReloadCommand::DatabaseSchema(responder))
537+
{
538+
Ok(_) => (),
515539
Err(err) => {
516540
error!(
517541
msg = "Database schema could not be reloaded",
518542
error = err.to_string()
519543
);
520544
}
521545
}
546+
547+
debug!(target: CONTEXT, msg = "Waiting for schema reload");
548+
let response = receiver.await;
549+
debug!(target: CONTEXT, msg = "Database schema reloaded", ?response);
522550
}
523551

524552
pub fn is_passthrough(&self) -> bool {

packages/cipherstash-proxy/src/postgresql/frontend.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -746,10 +746,6 @@ where
746746
let schema_changed = eql_mapper::collect_ddl(self.context.get_table_resolver(), statement);
747747

748748
if schema_changed {
749-
debug!(target: MAPPER,
750-
client_id = self.context.client_id,
751-
msg = "schema changed"
752-
);
753749
self.context.set_schema_changed();
754750
}
755751
}

packages/cipherstash-proxy/src/proxy/mod.rs

Lines changed: 37 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ use crate::{
99
};
1010
use cipherstash_client::encryption::Plaintext;
1111
use tokio::sync::mpsc::{self, UnboundedReceiver, UnboundedSender};
12-
use tracing::warn;
12+
use tokio::sync::oneshot::Sender;
13+
use tracing::{debug, warn};
1314

1415
mod encrypt_config;
1516
mod schema;
@@ -22,6 +23,8 @@ pub type ReloadSender = UnboundedSender<ReloadCommand>;
2223

2324
type ReloadReceiver = UnboundedReceiver<ReloadCommand>;
2425

26+
pub type ReloadResponder = Sender<()>;
27+
2528
/// SQL Statement for loading encrypt configuration from database
2629
const ENCRYPT_CONFIG_QUERY: &str = include_str!("./sql/select_config.sql");
2730

@@ -31,10 +34,10 @@ const SCHEMA_QUERY: &str = include_str!("./sql/select_table_schemas.sql");
3134
/// SQL Statement for loading aggregates as part of database schema
3235
const AGGREGATE_QUERY: &str = include_str!("./sql/select_aggregates.sql");
3336

34-
#[derive(Debug, Clone, Copy)]
37+
#[derive(Debug)]
3538
pub enum ReloadCommand {
36-
DatabaseSchema,
37-
EncryptSchema,
39+
DatabaseSchema(ReloadResponder),
40+
EncryptSchema(ReloadResponder),
3841
}
3942

4043
///
@@ -48,7 +51,6 @@ pub struct Proxy {
4851
pub eql_version: Option<String>,
4952
zerokms: ZeroKms,
5053
reload_sender: ReloadSender,
51-
reload_receiver: ReloadReceiver,
5254
}
5355

5456
impl Proxy {
@@ -59,22 +61,27 @@ impl Proxy {
5961
// Ensures error on start if credential or network issue
6062
zerokms.init_cipher(None).await?;
6163

62-
let encrypt_config = EncryptConfigManager::init(&config.database).await?;
64+
let encrypt_config_manager = EncryptConfigManager::init(&config.database).await?;
6365

64-
let schema = SchemaManager::init(&config.database).await?;
66+
let schema_manager = SchemaManager::init(&config.database).await?;
6567

6668
let eql_version = Proxy::eql_version(&config).await?;
6769

6870
let (reload_sender, reload_receiver) = mpsc::unbounded_channel();
6971

72+
Proxy::receive(
73+
reload_receiver,
74+
schema_manager.clone(),
75+
encrypt_config_manager.clone(),
76+
);
77+
7078
Ok(Proxy {
7179
config: Arc::new(config),
7280
zerokms,
73-
encrypt_config_manager: encrypt_config,
74-
schema_manager: schema,
81+
encrypt_config_manager,
82+
schema_manager,
7583
eql_version,
7684
reload_sender,
77-
reload_receiver,
7885
})
7986
}
8087

@@ -97,13 +104,27 @@ impl Proxy {
97104
Ok(version)
98105
}
99106

100-
pub async fn receive(&mut self) {
101-
while let Some(command) = self.reload_receiver.recv().await {
102-
match command {
103-
ReloadCommand::DatabaseSchema => self.schema_manager.reload().await,
104-
ReloadCommand::EncryptSchema => self.encrypt_config_manager.reload().await,
107+
pub fn receive(
108+
mut reload_receiver: ReloadReceiver,
109+
schema_manager: SchemaManager,
110+
encrypt_config_manager: EncryptConfigManager,
111+
) {
112+
tokio::task::spawn(async move {
113+
while let Some(command) = reload_receiver.recv().await {
114+
debug!(msg = "ReloadCommand received", ?command);
115+
match command {
116+
ReloadCommand::DatabaseSchema(responder) => {
117+
schema_manager.reload().await;
118+
encrypt_config_manager.reload().await;
119+
let _ = responder.send(());
120+
}
121+
ReloadCommand::EncryptSchema(responder) => {
122+
encrypt_config_manager.reload().await;
123+
let _ = responder.send(());
124+
}
125+
}
105126
}
106-
}
127+
});
107128
}
108129

109130
///

packages/showcase/src/data.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use crate::{
88
};
99

1010
pub async fn insert_test_data() {
11+
println!("Insert test data");
1112
let medications = [
1213
Medication::new(
1314
"550e8400-e29b-41d4-a716-446655440001",
@@ -496,8 +497,6 @@ pub async fn clear() {
496497
//
497498
// Deleting rows from the eql_v2_configuration table is not officially supported due to the risk of data loss.
498499
//
499-
// TODO: EQL should support safe removal of config rows - at least in some kind of "test" or non-production
500-
// mode.
501500
let sql = r#"
502501
DELETE
503502
FROM public.eql_v2_configuration

packages/showcase/src/main.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,17 +66,18 @@ use crate::{
6666

6767
#[tokio::main]
6868
async fn main() -> Result<(), Box<dyn std::error::Error>> {
69+
println!("🩺 Healthcare Database Showcase - EQL v2 Searchable Encryption");
70+
println!("============================================================");
71+
6972
trace();
7073
clear().await;
74+
7175
setup_schema().await;
7276
insert_test_data().await;
7377
create_enhanced_jsonb_test_data().await;
7478

7579
let client = connect_with_tls(PROXY).await;
7680

77-
println!("🩺 Healthcare Database Showcase - EQL v2 Searchable Encryption");
78-
println!("============================================================");
79-
8081
// Query 1: Get the Aspirin medication ID
8182
let aspirin_id_sql = "SELECT id FROM medications WHERE name = 'Aspirin';";
8283
let rows = client.query(aspirin_id_sql, &[]).await.unwrap();

packages/showcase/src/schema.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@ use crate::common::{reset_schema_to, PROXY};
33
const SCHEMA: &str = include_str!("./schema.sql");
44

55
pub async fn setup_schema() {
6+
println!("Setup schema");
67
reset_schema_to(SCHEMA, PROXY).await
78
}

0 commit comments

Comments
 (0)