Skip to content

Commit d2fa7d5

Browse files
committed
rafs: define dedicated RafsV6Inode to reduce memory consumption
There are several unused fields in RafsV5Inode when used for v6, so define dedicated RafsV6Inode to reduce memory consumption. Signed-off-by: Jiang Liu <[email protected]>
1 parent c9d9b43 commit d2fa7d5

File tree

10 files changed

+397
-209
lines changed

10 files changed

+397
-209
lines changed

rafs/src/builder/core/bootstrap.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -160,9 +160,10 @@ impl Bootstrap {
160160
// binary search.
161161
tree.children
162162
.sort_by_key(|child| child.node.name().to_os_string());
163-
parent.inode.set_child_index(index);
164163
parent.inode.set_child_count(tree.children.len() as u32);
165-
if ctx.fs_version.is_v6() {
164+
if ctx.fs_version.is_v5() {
165+
parent.inode.set_child_index(index);
166+
} else if ctx.fs_version.is_v6() {
166167
let d_size = tree.node.v6_dirent_size(ctx, tree)?;
167168
parent.v6_set_dir_offset(bootstrap_ctx, d_size, block_size)?;
168169
}
@@ -177,7 +178,9 @@ impl Bootstrap {
177178
for child in tree.children.iter_mut() {
178179
let index = nodes.len() as u64 + 1;
179180
child.node.index = index;
180-
child.node.inode.set_parent(parent_ino);
181+
if ctx.fs_version.is_v5() {
182+
child.node.inode.set_parent(parent_ino);
183+
}
181184

182185
// Handle hardlink.
183186
// All hardlink nodes' ino and nlink should be the same.

rafs/src/builder/core/node.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -173,13 +173,12 @@ impl Display for Node {
173173
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
174174
write!(
175175
f,
176-
"{} {:?}: index {} ino {} real_ino {} i_parent {} child_index {} child_count {} i_nlink {} i_size {} i_blocks {} i_name_size {} i_symlink_size {} has_xattr {} link {:?} i_mtime {} i_mtime_nsec {}",
176+
"{} {:?}: index {} ino {} real_ino {} child_index {} child_count {} i_nlink {} i_size {} i_blocks {} i_name_size {} i_symlink_size {} has_xattr {} link {:?} i_mtime {} i_mtime_nsec {}",
177177
self.file_type(),
178178
self.target(),
179179
self.index,
180180
self.inode.ino(),
181181
self.info.src_ino,
182-
self.inode.parent(),
183182
self.inode.child_index(),
184183
self.inode.child_count(),
185184
self.inode.nlink(),
@@ -609,7 +608,11 @@ impl Node {
609608
}
610609

611610
fn build_inode(&mut self, chunk_size: u32) -> Result<()> {
612-
self.inode.set_name_size(self.name().byte_size());
611+
let size = self.name().byte_size();
612+
if size > u16::MAX as usize {
613+
bail!("file name length 0x{:x} is too big", size,);
614+
}
615+
self.inode.set_name_size(size);
613616

614617
// NOTE: Always retrieve xattr before attr so that we can know the size of xattr pairs.
615618
self.build_inode_xattr()
@@ -631,6 +634,9 @@ impl Node {
631634
})?;
632635
let symlink: OsString = target_path.into();
633636
let size = symlink.byte_size();
637+
if size > u16::MAX as usize {
638+
bail!("symlink content size 0x{:x} is too big", size);
639+
}
634640
self.inode.set_symlink_size(size);
635641
self.set_symlink(symlink);
636642
}

rafs/src/builder/core/v6.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,12 @@ use super::chunk_dict::DigestWithBlobIndex;
1818
use super::node::Node;
1919
use crate::builder::{Bootstrap, BootstrapContext, BuildContext, ConversionType, Tree};
2020
use crate::metadata::chunk::ChunkWrapper;
21-
use crate::metadata::inode::new_v6_inode;
2221
use crate::metadata::layout::v6::{
23-
align_offset, calculate_nid, RafsV6BlobTable, RafsV6Device, RafsV6Dirent, RafsV6InodeChunkAddr,
24-
RafsV6InodeChunkHeader, RafsV6OndiskInode, RafsV6SuperBlock, RafsV6SuperBlockExt,
25-
EROFS_BLOCK_BITS_9, EROFS_BLOCK_SIZE_4096, EROFS_BLOCK_SIZE_512, EROFS_DEVTABLE_OFFSET,
26-
EROFS_INODE_CHUNK_BASED, EROFS_INODE_FLAT_INLINE, EROFS_INODE_FLAT_PLAIN,
27-
EROFS_INODE_SLOT_SIZE, EROFS_SUPER_BLOCK_SIZE, EROFS_SUPER_OFFSET,
22+
align_offset, calculate_nid, new_v6_inode, RafsV6BlobTable, RafsV6Device, RafsV6Dirent,
23+
RafsV6InodeChunkAddr, RafsV6InodeChunkHeader, RafsV6OndiskInode, RafsV6SuperBlock,
24+
RafsV6SuperBlockExt, EROFS_BLOCK_BITS_9, EROFS_BLOCK_SIZE_4096, EROFS_BLOCK_SIZE_512,
25+
EROFS_DEVTABLE_OFFSET, EROFS_INODE_CHUNK_BASED, EROFS_INODE_FLAT_INLINE,
26+
EROFS_INODE_FLAT_PLAIN, EROFS_INODE_SLOT_SIZE, EROFS_SUPER_BLOCK_SIZE, EROFS_SUPER_OFFSET,
2827
};
2928
use crate::metadata::RafsStore;
3029
use crate::RafsIoWrite;

rafs/src/builder/stargz.rs

Lines changed: 47 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ use super::core::overlay::Overlay;
3333
use super::core::tree::Tree;
3434
use super::{build_bootstrap, Builder};
3535
use crate::metadata::chunk::ChunkWrapper;
36-
use crate::metadata::inode::InodeWrapper;
37-
use crate::metadata::layout::v5::{RafsV5ChunkInfo, RafsV5Inode, RafsV5InodeFlags};
36+
use crate::metadata::inode::{InodeWrapper, RafsInodeFlags, RafsV6Inode};
37+
use crate::metadata::layout::v5::{RafsV5ChunkInfo, RafsV5Inode};
3838
use crate::metadata::layout::RafsXAttrs;
3939
use crate::metadata::{Inode, RafsVersion};
4040

@@ -543,16 +543,16 @@ impl StargzTreeBuilder {
543543
let entry_path = entry.path()?;
544544
let mut file_size = entry.size;
545545
let mut flags = match version {
546-
RafsVersion::V5 => RafsV5InodeFlags::default(),
547-
RafsVersion::V6 => RafsV5InodeFlags::default(),
546+
RafsVersion::V5 => RafsInodeFlags::default(),
547+
RafsVersion::V6 => RafsInodeFlags::default(),
548548
};
549549

550550
// Parse symlink
551551
let (symlink, symlink_size) = if entry.is_symlink() {
552552
let symlink_link_path = entry.symlink_link_path();
553553
let symlink_size = symlink_link_path.byte_size() as u16;
554554
file_size = symlink_size.into();
555-
flags |= RafsV5InodeFlags::SYMLINK;
555+
flags |= RafsInodeFlags::SYMLINK;
556556
(Some(symlink_link_path.as_os_str().to_owned()), symlink_size)
557557
} else {
558558
(None, 0)
@@ -562,7 +562,7 @@ impl StargzTreeBuilder {
562562
let mut xattrs = RafsXAttrs::new();
563563
if entry.has_xattr() {
564564
for (name, value) in entry.xattrs.iter() {
565-
flags |= RafsV5InodeFlags::XATTR;
565+
flags |= RafsInodeFlags::XATTR;
566566
let value = base64::decode(value).with_context(|| {
567567
format!(
568568
"parse xattr name {:?} of file {:?} failed",
@@ -576,7 +576,7 @@ impl StargzTreeBuilder {
576576
// Handle hardlink ino
577577
let mut ino = (self.path_inode_map.len() + 1) as Inode;
578578
if entry.is_hardlink() {
579-
flags |= RafsV5InodeFlags::HARDLINK;
579+
flags |= RafsInodeFlags::HARDLINK;
580580
if let Some(_ino) = self.path_inode_map.get(&entry.hardlink_link_path()) {
581581
ino = *_ino;
582582
} else {
@@ -591,32 +591,47 @@ impl StargzTreeBuilder {
591591
let uid = if explicit_uidgid { entry.uid } else { 0 };
592592
let gid = if explicit_uidgid { entry.gid } else { 0 };
593593

594-
// Parse inode info
595-
let v5_inode = RafsV5Inode {
596-
i_digest: RafsDigest::default(),
597-
i_parent: 0,
598-
i_ino: ino,
599-
i_projid: 0,
600-
i_uid: uid,
601-
i_gid: gid,
602-
i_mode: entry.mode(),
603-
i_size: file_size,
604-
i_nlink: entry.num_link,
605-
i_blocks: 0,
606-
i_flags: flags,
607-
i_child_index: 0,
608-
i_child_count: 0,
609-
i_name_size: name_size,
610-
i_symlink_size: symlink_size,
611-
i_rdev: entry.rdev(),
612-
// TODO: add mtime from entry.ModTime()
613-
i_mtime: 0,
614-
i_mtime_nsec: 0,
615-
i_reserved: [0; 8],
616-
};
617594
let inode = match version {
618-
RafsVersion::V5 => InodeWrapper::V5(v5_inode),
619-
RafsVersion::V6 => InodeWrapper::V6(v5_inode),
595+
RafsVersion::V5 => InodeWrapper::V5(RafsV5Inode {
596+
i_digest: RafsDigest::default(),
597+
i_parent: 0,
598+
i_ino: ino,
599+
i_projid: 0,
600+
i_uid: uid,
601+
i_gid: gid,
602+
i_mode: entry.mode(),
603+
i_size: file_size,
604+
i_nlink: entry.num_link,
605+
i_blocks: 0,
606+
i_flags: flags,
607+
i_child_index: 0,
608+
i_child_count: 0,
609+
i_name_size: name_size,
610+
i_symlink_size: symlink_size,
611+
i_rdev: entry.rdev(),
612+
// TODO: add mtime from entry.ModTime()
613+
i_mtime: 0,
614+
i_mtime_nsec: 0,
615+
i_reserved: [0; 8],
616+
}),
617+
RafsVersion::V6 => InodeWrapper::V6(RafsV6Inode {
618+
i_ino: ino,
619+
i_projid: 0,
620+
i_uid: uid,
621+
i_gid: gid,
622+
i_mode: entry.mode(),
623+
i_size: file_size,
624+
i_nlink: entry.num_link,
625+
i_blocks: 0,
626+
i_flags: flags,
627+
i_child_count: 0,
628+
i_name_size: name_size,
629+
i_symlink_size: symlink_size,
630+
i_rdev: entry.rdev(),
631+
// TODO: add mtime from entry.ModTime()
632+
i_mtime: 0,
633+
i_mtime_nsec: 0,
634+
}),
620635
};
621636

622637
let path = entry.path()?;

rafs/src/builder/tarball.rs

Lines changed: 47 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ use super::core::node::{Node, NodeInfo};
4343
use super::core::overlay::Overlay;
4444
use super::core::tree::Tree;
4545
use super::{build_bootstrap, dump_bootstrap, finalize_blob, Builder};
46-
use crate::metadata::inode::InodeWrapper;
47-
use crate::metadata::layout::v5::{RafsV5Inode, RafsV5InodeFlags};
46+
use crate::metadata::inode::{InodeWrapper, RafsInodeFlags, RafsV6Inode};
47+
use crate::metadata::layout::v5::RafsV5Inode;
4848
use crate::metadata::layout::RafsXAttrs;
4949
use crate::metadata::{Inode, RafsVersion};
5050

@@ -229,8 +229,8 @@ impl<'a> TarballTreeBuilder<'a> {
229229
let (uid, gid) = Self::get_uid_gid(self.ctx, header)?;
230230
let mtime = header.mtime().unwrap_or_default();
231231
let mut flags = match self.ctx.fs_version {
232-
RafsVersion::V5 => RafsV5InodeFlags::default(),
233-
RafsVersion::V6 => RafsV5InodeFlags::default(),
232+
RafsVersion::V5 => RafsInodeFlags::default(),
233+
RafsVersion::V6 => RafsInodeFlags::default(),
234234
};
235235

236236
// Parse special files
@@ -262,7 +262,7 @@ impl<'a> TarballTreeBuilder<'a> {
262262
bail!("tarball: symlink target from tar entry is too big");
263263
}
264264
file_size = symlink_size as u64;
265-
flags |= RafsV5InodeFlags::SYMLINK;
265+
flags |= RafsInodeFlags::SYMLINK;
266266
(
267267
Some(symlink_link_path.as_os_str().to_owned()),
268268
symlink_size as u16,
@@ -299,7 +299,7 @@ impl<'a> TarballTreeBuilder<'a> {
299299
path.as_ref().display()
300300
);
301301
}
302-
flags |= RafsV5InodeFlags::HARDLINK;
302+
flags |= RafsInodeFlags::HARDLINK;
303303
} else {
304304
self.path_inode_map
305305
.insert(path.as_ref().to_path_buf(), (ino, nodes.len()));
@@ -328,30 +328,45 @@ impl<'a> TarballTreeBuilder<'a> {
328328
}
329329
}
330330

331-
let v5_inode = RafsV5Inode {
332-
i_digest: RafsDigest::default(),
333-
i_parent: 0,
334-
i_ino: ino,
335-
i_projid: 0,
336-
i_uid: uid,
337-
i_gid: gid,
338-
i_mode: mode,
339-
i_size: file_size,
340-
i_nlink: 1,
341-
i_blocks: 0,
342-
i_flags: flags,
343-
i_child_index: 0,
344-
i_child_count: child_count as u32,
345-
i_name_size: name.len() as u16,
346-
i_symlink_size: symlink_size,
347-
i_rdev: rdev,
348-
i_mtime: mtime,
349-
i_mtime_nsec: 0,
350-
i_reserved: [0; 8],
351-
};
352331
let mut inode = match self.ctx.fs_version {
353-
RafsVersion::V5 => InodeWrapper::V5(v5_inode),
354-
RafsVersion::V6 => InodeWrapper::V6(v5_inode),
332+
RafsVersion::V5 => InodeWrapper::V5(RafsV5Inode {
333+
i_digest: RafsDigest::default(),
334+
i_parent: 0,
335+
i_ino: ino,
336+
i_projid: 0,
337+
i_uid: uid,
338+
i_gid: gid,
339+
i_mode: mode,
340+
i_size: file_size,
341+
i_nlink: 1,
342+
i_blocks: 0,
343+
i_flags: flags,
344+
i_child_index: 0,
345+
i_child_count: child_count as u32,
346+
i_name_size: name.len() as u16,
347+
i_symlink_size: symlink_size,
348+
i_rdev: rdev,
349+
i_mtime: mtime,
350+
i_mtime_nsec: 0,
351+
i_reserved: [0; 8],
352+
}),
353+
RafsVersion::V6 => InodeWrapper::V6(RafsV6Inode {
354+
i_ino: ino,
355+
i_projid: 0,
356+
i_uid: uid,
357+
i_gid: gid,
358+
i_mode: mode,
359+
i_size: file_size,
360+
i_nlink: 1,
361+
i_blocks: 0,
362+
i_flags: flags,
363+
i_child_count: child_count as u32,
364+
i_name_size: name.len() as u16,
365+
i_symlink_size: symlink_size,
366+
i_rdev: rdev,
367+
i_mtime: mtime,
368+
i_mtime_nsec: 0,
369+
}),
355370
};
356371
inode.set_has_xattr(!xattrs.is_empty());
357372

@@ -391,7 +406,9 @@ impl<'a> TarballTreeBuilder<'a> {
391406
// the associated regular file.
392407
if entry_type.is_hard_link() {
393408
let n = &nodes[index];
394-
node.inode.set_digest(*n.inode.digest());
409+
if n.inode.is_v5() {
410+
node.inode.set_digest(*n.inode.digest());
411+
}
395412
node.inode.set_size(n.inode.size());
396413
node.inode.set_child_count(n.inode.child_count());
397414
node.chunks = n.chunks.clone();

rafs/src/metadata/cached_v5.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,10 @@ use nydus_storage::device::{BlobChunkFlags, BlobChunkInfo, BlobDevice, BlobInfo}
2626
use nydus_utils::digest::RafsDigest;
2727
use nydus_utils::ByteSize;
2828

29+
use crate::metadata::inode::RafsInodeFlags;
2930
use crate::metadata::layout::v5::{
3031
rafsv5_alloc_bio_vecs, rafsv5_validate_inode, RafsV5BlobTable, RafsV5ChunkInfo, RafsV5Inode,
31-
RafsV5InodeChunkOps, RafsV5InodeFlags, RafsV5InodeOps, RafsV5XAttrsTable, RAFSV5_ALIGNMENT,
32+
RafsV5InodeChunkOps, RafsV5InodeOps, RafsV5XAttrsTable, RAFSV5_ALIGNMENT,
3233
};
3334
use crate::metadata::layout::{bytes_to_os_str, parse_xattr, RAFS_V5_ROOT_INODE};
3435
use crate::metadata::{
@@ -236,7 +237,7 @@ pub struct CachedInodeV5 {
236237
i_projid: u32,
237238
i_uid: u32,
238239
i_gid: u32,
239-
i_flags: RafsV5InodeFlags,
240+
i_flags: RafsInodeFlags,
240241
i_size: u64,
241242
i_blocks: u64,
242243
i_nlink: u32,
@@ -481,7 +482,7 @@ impl RafsInode for CachedInodeV5 {
481482

482483
#[inline]
483484
fn has_xattr(&self) -> bool {
484-
self.i_flags.contains(RafsV5InodeFlags::XATTR)
485+
self.i_flags.contains(RafsInodeFlags::XATTR)
485486
}
486487

487488
#[inline]
@@ -664,7 +665,7 @@ impl RafsV5InodeOps for CachedInodeV5 {
664665
}
665666

666667
fn has_hole(&self) -> bool {
667-
self.i_flags.contains(RafsV5InodeFlags::HAS_HOLE)
668+
self.i_flags.contains(RafsInodeFlags::HAS_HOLE)
668669
}
669670
}
670671

0 commit comments

Comments
 (0)