Skip to content

Commit 73a2913

Browse files
authored
Merge pull request #1718 from tursodatabase/schmema-db-replica-regression
Fix schema db bug with replicas
2 parents d8a4e40 + f0c92ca commit 73a2913

File tree

10 files changed

+336
-68
lines changed

10 files changed

+336
-68
lines changed

libsql-server/src/connection/connection_core.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -659,9 +659,15 @@ mod test {
659659
let ctx = RequestContext::new(
660660
Authenticated::FullAccess,
661661
NamespaceName::default(),
662-
MetaStore::new(Default::default(), tmp.path(), maker().unwrap(), manager)
663-
.await
664-
.unwrap(),
662+
MetaStore::new(
663+
Default::default(),
664+
tmp.path(),
665+
maker().unwrap(),
666+
manager,
667+
crate::database::DatabaseKind::Primary,
668+
)
669+
.await
670+
.unwrap(),
665671
);
666672
conn.execute_program(
667673
Program::seq(&["CREATE TABLE test (x)"]),

libsql-server/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -570,6 +570,7 @@ where
570570
&self.path,
571571
meta_conn,
572572
meta_store_wal_manager,
573+
db_kind,
573574
)
574575
.await?;
575576

libsql-server/src/namespace/configurator/replica.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ impl ReplicaConfigurator {
4949
}
5050

5151
impl ConfigureNamespace for ReplicaConfigurator {
52+
#[tracing::instrument(skip_all, fields(name))]
5253
fn setup<'a>(
5354
&'a self,
5455
meta_store_handle: MetaStoreHandle,

libsql-server/src/namespace/meta_store.rs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ use tokio::sync::{
2323

2424
use crate::config::BottomlessConfig;
2525
use crate::connection::config::DatabaseConfig;
26+
use crate::database::DatabaseKind;
2627
use crate::schema::{MigrationDetails, MigrationSummary};
2728
use crate::{
2829
config::MetaStoreConfig, connection::legacy::open_conn_active_checkpoint, error::Error, Result,
@@ -74,6 +75,7 @@ struct MetaStoreInner {
7475
configs: tokio::sync::Mutex<HashMap<NamespaceName, Sender<InnerConfig>>>,
7576
conn: tokio::sync::Mutex<MetaStoreConnection>,
7677
wal_manager: MetaStoreWalManager,
78+
db_kind: DatabaseKind,
7779
}
7880

7981
fn setup_connection(conn: &rusqlite::Connection) -> Result<()> {
@@ -182,13 +184,15 @@ impl MetaStoreInner {
182184
conn: MetaStoreConnection,
183185
wal_manager: MetaStoreWalManager,
184186
config: MetaStoreConfig,
187+
db_kind: DatabaseKind,
185188
) -> Result<Self> {
186189
setup_connection(&conn)?;
187190

188191
let mut this = MetaStoreInner {
189192
configs: Default::default(),
190193
conn: conn.into(),
191194
wal_manager,
195+
db_kind,
192196
};
193197

194198
if config.allow_recover_from_fs {
@@ -350,9 +354,11 @@ fn try_process(
350354
let mut conn = inner.conn.blocking_lock();
351355
if let Some(schema) = config.shared_schema_name.as_ref() {
352356
let tx = conn.transaction()?;
353-
if let Some(ref schema) = config.shared_schema_name {
354-
if crate::schema::db::has_pending_migration_jobs(&tx, schema)? {
355-
return Err(crate::Error::PendingMigrationOnSchema(schema.clone()));
357+
if inner.db_kind.is_primary() {
358+
if let Some(ref schema) = config.shared_schema_name {
359+
if crate::schema::db::has_pending_migration_jobs(&tx, schema)? {
360+
return Err(crate::Error::PendingMigrationOnSchema(schema.clone()));
361+
}
356362
}
357363
}
358364
tx.execute(
@@ -394,6 +400,7 @@ impl MetaStore {
394400
base_path: &Path,
395401
conn: MetaStoreConnection,
396402
wal_manager: MetaStoreWalManager,
403+
db_kind: DatabaseKind,
397404
) -> Result<Self> {
398405
let (changes_tx, mut changes_rx) = mpsc::channel(256);
399406

@@ -402,7 +409,7 @@ impl MetaStore {
402409
let maybe_inner = tokio::task::spawn_blocking({
403410
let base_path = base_path.to_owned();
404411
let config = config.clone();
405-
move || MetaStoreInner::new(&base_path, conn, wal_manager, config.clone())
412+
move || MetaStoreInner::new(&base_path, conn, wal_manager, config.clone(), db_kind)
406413
})
407414
.await
408415
.unwrap();
@@ -446,7 +453,7 @@ impl MetaStore {
446453

447454
let inner = tokio::task::spawn_blocking({
448455
let base_path = base_path.to_owned();
449-
move || MetaStoreInner::new(&base_path, conn, wal, config)
456+
move || MetaStoreInner::new(&base_path, conn, wal, config, db_kind)
450457
})
451458
.await
452459
.unwrap()?;

libsql-server/src/replication/replicator_client.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ impl ReplicatorClient for Client {
121121
.await
122122
.map_err(|e| Status::new(Code::Internal, e.to_string()))?;
123123
}
124+
124125
self.meta_store_handle
125126
.store(DatabaseConfig::from(config))
126127
.await

libsql-server/src/rpc/streaming_exec.rs

Lines changed: 72 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -396,9 +396,15 @@ pub mod test {
396396
let ctx = RequestContext::new(
397397
Authenticated::Anonymous,
398398
NamespaceName::default(),
399-
MetaStore::new(Default::default(), tmp.path(), maker().unwrap(), manager)
400-
.await
401-
.unwrap(),
399+
MetaStore::new(
400+
Default::default(),
401+
tmp.path(),
402+
maker().unwrap(),
403+
manager,
404+
crate::database::DatabaseKind::Primary,
405+
)
406+
.await
407+
.unwrap(),
402408
);
403409
let stream = make_proxy_stream(conn, ctx, ReceiverStream::new(rcv));
404410
pin!(stream);
@@ -422,9 +428,15 @@ pub mod test {
422428
let ctx = RequestContext::new(
423429
Authenticated::FullAccess,
424430
NamespaceName::default(),
425-
MetaStore::new(Default::default(), tmp.path(), maker().unwrap(), manager)
426-
.await
427-
.unwrap(),
431+
MetaStore::new(
432+
Default::default(),
433+
tmp.path(),
434+
maker().unwrap(),
435+
manager,
436+
crate::database::DatabaseKind::Primary,
437+
)
438+
.await
439+
.unwrap(),
428440
);
429441
let stream = make_proxy_stream(conn, ctx, ReceiverStream::new(rcv));
430442

@@ -444,9 +456,15 @@ pub mod test {
444456
let ctx = RequestContext::new(
445457
Authenticated::FullAccess,
446458
NamespaceName::default(),
447-
MetaStore::new(Default::default(), tmp.path(), maker().unwrap(), manager)
448-
.await
449-
.unwrap(),
459+
MetaStore::new(
460+
Default::default(),
461+
tmp.path(),
462+
maker().unwrap(),
463+
manager,
464+
crate::database::DatabaseKind::Primary,
465+
)
466+
.await
467+
.unwrap(),
450468
);
451469
let stream = make_proxy_stream(conn, ctx, ReceiverStream::new(rcv));
452470

@@ -468,9 +486,15 @@ pub mod test {
468486
let ctx = RequestContext::new(
469487
Authenticated::FullAccess,
470488
NamespaceName::default(),
471-
MetaStore::new(Default::default(), tmp.path(), maker().unwrap(), manager)
472-
.await
473-
.unwrap(),
489+
MetaStore::new(
490+
Default::default(),
491+
tmp.path(),
492+
maker().unwrap(),
493+
manager,
494+
crate::database::DatabaseKind::Primary,
495+
)
496+
.await
497+
.unwrap(),
474498
);
475499
// limit the size of the response to force a split
476500
let stream = make_proxy_stream_inner(conn, ctx, ReceiverStream::new(rcv), 500);
@@ -525,9 +549,15 @@ pub mod test {
525549
let ctx = RequestContext::new(
526550
Authenticated::FullAccess,
527551
NamespaceName::default(),
528-
MetaStore::new(Default::default(), tmp.path(), maker().unwrap(), manager)
529-
.await
530-
.unwrap(),
552+
MetaStore::new(
553+
Default::default(),
554+
tmp.path(),
555+
maker().unwrap(),
556+
manager,
557+
crate::database::DatabaseKind::Primary,
558+
)
559+
.await
560+
.unwrap(),
531561
);
532562
let stream = make_proxy_stream(conn, ctx, ReceiverStream::new(rcv));
533563

@@ -552,9 +582,15 @@ pub mod test {
552582
let ctx = RequestContext::new(
553583
Authenticated::FullAccess,
554584
NamespaceName::default(),
555-
MetaStore::new(Default::default(), tmp.path(), maker().unwrap(), manager)
556-
.await
557-
.unwrap(),
585+
MetaStore::new(
586+
Default::default(),
587+
tmp.path(),
588+
maker().unwrap(),
589+
manager,
590+
crate::database::DatabaseKind::Primary,
591+
)
592+
.await
593+
.unwrap(),
558594
);
559595
let stream = make_proxy_stream(conn, ctx, ReceiverStream::new(rcv));
560596

@@ -579,9 +615,15 @@ pub mod test {
579615
let ctx = RequestContext::new(
580616
Authenticated::FullAccess,
581617
NamespaceName::default(),
582-
MetaStore::new(Default::default(), tmp.path(), maker().unwrap(), manager)
583-
.await
584-
.unwrap(),
618+
MetaStore::new(
619+
Default::default(),
620+
tmp.path(),
621+
maker().unwrap(),
622+
manager,
623+
crate::database::DatabaseKind::Primary,
624+
)
625+
.await
626+
.unwrap(),
585627
);
586628
let stream = make_proxy_stream(conn, ctx, ReceiverStream::new(rcv));
587629

@@ -608,9 +650,15 @@ pub mod test {
608650
let ctx = RequestContext::new(
609651
Authenticated::FullAccess,
610652
NamespaceName::default(),
611-
MetaStore::new(Default::default(), tmp.path(), maker().unwrap(), manager)
612-
.await
613-
.unwrap(),
653+
MetaStore::new(
654+
Default::default(),
655+
tmp.path(),
656+
maker().unwrap(),
657+
manager,
658+
crate::database::DatabaseKind::Primary,
659+
)
660+
.await
661+
.unwrap(),
614662
);
615663
let stream = make_proxy_stream(conn, ctx, ReceiverStream::new(rcv));
616664

0 commit comments

Comments
 (0)