From 0013236e5db378c68d72dedeaf0594e6a851cdd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Renault?= Date: Mon, 28 Jun 2021 16:19:02 +0200 Subject: [PATCH] Fix the LMDB and heed invalid interactions. It is undefined behavior to keep a reference to the database while modifying it, we were keeping references in the database and also feeding the heed put_current methods with keys referenced inside the database itself. https://github.com/Kerollmops/heed/pull/108 --- milli/src/update/delete_documents.rs | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/milli/src/update/delete_documents.rs b/milli/src/update/delete_documents.rs index e291eb106..30ae55e62 100644 --- a/milli/src/update/delete_documents.rs +++ b/milli/src/update/delete_documents.rs @@ -197,7 +197,8 @@ impl<'t, 'u, 'i> DeleteDocuments<'t, 'u, 'i> { iter.del_current()?; *must_remove = true; } else if docids.len() != previous_len { - iter.put_current(key, &docids)?; + let key = key.to_owned(); + iter.put_current(&key, &docids)?; } } } @@ -238,13 +239,14 @@ impl<'t, 'u, 'i> DeleteDocuments<'t, 'u, 'i> { let mut iter = word_prefix_docids.iter_mut(self.wtxn)?; while let Some(result) = iter.next() { let (prefix, mut docids) = result?; + let prefix = prefix.to_owned(); let previous_len = docids.len(); docids.difference_with(&self.documents_ids); if docids.is_empty() { iter.del_current()?; prefixes_to_delete.insert(prefix)?; } else if docids.len() != previous_len { - iter.put_current(prefix, &docids)?; + iter.put_current(&prefix, &docids)?; } } @@ -281,7 +283,8 @@ impl<'t, 'u, 'i> DeleteDocuments<'t, 'u, 'i> { if docids.is_empty() { iter.del_current()?; } else if docids.len() != previous_len { - iter.put_current(key, &docids)?; + let key = key.to_owned(); + iter.put_current(&key, &docids)?; } } @@ -299,7 +302,8 @@ impl<'t, 'u, 'i> DeleteDocuments<'t, 'u, 'i> { if docids.is_empty() { iter.del_current()?; } else if docids.len() != previous_len { - iter.put_current(bytes, &docids)?; + let bytes = bytes.to_owned(); + iter.put_current(&bytes, &docids)?; } } @@ -315,7 +319,8 @@ impl<'t, 'u, 'i> DeleteDocuments<'t, 'u, 'i> { if docids.is_empty() { iter.del_current()?; } else if docids.len() != previous_len { - iter.put_current(bytes, &docids)?; + let bytes = bytes.to_owned(); + iter.put_current(&bytes, &docids)?; } } @@ -331,7 +336,8 @@ impl<'t, 'u, 'i> DeleteDocuments<'t, 'u, 'i> { if docids.is_empty() { iter.del_current()?; } else if docids.len() != previous_len { - iter.put_current(bytes, &docids)?; + let bytes = bytes.to_owned(); + iter.put_current(&bytes, &docids)?; } } @@ -437,7 +443,8 @@ where if docids.is_empty() { iter.del_current()?; } else if docids.len() != previous_len { - iter.put_current(bytes, &docids)?; + let bytes = bytes.to_owned(); + iter.put_current(&bytes, &docids)?; } }