remove 3 bytes from PackedUser

additional_gids will be stored separately.
This commit is contained in:
2022-02-22 15:16:45 +02:00
committed by Motiejus Jakštys
parent 78dc63669d
commit e06cac38b2
2 changed files with 31 additions and 39 deletions

View File

@@ -130,7 +130,7 @@ Now that we've sketched the implementation of `id(3)`, it's clearer to
understand which operations need to be fast; in order of importance:
1. lookup gid -> group info (this is on hot path in id) without members.
2. lookup username -> user's group memberships.
2. lookup username -> user's groups.
3. lookup uid -> user.
4. lookup groupname -> group.
5. lookup username -> user.
@@ -325,7 +325,7 @@ pseudo-code:
```
const PackedList = struct {
length: varint,
members: [length]varint
members: [length]varint,
}
const Groupmembers = PackedList;
const AdditionalGids = PackedList;
@@ -333,33 +333,38 @@ const AdditionalGids = PackedList;
A packed list is a list of varints.
Section `AdditionalGidsIndex` stores an index from `hash(username)` to `offset`
in AdditionalGids.
Complete file structure
-----------------------
`idx_*` sections are of type `[]PackedIntArray(u29)` and are pointing to the
respective `Groups` and `Users` entries (from the beginning of the respective
section). Since User and Group records are 8-byte aligned, 3 bits are saved
from every element.
section). Since User and Group records are 8-byte aligned, 3 bits can be saved
from every element. However, since the header easily fits to 64 bytes, we are
storing plain `u32` for easier inspection.
Each section is padded to 64 bytes.
```
SECTION SIZE DESCRIPTION
Header 48 see "Turbonss header" section
bdz_gid2group ? gid->group bdz
bdz_uid2user ? uid->user bdz
bdz_groupname2group ? groupname->group bdz
bdz_name2user ? username->user bdz
idx_gid2group len(group)*4*29/32 bdz->offset gid2group
idx_groupname2group len(group)*4*29/32 bdz->offset groupname2group
idx_uid2user len(user)*4*29/32 bdz->offset uid2user
idx_name2user len(user)*4*29/32 bdz->offset name2user
ShellIndex len(shells)*2 Shell index array
ShellBlob <= 4032 Shell data blob (max 63*64 bytes)
Groups ? packed Group entries (8b padding)
Users ? packed User entries (8b padding)
groupmembers ? per-group memberlist (32b padding)
additional_gids ? per-user grouplist (8b padding)
SECTION SIZE DESCRIPTION
Header 48 see "Turbonss header" section
bdz_gid2group ? gid->group bdz
bdz_uid2user ? uid->user bdz
bdz_groupname2group ? groupname->group bdz
bdz_name2user ? username->user bdz
idx_gid2group len(group)*32 bdz->offset gid2group
idx_groupname2group len(group)*32 bdz->offset groupname2group
idx_uid2user len(user)*32 bdz->offset uid2user
idx_name2user len(user)*32 bdz->offset name2user
idx_username2gids len(user)*32 Per-user gidlist index
ShellIndex len(shells)*2 Shell index array
ShellBlob <= 4032 Shell data blob (max 63*64 bytes)
Groups ? packed Group entries (8b padding)
Users ? packed User entries (8b padding)
Groupmembers ? per-group memberlist (32b padding)
AdditionalGids ? Per-user gidlist entries
```
[git-subtrac]: https://apenwarr.ca/log/20191109