mirror of
https://github.com/mhx/dwarfs.git
synced 2025-09-11 05:23:29 -04:00
Working towards new metadata format
This commit is contained in:
parent
fe5eb38741
commit
18520de172
@ -38,7 +38,7 @@ namespace dwarfs {
|
|||||||
|
|
||||||
namespace thrift::metadata {
|
namespace thrift::metadata {
|
||||||
|
|
||||||
class entry;
|
class inode_data;
|
||||||
class metadata;
|
class metadata;
|
||||||
|
|
||||||
} // namespace thrift::metadata
|
} // namespace thrift::metadata
|
||||||
@ -78,8 +78,8 @@ class entry : public entry_interface {
|
|||||||
std::string type_string() const override;
|
std::string type_string() const override;
|
||||||
virtual void walk(std::function<void(entry*)> const& f);
|
virtual void walk(std::function<void(entry*)> const& f);
|
||||||
virtual void walk(std::function<void(const entry*)> const& f) const;
|
virtual void walk(std::function<void(const entry*)> const& f) const;
|
||||||
void
|
void pack(thrift::metadata::inode_data& entry_v2,
|
||||||
pack(thrift::metadata::entry& entry_v2, global_entry_data const& data) const;
|
global_entry_data const& data) const;
|
||||||
void update(global_entry_data& data) const;
|
void update(global_entry_data& data) const;
|
||||||
virtual void accept(entry_visitor& v, bool preorder = false) = 0;
|
virtual void accept(entry_visitor& v, bool preorder = false) = 0;
|
||||||
virtual uint32_t inode_num() const = 0;
|
virtual uint32_t inode_num() const = 0;
|
||||||
|
@ -38,8 +38,9 @@ template <typename T>
|
|||||||
class metadata_;
|
class metadata_;
|
||||||
|
|
||||||
class entry_view
|
class entry_view
|
||||||
: public ::apache::thrift::frozen::View<thrift::metadata::entry> {
|
: public ::apache::thrift::frozen::View<thrift::metadata::inode_data> {
|
||||||
using EntryView = ::apache::thrift::frozen::View<thrift::metadata::entry>;
|
using EntryView =
|
||||||
|
::apache::thrift::frozen::View<thrift::metadata::inode_data>;
|
||||||
using Meta =
|
using Meta =
|
||||||
::apache::thrift::frozen::MappedFrozen<thrift::metadata::metadata>;
|
::apache::thrift::frozen::MappedFrozen<thrift::metadata::metadata>;
|
||||||
|
|
||||||
@ -61,7 +62,8 @@ class entry_view
|
|||||||
};
|
};
|
||||||
|
|
||||||
class directory_view {
|
class directory_view {
|
||||||
using EntryView = ::apache::thrift::frozen::View<thrift::metadata::entry>;
|
using EntryView =
|
||||||
|
::apache::thrift::frozen::View<thrift::metadata::inode_data>;
|
||||||
using DirView = ::apache::thrift::frozen::View<thrift::metadata::directory>;
|
using DirView = ::apache::thrift::frozen::View<thrift::metadata::directory>;
|
||||||
using Meta =
|
using Meta =
|
||||||
::apache::thrift::frozen::MappedFrozen<thrift::metadata::metadata>;
|
::apache::thrift::frozen::MappedFrozen<thrift::metadata::metadata>;
|
||||||
|
@ -101,9 +101,9 @@ void entry::update(global_entry_data& data) const {
|
|||||||
data.add_ctime(stat_.st_ctime);
|
data.add_ctime(stat_.st_ctime);
|
||||||
}
|
}
|
||||||
|
|
||||||
void entry::pack(thrift::metadata::entry& entry_v2,
|
void entry::pack(thrift::metadata::inode_data& entry_v2,
|
||||||
global_entry_data const& data) const {
|
global_entry_data const& data) const {
|
||||||
entry_v2.name_index = has_parent() ? data.get_name_index(name_) : 0;
|
entry_v2.name_index_v2_2 = has_parent() ? data.get_name_index(name_) : 0;
|
||||||
entry_v2.mode_index = data.get_mode_index(stat_.st_mode & 0xFFFF);
|
entry_v2.mode_index = data.get_mode_index(stat_.st_mode & 0xFFFF);
|
||||||
entry_v2.owner_index = data.get_uid_index(stat_.st_uid);
|
entry_v2.owner_index = data.get_uid_index(stat_.st_uid);
|
||||||
entry_v2.group_index = data.get_gid_index(stat_.st_gid);
|
entry_v2.group_index = data.get_gid_index(stat_.st_gid);
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
namespace dwarfs {
|
namespace dwarfs {
|
||||||
|
|
||||||
std::string_view entry_view::name() const {
|
std::string_view entry_view::name() const {
|
||||||
return meta_->names()[name_index()];
|
return meta_->names()[name_index_v2_2()];
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t entry_view::mode() const { return meta_->modes()[mode_index()]; }
|
uint16_t entry_view::mode() const { return meta_->modes()[mode_index()]; }
|
||||||
@ -81,7 +81,7 @@ void directory_view::append_path_to(std::string& s) const {
|
|||||||
s += '/';
|
s += '/';
|
||||||
}
|
}
|
||||||
if (inode() != 0) {
|
if (inode() != 0) {
|
||||||
s += meta_->names()[entry_.name_index()];
|
s += meta_->names()[entry_.name_index_v2_2()];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,8 +42,8 @@ struct chunk {
|
|||||||
* `metadata.entries`.
|
* `metadata.entries`.
|
||||||
*/
|
*/
|
||||||
struct directory {
|
struct directory {
|
||||||
1: required UInt32 parent_inode,
|
1: required UInt32 parent_inode, // indexes into entries
|
||||||
2: required UInt32 first_entry,
|
2: required UInt32 first_entry, // indexes into dir_entries
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -51,9 +51,15 @@ struct directory {
|
|||||||
* by far the most common metadata object type, so it has been
|
* by far the most common metadata object type, so it has been
|
||||||
* optimized for size.
|
* optimized for size.
|
||||||
*/
|
*/
|
||||||
struct entry {
|
struct inode_data {
|
||||||
|
/**
|
||||||
|
* =========================================================================
|
||||||
|
* NOTE: This has been deprecated with filesystem version 2.3 (DwarFS 0.5.0)
|
||||||
|
* It is still being used to read older filesystem versions.
|
||||||
|
* =========================================================================
|
||||||
|
*/
|
||||||
// index into metadata.names
|
// index into metadata.names
|
||||||
1: required UInt32 name_index,
|
1: required UInt32 name_index_v2_2,
|
||||||
|
|
||||||
// index into metadata.modes
|
// index into metadata.modes
|
||||||
2: required UInt16 mode_index,
|
2: required UInt16 mode_index,
|
||||||
@ -68,7 +74,7 @@ struct entry {
|
|||||||
* - For files, (inode - chunk_index_offset) can be
|
* - For files, (inode - chunk_index_offset) can be
|
||||||
* used as in index into metadata.chunk_table.
|
* used as in index into metadata.chunk_table.
|
||||||
*/
|
*/
|
||||||
3: required UInt32 inode,
|
3: required UInt32 inode, ///// <---------- rename to content_index
|
||||||
|
|
||||||
// index into metadata.uids
|
// index into metadata.uids
|
||||||
4: required UInt16 owner_index,
|
4: required UInt16 owner_index,
|
||||||
@ -86,6 +92,18 @@ struct entry {
|
|||||||
8: required UInt64 ctime_offset,
|
8: required UInt64 ctime_offset,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//////
|
||||||
|
////// entries can now be stored in inode-order (we don't need old_entry_table any more :-)
|
||||||
|
//////
|
||||||
|
|
||||||
|
struct dir_entry { ///// <--------- or entry?
|
||||||
|
// index into metadata.names
|
||||||
|
1: required UInt32 name_index,
|
||||||
|
|
||||||
|
// index into metadata.entries
|
||||||
|
2: required UInt32 entry_index, ///// <--------- entries (inodes) are shared for hardlinks
|
||||||
|
}
|
||||||
|
|
||||||
struct fs_options {
|
struct fs_options {
|
||||||
// file system contains only mtime time stamps
|
// file system contains only mtime time stamps
|
||||||
1: required bool mtime_only,
|
1: required bool mtime_only,
|
||||||
@ -103,7 +121,7 @@ struct metadata {
|
|||||||
*
|
*
|
||||||
* chunks[chunk_table[inode]] .. chunks[chunk_table[inode + 1] - 1]
|
* chunks[chunk_table[inode]] .. chunks[chunk_table[inode + 1] - 1]
|
||||||
*/
|
*/
|
||||||
1: required list<chunk> chunks,
|
1: required list<chunk> chunks,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* All directories, indexed by inode number. There's one extra
|
* All directories, indexed by inode number. There's one extra
|
||||||
@ -111,24 +129,29 @@ struct metadata {
|
|||||||
* end of `entries`, so that directory entry lookup work the
|
* end of `entries`, so that directory entry lookup work the
|
||||||
* same for all directories.
|
* same for all directories.
|
||||||
*/
|
*/
|
||||||
2: required list<directory> directories,
|
2: required list<directory> directories,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* All entries, can be looked up by inode through entry_table_v2_2, or by
|
* All entries, can be looked up by inode through entry_table_v2_2, or by
|
||||||
* directory through `first_entry`, where the entries will be between
|
* directory through `first_entry`, where the entries will be between
|
||||||
* `directories[n].first_entry` and `directories[n+1].first_entry`.
|
* `directories[n].first_entry` and `directories[n+1].first_entry`.
|
||||||
*/
|
*/
|
||||||
3: required list<entry> entries,
|
3: required list<inode_data> entries,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Chunk lookup table, indexed by (inode - chunk_index_offset).
|
* Chunk lookup table, indexed by (inode - chunk_index_offset).
|
||||||
* There's one extra dummy item at the end that points to the
|
* There's one extra dummy item at the end that points to the
|
||||||
* end of `chunks`, so chunk lookups work the same for all inodes.
|
* end of `chunks`, so chunk lookups work the same for all inodes.
|
||||||
*/
|
*/
|
||||||
4: required list<UInt32> chunk_table,
|
4: required list<UInt32> chunk_table,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Entry index, indexed by inode
|
* =========================================================================
|
||||||
|
* NOTE: This has been deprecated with filesystem version 2.3 (DwarFS 0.5.0)
|
||||||
|
* It is still being used to read older filesystem versions.
|
||||||
|
* =========================================================================
|
||||||
|
*
|
||||||
|
* Entry lookup table, indexed by inode
|
||||||
*
|
*
|
||||||
* This list contains all inodes strictly in the following order:
|
* This list contains all inodes strictly in the following order:
|
||||||
*
|
*
|
||||||
@ -138,28 +161,28 @@ struct metadata {
|
|||||||
* - character and block devices
|
* - character and block devices
|
||||||
* - named pipes and sockets
|
* - named pipes and sockets
|
||||||
*/
|
*/
|
||||||
5: required list<UInt32> entry_table_v2_2,
|
5: required list<UInt32> entry_table_v2_2, ///// <------------ deprecate (see above)
|
||||||
|
|
||||||
// symlink lookup table, indexed by (inode - symlink_table_offset)
|
// symlink lookup table, indexed by (inode - symlink_table_offset)
|
||||||
6: required list<UInt32> symlink_table,
|
6: required list<UInt32> symlink_table,
|
||||||
|
|
||||||
// user ids, for lookup by index in entry.owner
|
// user ids, for lookup by index in entry.owner
|
||||||
7: required list<UInt16> uids,
|
7: required list<UInt16> uids,
|
||||||
|
|
||||||
// group ids, for lookup by index in entry.group
|
// group ids, for lookup by index in entry.group
|
||||||
8: required list<UInt16> gids,
|
8: required list<UInt16> gids,
|
||||||
|
|
||||||
// entry modes, for lookup by index in entry.mode
|
// entry modes, for lookup by index in entry.mode
|
||||||
9: required list<UInt16> modes,
|
9: required list<UInt16> modes,
|
||||||
|
|
||||||
// entry names, for lookup by index in entry.name_index
|
// entry names, for lookup by index in entry.name_index
|
||||||
10: required list<string> names,
|
10: required list<string> names,
|
||||||
|
|
||||||
// link targets, for lookup by index from symlink_table
|
// link targets, for lookup by index from symlink_table
|
||||||
11: required list<string> symlinks,
|
11: required list<string> symlinks,
|
||||||
|
|
||||||
// timestamp base for all entry timestamps
|
// timestamp base for all entry timestamps
|
||||||
12: required UInt64 timestamp_base,
|
12: required UInt64 timestamp_base,
|
||||||
|
|
||||||
/************************ DEPRECATED **********************
|
/************************ DEPRECATED **********************
|
||||||
*
|
*
|
||||||
@ -173,18 +196,31 @@ struct metadata {
|
|||||||
*********************************************************/
|
*********************************************************/
|
||||||
|
|
||||||
// block size
|
// block size
|
||||||
15: required UInt32 block_size,
|
15: required UInt32 block_size,
|
||||||
|
|
||||||
// total file system size
|
// total file system size
|
||||||
16: required UInt64 total_fs_size,
|
16: required UInt64 total_fs_size,
|
||||||
|
|
||||||
//=========================================================//
|
//=========================================================//
|
||||||
// fields added with dwarfs-0.3.0, file system version 2.1 //
|
// fields added with dwarfs-0.3.0, file system version 2.1 //
|
||||||
//=========================================================//
|
//=========================================================//
|
||||||
|
|
||||||
// device ids, for lookup by (inode - device_index_offset)
|
// device ids, for lookup by (inode - device_index_offset)
|
||||||
17: optional list<UInt64> devices,
|
17: optional list<UInt64> devices,
|
||||||
|
|
||||||
// file system options
|
// file system options
|
||||||
18: optional fs_options options,
|
18: optional fs_options options,
|
||||||
|
|
||||||
|
//=========================================================//
|
||||||
|
// fields added with dwarfs-0.5.0, file system version 2.3 //
|
||||||
|
//=========================================================//
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
19: optional list<dir_entry> dir_entries,
|
||||||
|
|
||||||
|
20: optional UInt64 timestamp,
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user