Skip to content

Commit 21c51eb

Browse files
committed
[bugfix] some error occured when using upper layer
Signed-off-by: zhuangbowei.zbw <[email protected]>
1 parent a12c314 commit 21c51eb

File tree

4 files changed

+24
-17
lines changed

4 files changed

+24
-17
lines changed

src/image_file.cpp

+17-9
Original file line numberDiff line numberDiff line change
@@ -481,6 +481,7 @@ int ImageFile::init_image_file() {
481481
goto ERROR_EXIT;
482482
}
483483

484+
// have only RO layers
484485
if (upper.index() == "" || upper.data() == "") {
485486
LOG_INFO("RW layer path not set. return RO layers.");
486487
m_file = lower_file;
@@ -493,29 +494,36 @@ int ImageFile::init_image_file() {
493494
LOG_ERROR("open upper layer failed.");
494495
goto ERROR_EXIT;
495496
}
496-
// We have to maintain the lower_file because prefetcher need the readonly
497-
// lower_file but not the writable m_file.
498-
//
499-
// Otherwise, lower_file and upper_file will lose the ownership of m_files
500-
// after stack_files(...), so we could safely delete them.
497+
498+
// have only one RW layer
499+
if (!lower_file) {
500+
LOG_INFO("RO layers path not set. return RW layer.");
501+
m_file = upper_file;
502+
read_only = false;
503+
goto SUCCESS_EXIT;
504+
}
505+
506+
// stack_files(..., ownership=true) will destruct lower_file and upper_file
507+
// immediately, but the read-only lower_file is needed by prefetcher, so we
508+
// have to use stack_files(..., ownership=false) instead.
501509
//
502-
// upper_file will be deleted immediately since it's useless.
503-
// lower_file will be held by ImageFile until deconstruct.
510+
// For this reason, lower_file and upper_file must be maintained until m_file
511+
// is deconstructed.
504512
stack_ret = LSMT::stack_files(upper_file, lower_file, false, false);
505513
if (!stack_ret) {
506514
LOG_ERROR("LSMT::stack_files(`, `)", (uint64_t)upper_file, true);
507515
goto ERROR_EXIT;
508516
}
509517
m_file = stack_ret;
510518
read_only = false;
511-
delete upper_file;
512519
m_lower_file = lower_file;
520+
m_upper_file = upper_file;
513521

514522
SUCCESS_EXIT:
515523
if (conf.download().enable() && !record_no_download) {
516524
start_bk_dl_thread();
517525
}
518-
if (m_prefetcher != nullptr) {
526+
if (m_prefetcher && lower_file) {
519527
m_prefetcher->replay(lower_file);
520528
}
521529
return 1;

src/image_file.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,8 @@ class ImageFile : public photon::fs::ForwardFile {
6262
m_file->close();
6363
delete m_file;
6464
}
65-
if (m_lower_file) {
66-
delete m_lower_file;
67-
}
65+
if (m_lower_file) delete m_lower_file;
66+
if (m_upper_file) delete m_upper_file;
6867
}
6968

7069
int fstat(struct stat *buf) override {
@@ -121,6 +120,7 @@ class ImageFile : public photon::fs::ForwardFile {
121120
photon::join_handle *dl_thread_jh = nullptr;
122121
ImageService &image_service;
123122
photon::fs::IFile *m_lower_file = nullptr;
123+
photon::fs::IFile *m_upper_file = nullptr;
124124

125125
int init_image_file();
126126
template<typename...Ts> void set_failed(const Ts&...xs);

src/overlaybd/lsmt/file.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -1807,7 +1807,7 @@ IFileRW *stack_files(IFileRW *upper_layer, IFileRO *lower_layers, bool ownership
18071807
rst = new LSMTWarpFile;
18081808
delta++;
18091809
}
1810-
idx = create_combo_index((IMemoryIndex0 *)u->m_index, l->m_index, l->m_files.size(), true);
1810+
idx = create_combo_index((IMemoryIndex0 *)u->m_index, l->m_index, l->m_files.size(), ownership);
18111811
rst->m_index = idx;
18121812
rst->m_findex = u->m_findex;
18131813
rst->m_vsize = u->m_vsize;
@@ -1830,9 +1830,9 @@ IFileRW *stack_files(IFileRW *upper_layer, IFileRO *lower_layers, bool ownership
18301830
}
18311831
rst->m_uuid.push_back(u->m_uuid[0]);
18321832
rst->m_rw_tag = rst->m_files.size() - delta;
1833-
u->m_index = l->m_index = nullptr;
1834-
l->m_file_ownership = u->m_file_ownership = false;
18351833
if (ownership) {
1834+
u->m_index = l->m_index = nullptr;
1835+
l->m_file_ownership = u->m_file_ownership = false;
18361836
delete u;
18371837
delete l;
18381838
}

src/overlaybd/tar/erofs/test/erofs_stress_base.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,7 @@ LSMT::IFileRW *StressBase::mkfs()
352352

353353
LSMT::IFileRW *img_file = nullptr;
354354
if (i > 0)
355-
img_file = LSMT::stack_files(current_layer, lowers, false, false);
355+
img_file = LSMT::stack_files(current_layer, lowers, true, false);
356356
else
357357
img_file = current_layer;
358358

@@ -362,7 +362,6 @@ LSMT::IFileRW *StressBase::mkfs()
362362
delete img_file;
363363
LOG_ERROR_RETURN(-1, nullptr, "fail to extract tar");
364364
}
365-
delete lowers;
366365
delete tar;
367366
lowers = img_file;
368367
}

0 commit comments

Comments
 (0)