This is an automated email from the ASF dual-hosted git repository.

mssun pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-teaclave.git

commit 67630008ee75b660ea86d96ae44e206eb91137b9
Author: sunhe05 <[email protected]>
AuthorDate: Tue Nov 8 04:40:51 2022 +0000

    LevelDB-SGX: omit SGX recovery files when traversing DB files
---
 common/rusty_leveldb_sgx/src/db_impl.rs | 20 ++++++++++++++++++--
 common/rusty_leveldb_sgx/src/types.rs   |  5 +++++
 2 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/common/rusty_leveldb_sgx/src/db_impl.rs 
b/common/rusty_leveldb_sgx/src/db_impl.rs
index e2d9aa3f..55629ac6 100644
--- a/common/rusty_leveldb_sgx/src/db_impl.rs
+++ b/common/rusty_leveldb_sgx/src/db_impl.rs
@@ -12,7 +12,7 @@ use crate::db_iter::DBIterator;
 
 use crate::cmp::{Cmp, InternalKeyCmp};
 use crate::env::{Env, FileLock};
-use crate::error::{err, Result, StatusCode};
+use crate::error::{err, Result, Status, StatusCode};
 use crate::filter::{BoxedFilterPolicy, InternalFilterPolicy};
 use crate::infolog::Logger;
 use crate::key_types::{parse_internal_key, InternalKey, LookupKey, ValueType};
@@ -25,7 +25,7 @@ use crate::table_builder::TableBuilder;
 use crate::table_cache::{table_file_name, TableCache};
 use crate::types::{
     parse_file_name, share, FileMetaData, FileNum, FileType, LdbIterator, 
SequenceNumber, Shared,
-    MAX_SEQUENCE_NUMBER, NUM_LEVELS,
+    MAX_SEQUENCE_NUMBER, NUM_LEVELS, SGX_RECOVERY_FILE_SUFFIX,
 };
 use crate::version::Version;
 use crate::version_edit::VersionEdit;
@@ -191,6 +191,14 @@ impl DB {
         let mut log_files = vec![];
 
         for file in &filenames {
+            if file
+                .to_str()
+                .ok_or_else(|| Status::new(StatusCode::InvalidArgument, "not 
valid UTF-8"))?
+                .ends_with(SGX_RECOVERY_FILE_SUFFIX)
+            {
+                continue;
+            }
+
             match parse_file_name(&file) {
                 Ok((num, typ)) => {
                     expected.remove(&num);
@@ -310,6 +318,14 @@ impl DB {
         let files = self.vset.borrow().live_files();
         let filenames = self.opt.env.children(Path::new(&self.path))?;
         for name in filenames {
+            if name
+                .to_str()
+                .ok_or_else(|| Status::new(StatusCode::InvalidArgument, "not 
valid UTF-8"))?
+                .ends_with(SGX_RECOVERY_FILE_SUFFIX)
+            {
+                continue;
+            }
+
             if let Ok((num, typ)) = parse_file_name(&name) {
                 match typ {
                     FileType::Log => {
diff --git a/common/rusty_leveldb_sgx/src/types.rs 
b/common/rusty_leveldb_sgx/src/types.rs
index b4da1d68..d05e58d5 100644
--- a/common/rusty_leveldb_sgx/src/types.rs
+++ b/common/rusty_leveldb_sgx/src/types.rs
@@ -10,6 +10,10 @@ use std::rc::Rc;
 
 pub const NUM_LEVELS: usize = 7;
 
+// SGX protected fs saves the recovery file in the same directory as the 
original file.
+// It should not be pared for db use.
+pub static SGX_RECOVERY_FILE_SUFFIX: &str = "_recovery";
+
 /// Represents a sequence number of a single entry.
 pub type SequenceNumber = u64;
 
@@ -211,5 +215,6 @@ pub mod tests {
         assert!(parse_file_name("01a.sst").is_err());
         assert!(parse_file_name("0011.abc").is_err());
         assert!(parse_file_name("MANIFEST-trolol").is_err());
+        assert!(parse_file_name("000167.log_recovery").is_err());
     }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to