Apply compatible DB sync batches
This commit is contained in:
parent
f7f14f6b27
commit
43433dbf1d
8 changed files with 185 additions and 26 deletions
|
|
@ -1386,6 +1386,7 @@ async fn db_sync_from_peer(
|
|||
endpoint_id,
|
||||
name: response_name,
|
||||
changes_received: 0,
|
||||
changes_applied: 0,
|
||||
max_db_version: None,
|
||||
schema_match: false,
|
||||
allowed,
|
||||
|
|
@ -1394,25 +1395,37 @@ async fn db_sync_from_peer(
|
|||
});
|
||||
}
|
||||
let local_schema = geth_db::schema_metadata(Path::new(&local.path))?;
|
||||
let (changes_received, max_db_version, schema_match) = if let Some(batch) = batch {
|
||||
let schema_match = batch.schema_metadata == local_schema;
|
||||
let changes_received = batch.changes.len();
|
||||
let max_db_version = batch.max_db_version;
|
||||
if schema_match {
|
||||
if let Some(next_cursor) = high_water_db_version.or(max_db_version) {
|
||||
store_live_sync_cursor(&store, peer_node, &stream, next_cursor)?;
|
||||
let (changes_received, changes_applied, max_db_version, schema_match) =
|
||||
if let Some(batch) = batch {
|
||||
let schema_match = batch.schema_metadata == local_schema;
|
||||
let changes_received = batch.changes.len();
|
||||
let max_db_version = batch.max_db_version;
|
||||
let changes_applied = if schema_match {
|
||||
geth_db::apply_crsqlite_changes(Path::new(&local.path), &batch)?
|
||||
} else {
|
||||
0
|
||||
};
|
||||
if schema_match {
|
||||
if let Some(next_cursor) = high_water_db_version.or(max_db_version) {
|
||||
store_live_sync_cursor(&store, peer_node, &stream, next_cursor)?;
|
||||
}
|
||||
}
|
||||
}
|
||||
(changes_received, max_db_version, schema_match)
|
||||
} else {
|
||||
(0, high_water_db_version, false)
|
||||
};
|
||||
(
|
||||
changes_received,
|
||||
changes_applied,
|
||||
max_db_version,
|
||||
schema_match,
|
||||
)
|
||||
} else {
|
||||
(0, 0, high_water_db_version, false)
|
||||
};
|
||||
Ok(ControlResponse::DbSynced {
|
||||
peer_node_id: node_id,
|
||||
peer_agent_id: agent_id,
|
||||
endpoint_id,
|
||||
name: response_name,
|
||||
changes_received,
|
||||
changes_applied,
|
||||
max_db_version,
|
||||
schema_match,
|
||||
allowed,
|
||||
|
|
@ -2445,7 +2458,7 @@ async fn handle_iroh_control_connection(
|
|||
reason: explanation.reason,
|
||||
evaluated_ops: explanation.evaluated_ops,
|
||||
nonce,
|
||||
note: "DB sync authenticated endpoint/card binding and required db.sync on the remote DB resource; bootstrap exchanges typed crsql_changes and cursors them, but applying remote changes is not implemented yet".to_owned(),
|
||||
note: "DB sync authenticated endpoint/card binding and required db.sync on the remote DB resource; bootstrap exchanges typed crsql_changes and applies compatible batches through local crsql_changes".to_owned(),
|
||||
},
|
||||
Err(message) => PeerControlResponse::Error { message },
|
||||
}
|
||||
|
|
@ -4953,12 +4966,14 @@ mod tests {
|
|||
ControlResponse::DbSynced {
|
||||
allowed,
|
||||
changes_received,
|
||||
changes_applied,
|
||||
schema_match,
|
||||
reason,
|
||||
..
|
||||
} => {
|
||||
assert!(!allowed);
|
||||
assert_eq!(changes_received, 0);
|
||||
assert_eq!(changes_applied, 0);
|
||||
assert!(!schema_match);
|
||||
assert!(reason.contains("no active direct or group grant"));
|
||||
}
|
||||
|
|
@ -5322,6 +5337,7 @@ mod tests {
|
|||
ControlResponse::DbSynced {
|
||||
allowed,
|
||||
changes_received,
|
||||
changes_applied,
|
||||
max_db_version,
|
||||
schema_match,
|
||||
reason,
|
||||
|
|
@ -5330,14 +5346,19 @@ mod tests {
|
|||
} => {
|
||||
assert!(allowed);
|
||||
assert_eq!(changes_received, 1);
|
||||
assert_eq!(changes_applied, 1);
|
||||
assert_eq!(max_db_version, Some(7));
|
||||
assert!(schema_match);
|
||||
assert!(reason.contains("direct grant"));
|
||||
assert!(note.contains("db.sync"));
|
||||
assert!(note.contains("applying remote changes is not implemented yet"));
|
||||
assert!(note.contains("applies compatible batches"));
|
||||
}
|
||||
other => panic!("unexpected allowed DB sync response: {other:?}"),
|
||||
}
|
||||
let left_changes = geth_db::extract_crsqlite_changes(&left_db_path, None, 10)
|
||||
.expect("left db changes after apply");
|
||||
assert_eq!(left_changes.changes.len(), 1);
|
||||
assert_eq!(left_changes.max_db_version, Some(7));
|
||||
|
||||
let denied_cert_sync = handle_request_async(
|
||||
&left,
|
||||
|
|
|
|||
Loading…
Reference in a new issue