Fix the update system to always consume updates even if failing

This commit is contained in:
Clément Renault 2019-10-31 17:27:58 +01:00
parent b73874bf24
commit 6b326a45d7
No known key found for this signature in database
GPG Key ID: 92ADA4E935E71FA4
4 changed files with 52 additions and 30 deletions

View File

@ -12,7 +12,7 @@ crossbeam-channel = "0.3.9"
deunicode = "1.0.0" deunicode = "1.0.0"
env_logger = "0.7.0" env_logger = "0.7.0"
hashbrown = { version = "0.6.0", features = ["serde"] } hashbrown = { version = "0.6.0", features = ["serde"] }
heed = "0.3.0" heed = "0.3.1"
log = "0.4.8" log = "0.4.8"
meilidb-schema = { path = "../meilidb-schema", version = "0.6.0" } meilidb-schema = { path = "../meilidb-schema", version = "0.6.0" }
meilidb-tokenizer = { path = "../meilidb-tokenizer", version = "0.6.0" } meilidb-tokenizer = { path = "../meilidb-tokenizer", version = "0.6.0" }

View File

@ -28,34 +28,63 @@ fn update_awaiter(receiver: Receiver<()>, env: heed::Env, update_fn: Arc<ArcSwap
let mut writer = match env.write_txn() { let mut writer = match env.write_txn() {
Ok(writer) => writer, Ok(writer) => writer,
Err(e) => { Err(e) => {
error!("LMDB writer transaction begin failed: {}", e); error!("LMDB write transaction begin failed: {}", e);
break; break;
} }
}; };
match update::update_task(&mut writer, index.clone()) { let (update_id, update) = match index.updates.pop_front(&mut writer) {
Ok(Some(status)) => { Ok(Some(value)) => value,
match status.result {
Ok(_) => {
if let Err(e) = writer.commit() {
error!("update transaction failed: {}", e)
}
}
Err(_) => writer.abort(),
}
if let Some(ref callback) = *update_fn.load() {
(callback)(status);
}
}
// no more updates to handle for now
Ok(None) => { Ok(None) => {
debug!("no more updates"); debug!("no more updates");
writer.abort(); writer.abort();
break; break;
} }
Err(e) => {
error!("pop front update failed: {}", e);
break;
}
};
let mut nested_writer = match unsafe { env.nested_write_txn(&writer) } {
Ok(writer) => writer,
Err(e) => {
error!("LMDB nested write transaction begin failed: {}", e);
break;
}
};
match update::update_task(&mut nested_writer, index.clone(), update_id, update) {
Ok(status) => {
match &status.result {
Ok(_) => {
if let Err(e) = nested_writer.commit() {
error!("update nested transaction failed: {}", e);
}
}
Err(_) => nested_writer.abort(),
}
let result =
index
.updates_results
.put_update_result(&mut writer, update_id, &status);
if let Err(e) = result {
error!("update result store commit failed: {}", e);
}
if let Err(e) = writer.commit() {
error!("update parent transaction failed: {}", e);
}
if let Some(ref callback) = *update_fn.load() {
(callback)(status);
}
}
Err(e) => { Err(e) => {
error!("update task failed: {}", e); error!("update task failed: {}", e);
nested_writer.abort();
writer.abort() writer.abort()
} }
} }

View File

@ -152,12 +152,9 @@ pub fn next_update_id(
pub fn update_task( pub fn update_task(
writer: &mut heed::RwTxn, writer: &mut heed::RwTxn,
index: store::Index, index: store::Index,
) -> MResult<Option<ProcessedUpdateResult>> { update_id: u64,
let (update_id, update) = match index.updates.pop_front(writer)? { update: Update,
Some(value) => value, ) -> MResult<ProcessedUpdateResult> {
None => return Ok(None),
};
debug!("Processing update number {}", update_id); debug!("Processing update number {}", update_id);
let (update_type, result, duration) = match update { let (update_type, result, duration) = match update {
@ -308,9 +305,5 @@ pub fn update_task(
detailed_duration, detailed_duration,
}; };
index Ok(status)
.updates_results
.put_update_result(writer, update_id, &status)?;
Ok(Some(status))
} }

View File

@ -13,7 +13,7 @@ chrono = { version = "0.4.9", features = ["serde"] }
crossbeam-channel = "0.3.9" crossbeam-channel = "0.3.9"
envconfig = "0.5.1" envconfig = "0.5.1"
envconfig_derive = "0.5.1" envconfig_derive = "0.5.1"
heed = "0.3.0" heed = "0.3.1"
http = "0.1.19" http = "0.1.19"
indexmap = { version = "1.3.0", features = ["serde-1"] } indexmap = { version = "1.3.0", features = ["serde-1"] }
jemallocator = "0.3.2" jemallocator = "0.3.2"