Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

mds: use explicitly sized types for network and disk encoding #54519

Merged
merged 1 commit into from Jan 16, 2024

Conversation

lxbsz
Copy link
Member

@lxbsz lxbsz commented Nov 16, 2023

The size of 'unsigned' type maybe not different from different OSes. And we should always use explicitly sized type.

Fixes: https://tracker.ceph.com/issues/63552

Contribution Guidelines

  • To sign and title your commits, please refer to Submitting Patches to Ceph.

  • If you are submitting a fix for a stable branch (e.g. "quincy"), please refer to Submitting Patches to Ceph - Backports for the proper workflow.

  • When filling out the below checklist, you may click boxes directly in the GitHub web UI. When entering or editing the entire PR message in the GitHub web UI editor, you may also select a checklist item by adding an x between the brackets: [x]. Spaces and capitalization matter when checking off items this way.

Checklist

  • Tracker (select at least one)
    • References tracker ticket
    • Very recent bug; references commit where it was introduced
    • New feature (ticket optional)
    • Doc update (no ticket needed)
    • Code cleanup (no ticket needed)
  • Component impact
    • Affects Dashboard, opened tracker ticket
    • Affects Orchestrator, opened tracker ticket
    • No impact that needs to be tracked
  • Documentation (select at least one)
    • Updates relevant documentation
    • No doc update is appropriate
  • Tests (select at least one)
Show available Jenkins commands
  • jenkins retest this please
  • jenkins test classic perf
  • jenkins test crimson perf
  • jenkins test signed
  • jenkins test make check
  • jenkins test make check arm64
  • jenkins test submodules
  • jenkins test dashboard
  • jenkins test dashboard cephadm
  • jenkins test api
  • jenkins test docs
  • jenkins render docs
  • jenkins test ceph-volume all
  • jenkins test ceph-volume tox
  • jenkins test windows
  • jenkins test rook e2e

The size of 'unsigned' type maybe not different from different OSes.
And we should always use explicitly sized type.

Fixes: https://tracker.ceph.com/issues/63552
Signed-off-by: Xiubo Li <xiubli@redhat.com>
@lxbsz lxbsz requested a review from a team November 16, 2023 07:39
@github-actions github-actions bot added the cephfs Ceph File System label Nov 16, 2023
@dparmar18
Copy link
Contributor

Migrator and Mutation codes too can take this change

Migrator.h:    export_base_t(dirfrag_t df, mds_rank_t d, unsigned c, uint64_t g) :
Migrator.h:    unsigned pending_children;
Migrator.h:  unsigned num_locking_exports = 0; // exports in locking state (approx_size == 0)
Mutation.h:    LockOp(SimpleLock *l, unsigned f=0, mds_rank_t t=MDS_RANK_NONE) :
Mutation.h:    mutable unsigned flags;
Mutation.h:  lock_iterator emplace_lock(SimpleLock *l, unsigned f=0, mds_rank_t t=MDS_RANK_NONE) {

@dparmar18
Copy link
Contributor

and i think some what server code could also be fixed

ceph/src/mds/Server.h

Lines 496 to 507 in 70d8c5b

void _readdir_diff(
utime_t now,
MDRequestRef& mdr,
CInode* diri,
CDir* dir,
SnapRealm* realm,
unsigned max_entries,
int bytes_left,
const std::string& offset_str,
uint32_t offset_hash,
unsigned req_flags,
bufferlist& dirbl);

@lxbsz
Copy link
Member Author

lxbsz commented Nov 20, 2023

and i think some what server code could also be fixed

ceph/src/mds/Server.h

Lines 496 to 507 in 70d8c5b

void _readdir_diff(
utime_t now,
MDRequestRef& mdr,
CInode* diri,
CDir* dir,
SnapRealm* realm,
unsigned max_entries,
int bytes_left,
const std::string& offset_str,
uint32_t offset_hash,
unsigned req_flags,
bufferlist& dirbl);

This should be fine, because we won't do disk encoding directly with them.

@lxbsz
Copy link
Member Author

lxbsz commented Nov 20, 2023

Migrator and Mutation codes too can take this change

Migrator.h:    export_base_t(dirfrag_t df, mds_rank_t d, unsigned c, uint64_t g) :
Migrator.h:    unsigned pending_children;
Migrator.h:  unsigned num_locking_exports = 0; // exports in locking state (approx_size == 0)
Mutation.h:    LockOp(SimpleLock *l, unsigned f=0, mds_rank_t t=MDS_RANK_NONE) :
Mutation.h:    mutable unsigned flags;
Mutation.h:  lock_iterator emplace_lock(SimpleLock *l, unsigned f=0, mds_rank_t t=MDS_RANK_NONE) {

@dparmar18 I didn't see anywhere is encoding this for network or disk, did I miss something here ?

@@ -381,7 +381,7 @@ class Capability : public Counter<Capability> {
ceph_seq_t mseq = 0;

int suppress = 0;
unsigned state = 0;
uint32_t state = 0;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ILP32 and LP64 architectures all implement unsigned as unsigned int a.k.a. uint32_t
could you point where this standard isn't being followed ?

however, I agree its always a good idea to specify the data size upfront during serialization/deserialization

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I couldn't tell exactly where. I just found this when I was coding the kclient patches and googled about this. It's said in some platform or OS it maybe different. As @gregsfortytwo mentioned we should always use explicitly sized type in these cases.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

so is uint32_t good enough or is __le32 more appropriate ?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The uint32_t is good enough here and the encode() will help switch it to __le32.

Copy link
Contributor

@mchangir mchangir left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@dparmar18
Copy link
Contributor

Migrator and Mutation codes too can take this change

Migrator.h:    export_base_t(dirfrag_t df, mds_rank_t d, unsigned c, uint64_t g) :
Migrator.h:    unsigned pending_children;
Migrator.h:  unsigned num_locking_exports = 0; // exports in locking state (approx_size == 0)
Mutation.h:    LockOp(SimpleLock *l, unsigned f=0, mds_rank_t t=MDS_RANK_NONE) :
Mutation.h:    mutable unsigned flags;
Mutation.h:  lock_iterator emplace_lock(SimpleLock *l, unsigned f=0, mds_rank_t t=MDS_RANK_NONE) {

@dparmar18 I didn't see anywhere is encoding this for network or disk, did I miss something here ?

scrolling through these methods i saw usage of fixed size types in their params hence the comment, but since they play no role in encoding, it doesn't make sense to touch them

@dparmar18
Copy link
Contributor

jenkins test make check arm64

@rishabh-d-dave rishabh-d-dave added needs-qa wip-rishabh-testing Rishabh's testing label labels Nov 26, 2023
@rishabh-d-dave rishabh-d-dave merged commit 9f57d8d into ceph:main Jan 16, 2024
14 of 16 checks passed
@rishabh-d-dave
Copy link
Contributor

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
cephfs Ceph File System wip-rishabh-testing Rishabh's testing label
Projects
None yet
5 participants