From d52832d498e2364a38f49bad67d300f0773f889d Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Thu, 2 Jun 2016 20:04:38 +0800 Subject: [PATCH] msg: don't truncate message sequence to 32-bits Message sequence is 64-bits number, but the upper 32-bits get lost when setting/getting message sequence. This causes messenger to malfunction after receiving 1^32 messages Fixes: http://tracker.ceph.com/issues/16122 Signed-off-by: Yan, Zheng --- src/msg/Message.h | 4 ++-- src/msg/async/AsyncConnection.h | 4 ++-- src/msg/simple/Pipe.h | 2 +- src/msg/xio/XioConnection.h | 22 +++++++++++----------- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/msg/Message.h b/src/msg/Message.h index d9cd9a23bea..09122d6b982 100644 --- a/src/msg/Message.h +++ b/src/msg/Message.h @@ -422,8 +422,8 @@ public: uint64_t get_tid() const { return header.tid; } void set_tid(uint64_t t) { header.tid = t; } - unsigned get_seq() const { return header.seq; } - void set_seq(unsigned s) { header.seq = s; } + uint64_t get_seq() const { return header.seq; } + void set_seq(uint64_t s) { header.seq = s; } unsigned get_priority() const { return header.priority; } void set_priority(__s16 p) { header.priority = p; } diff --git a/src/msg/async/AsyncConnection.h b/src/msg/async/AsyncConnection.h index 416bccba42a..45ec461fc16 100644 --- a/src/msg/async/AsyncConnection.h +++ b/src/msg/async/AsyncConnection.h @@ -278,8 +278,8 @@ class AsyncConnection : public Connection { PerfCounters *logger; int global_seq; __u32 connect_seq, peer_global_seq; - atomic_t out_seq; - atomic_t ack_left, in_seq; + atomic64_t out_seq; + atomic64_t ack_left, in_seq; int state; int state_after_send; int sd; diff --git a/src/msg/simple/Pipe.h b/src/msg/simple/Pipe.h index d9e346c7e40..c9a166e6611 100644 --- a/src/msg/simple/Pipe.h +++ b/src/msg/simple/Pipe.h @@ -275,7 +275,7 @@ static const int SM_IOV_MAX = (IOV_MAX >= 1024 ? IOV_MAX / 4 : IOV_MAX); static const Pipe& Server(int s); static const Pipe& Client(const entity_addr_t& pi); - __u32 get_out_seq() { return out_seq; } + uint64_t get_out_seq() { return out_seq; } bool is_queued() { return !out_q.empty() || send_keepalive || send_keepalive_ack; } diff --git a/src/msg/xio/XioConnection.h b/src/msg/xio/XioConnection.h index cdd5b2dd80c..aa12b336b01 100644 --- a/src/msg/xio/XioConnection.h +++ b/src/msg/xio/XioConnection.h @@ -93,18 +93,18 @@ private: /* XXX */ uint32_t reconnects; uint32_t connect_seq, peer_global_seq; - uint32_t in_seq, out_seq_acked; // atomic, got receipt - atomic_t out_seq; // atomic + uint64_t in_seq, out_seq_acked; // atomic, got receipt + atomic64_t out_seq; // atomic lifecycle() : state(lifecycle::INIT), reconnects(0), connect_seq(0), peer_global_seq(0), in_seq(0), out_seq_acked(0), out_seq(0) {} - void set_in_seq(uint32_t seq) { + void set_in_seq(uint64_t seq) { in_seq = seq; } - uint32_t next_out_seq() { + uint64_t next_out_seq() { return out_seq.inc(); } @@ -139,8 +139,8 @@ private: uint32_t reconnects; uint32_t connect_seq, global_seq, peer_global_seq; - uint32_t in_seq, out_seq_acked; // atomic, got receipt - atomic_t out_seq; // atomic + uint64_t in_seq, out_seq_acked; // atomic, got receipt + atomic64_t out_seq; // atomic uint32_t flags; @@ -168,11 +168,11 @@ private: return startup_state.read(); } - void set_in_seq(uint32_t seq) { + void set_in_seq(uint64_t seq) { in_seq = seq; } - uint32_t next_out_seq() { + uint64_t next_out_seq() { return out_seq.inc(); }; @@ -339,7 +339,7 @@ typedef boost::intrusive_ptr XioConnectionRef; class XioLoopbackConnection : public Connection { private: - atomic_t seq; + atomic64_t seq; public: explicit XioLoopbackConnection(Messenger *m) : Connection(m->cct, m), seq(0) { @@ -360,11 +360,11 @@ public: void mark_down() override {} void mark_disposable() override {} - uint32_t get_seq() { + uint64_t get_seq() { return seq.read(); } - uint32_t next_seq() { + uint64_t next_seq() { return seq.inc(); } }; -- 2.39.5