Skip to content

Commit 504b5ac

Browse files
authored
Merge pull request #24 from rustbase/hotfix/update-index
fix: update index on flush
2 parents 24eb8cd + 4b8cb18 commit 504b5ac

2 files changed

Lines changed: 45 additions & 50 deletions

File tree

src/storage/lsm/index/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ pub fn write_index(path: &path::Path, index: &HashMap<String, String>) {
2323
let mut file = fs::File::create(_path).unwrap();
2424
file.write_all(&doc).unwrap();
2525

26+
file.sync_data().unwrap();
2627
file.flush().unwrap();
2728
}
2829

src/storage/lsm/mod.rs

Lines changed: 44 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -116,18 +116,14 @@ impl Lsm {
116116
});
117117
}
118118

119-
let mut memtable = self.memtable.write().unwrap();
120-
121-
if memtable.contains_key(&key.to_string()) {
122-
memtable.remove(&key.to_string());
119+
let value = self.memtable.write().unwrap().remove(&key.to_string());
120+
self.dense_index.write().unwrap().remove(&key.to_string());
121+
self.bloom_filter.write().unwrap().delete(key);
123122

124-
drop(memtable);
125-
} else {
126-
self.dense_index.write().unwrap().remove(&key.to_string());
123+
if let Some(value) = value {
124+
self.memtable_size += mem::size_of_val(&value);
127125
}
128126

129-
self.bloom_filter.write().unwrap().delete(key);
130-
131127
Ok(())
132128
}
133129

@@ -160,38 +156,37 @@ impl Lsm {
160156

161157
pub fn flush(&mut self) -> Result<()> {
162158
let memtable = self.get_memtable();
163-
164-
if memtable.is_empty() {
165-
return Ok(());
166-
}
167-
168159
let mut dense_index = self.dense_index.write().unwrap();
169160

170-
let segments = sstable::Segment::from_tree(&memtable, &self.lsm_config.sstable_path);
171-
172-
for token in segments.1 {
173-
dense_index.insert(token.0, token.1);
174-
}
161+
if memtable.is_empty() {
162+
index::write_index(&self.lsm_config.sstable_path, dense_index.deref());
163+
filter::write_filter(
164+
&self.lsm_config.sstable_path,
165+
self.bloom_filter.read().unwrap().deref(),
166+
);
175167

176-
index::write_index(&self.lsm_config.sstable_path, dense_index.deref());
168+
Ok(())
169+
} else {
170+
let segments = sstable::Segment::from_tree(&memtable, &self.lsm_config.sstable_path);
177171

178-
let mut keys = Vec::new();
172+
for token in segments.1 {
173+
dense_index.insert(token.0, token.1);
174+
}
179175

180-
for segment in dense_index.deref() {
181-
keys.push(segment.0.clone());
182-
}
176+
index::write_index(&self.lsm_config.sstable_path, dense_index.deref());
183177

184-
drop(dense_index);
178+
drop(dense_index);
185179

186-
filter::write_filter(
187-
&self.lsm_config.sstable_path,
188-
self.bloom_filter.read().unwrap().deref(),
189-
);
180+
filter::write_filter(
181+
&self.lsm_config.sstable_path,
182+
self.bloom_filter.read().unwrap().deref(),
183+
);
190184

191-
self.memtable.write().unwrap().clear();
192-
self.memtable_size = 0;
185+
self.memtable.write().unwrap().clear();
186+
self.memtable_size = 0;
193187

194-
Ok(())
188+
Ok(())
189+
}
195190
}
196191

197192
pub fn get_memtable(&self) -> BTreeMap<String, bson::Bson> {
@@ -243,27 +238,26 @@ impl Drop for Lsm {
243238
let memtable = self.memtable.read().unwrap();
244239
let mut dense_index = self.dense_index.write().unwrap();
245240

246-
if memtable.is_empty() {
247-
return;
248-
}
249-
250-
let segments = sstable::Segment::from_tree(memtable.deref(), &self.lsm_config.sstable_path);
241+
if memtable.len() == 0 {
242+
index::write_index(&self.lsm_config.sstable_path, dense_index.deref());
243+
filter::write_filter(
244+
&self.lsm_config.sstable_path,
245+
self.bloom_filter.read().unwrap().deref(),
246+
);
247+
} else {
248+
let segments =
249+
sstable::Segment::from_tree(memtable.deref(), &self.lsm_config.sstable_path);
251250

252-
for token in segments.1 {
253-
dense_index.insert(token.0, token.1);
254-
}
251+
for token in segments.1 {
252+
dense_index.insert(token.0, token.1);
253+
}
255254

256-
let mut keys = Vec::new();
255+
index::write_index(&self.lsm_config.sstable_path, dense_index.deref());
257256

258-
for segment in dense_index.deref() {
259-
keys.push(segment.0.clone());
257+
filter::write_filter(
258+
&self.lsm_config.sstable_path,
259+
self.bloom_filter.read().unwrap().deref(),
260+
);
260261
}
261-
262-
index::write_index(&self.lsm_config.sstable_path, dense_index.deref());
263-
264-
filter::write_filter(
265-
&self.lsm_config.sstable_path,
266-
self.bloom_filter.read().unwrap().deref(),
267-
);
268262
}
269263
}

0 commit comments

Comments
 (0)