GComm  0.2.3
evs_message2.hpp
1 /*
2  * Copyright (C) 2009 Codership Oy <info@codership.com>
3  *
4  * $Id$
5  */
6 
7 #ifndef EVS_MESSAGE2_HPP
8 #define EVS_MESSAGE2_HPP
9 
10 
11 #include "gcomm/order.hpp"
12 #include "gcomm/view.hpp"
13 #include "gcomm/map.hpp"
14 
15 #include "evs_seqno.hpp"
16 
17 #include "gu_datetime.hpp"
18 #include "gu_convert.hpp"
19 
20 namespace gcomm
21 {
22  namespace evs
23  {
24  class MessageNode;
25  std::ostream& operator<<(std::ostream&, const MessageNode&);
26  class MessageNodeList;
27  class Message;
28  std::ostream& operator<<(std::ostream&, const Message&);
29  class UserMessage;
30  class AggregateMessage;
31  std::ostream& operator<<(std::ostream&, const AggregateMessage&);
32  class DelegateMessage;
33  class GapMessage;
34  class JoinMessage;
35  class LeaveMessage;
36  class InstallMessage;
37  class SelectNodesOp;
38  class RangeLuCmp;
39  class RangeHsCmp;
40  }
41 }
42 
43 
44 
45 
47 {
48 public:
49  MessageNode(const bool operational = false,
50  const bool suspected = false,
51  const SegmentId segment = 0,
52  const seqno_t leave_seq = -1,
53  const ViewId& view_id = ViewId(V_REG),
54  const seqno_t safe_seq = -1,
55  const Range im_range = Range()) :
56  operational_(operational),
57  suspected_ (suspected ),
58  segment_ (segment ),
59  leave_seq_ (leave_seq ),
60  view_id_ (view_id ),
61  safe_seq_ (safe_seq ),
62  im_range_ (im_range )
63  { }
64 
65  MessageNode(const MessageNode& mn)
66  :
67  operational_ (mn.operational_),
68  suspected_ (mn.suspected_ ),
69  segment_ (mn.segment_ ),
70  leave_seq_ (mn.leave_seq_ ),
71  view_id_ (mn.view_id_ ),
72  safe_seq_ (mn.safe_seq_ ),
73  im_range_ (mn.im_range_ )
74  { }
75 
76  bool operational() const { return operational_ ; }
77  bool suspected() const { return suspected_ ; }
78  bool leaving() const { return (leave_seq_ != -1) ; }
79  seqno_t leave_seq() const { return leave_seq_ ; }
80  const ViewId& view_id() const { return view_id_ ; }
81  seqno_t safe_seq() const { return safe_seq_ ; }
82  Range im_range() const { return im_range_ ; }
83  SegmentId segment() const { return segment_ ; }
84 
85  bool operator==(const MessageNode& cmp) const
86  {
87  return (operational_ == cmp.operational_ &&
88  suspected_ == cmp.suspected_ &&
89  leave_seq_ == cmp.leave_seq_ &&
90  view_id_ == cmp.view_id_ &&
91  safe_seq_ == cmp.safe_seq_ &&
92  im_range_ == cmp.im_range_);
93  }
94 
95  size_t serialize(gu::byte_t* buf, size_t buflen, size_t offset) const;
96  size_t unserialize(const gu::byte_t* buf, size_t buflen, size_t offset);
97  static size_t serial_size();
98 private:
99  enum
100  {
101  F_OPERATIONAL = 1 << 0,
102  F_SUSPECTED = 1 << 1
103  };
104  bool operational_; // Is operational
105  bool suspected_;
106  SegmentId segment_;
107  seqno_t leave_seq_;
108  ViewId view_id_; // Current view as seen by source of this message
109  seqno_t safe_seq_; // Safe seq as seen...
110  Range im_range_; // Input map range as seen...
111 };
112 
114  public gcomm::Map<gcomm::UUID, MessageNode>
115 {
116 };
117 
122 {
123 public:
124  enum Type
125  {
126  T_NONE = 0,
127  T_USER = 1,
129  T_GAP = 3,
130  T_JOIN = 4,
131  T_INSTALL = 5,
132  T_LEAVE = 6
133  };
134 
135 
136  static const uint8_t F_MSG_MORE = 0x1;
137  static const uint8_t F_RETRANS = 0x2;
142  static const uint8_t F_SOURCE = 0x4;
143 
144  static const uint8_t F_AGGREGATE= 0x8;
145  static const uint8_t F_COMMIT = 0x10;
146  static const uint8_t F_BC = 0x20;
152  uint8_t version() const { return version_; }
153 
159  Type type() const { return type_; }
160 
166  bool is_membership() const
167  {
168  return (type_ == T_JOIN || type_ == T_INSTALL || type_ == T_LEAVE);
169  }
170 
177  uint8_t user_type() const { return user_type_; }
178 
184  Order order() const { return order_; }
185 
191  seqno_t seq() const { return seq_; }
192 
198  seqno_t seq_range() const { return seq_range_; }
199 
205  seqno_t aru_seq() const { return aru_seq_; }
206 
212  uint8_t flags() const { return flags_; }
213 
219  void set_source(const UUID& uuid)
220  {
221  source_ = uuid;
222  flags_ |= F_SOURCE;
223  }
224 
230  const UUID& source() const { return source_; }
231 
238  const gcomm::ViewId& source_view_id() const { return source_view_id_; }
239 
240  const gcomm::ViewId& install_view_id() const { return install_view_id_; }
241 
247  const UUID& range_uuid() const { return range_uuid_; }
248 
254  Range range() const { return range_; }
255 
262  int64_t fifo_seq() const { return fifo_seq_; }
263 
269  const MessageNodeList& node_list() const { return node_list_; }
270 
274  gu::datetime::Date tstamp() const { return tstamp_; }
275 
276  size_t unserialize(const gu::byte_t* buf, size_t buflen, size_t offset);
277 
278  bool operator==(const Message& cmp) const;
279 
284  Message(const Message& msg) :
285  version_ (msg.version_),
286  type_ (msg.type_),
287  user_type_ (msg.user_type_),
288  order_ (msg.order_),
289  seq_ (msg.seq_),
290  seq_range_ (msg.seq_range_),
291  aru_seq_ (msg.aru_seq_),
292  fifo_seq_ (msg.fifo_seq_),
293  flags_ (msg.flags_),
294  source_ (msg.source_),
295  source_view_id_ (msg.source_view_id_),
296  install_view_id_ (msg.install_view_id_),
297  range_uuid_ (msg.range_uuid_),
298  range_ (msg.range_),
299  tstamp_ (msg.tstamp_),
300  node_list_ (msg.node_list_)
301  { }
302 
303  Message& operator=(const Message& msg)
304  {
305  version_ = msg.version_;
306  type_ = msg.type_;
307  user_type_ = msg.user_type_;
308  order_ = msg.order_;
309  seq_ = msg.seq_;
310  seq_range_ = msg.seq_range_;
311  aru_seq_ = msg.aru_seq_;
312  fifo_seq_ = msg.fifo_seq_;
313  flags_ = msg.flags_;
314  source_ = msg.source_;
315  source_view_id_ = msg.source_view_id_;
316  install_view_id_ = msg.install_view_id_;
317  range_uuid_ = msg.range_uuid_;
318  range_ = msg.range_;
319  tstamp_ = msg.tstamp_;
320  node_list_ = msg.node_list_;
321  return *this;
322  }
323 
324  virtual ~Message() { }
325 
326 
328  Message(const uint8_t version = 0,
329  const Type type = T_NONE,
330  const UUID& source = UUID::nil(),
331  const ViewId& source_view_id = ViewId(),
332  const ViewId& install_view_id = ViewId(),
333  const uint8_t user_type = 0xff,
334  const Order order = O_DROP,
335  const int64_t fifo_seq = -1,
336  const seqno_t seq = -1,
337  const seqno_t seq_range = -1,
338  const seqno_t aru_seq = -1,
339  const uint8_t flags = 0,
340  const UUID& range_uuid = UUID(),
341  const Range range = Range(),
343  version_ (version),
344  type_ (type),
345  user_type_ (user_type),
346  order_ (order),
347  seq_ (seq),
348  seq_range_ (seq_range),
349  aru_seq_ (aru_seq),
350  fifo_seq_ (fifo_seq),
351  flags_ (flags),
352  source_ (source),
353  source_view_id_ (source_view_id),
354  install_view_id_ (install_view_id),
355  range_uuid_ (range_uuid),
356  range_ (range),
357  tstamp_ (gu::datetime::Date::now()),
358  node_list_ (node_list)
359  { }
360 
361 protected:
362 
363  size_t serialize(gu::byte_t* buf, size_t buflen, size_t offset) const;
364 
365  size_t serial_size() const;
366 
367  uint8_t version_;
368  Type type_;
369  uint8_t user_type_;
370  Order order_;
371  seqno_t seq_;
372  seqno_t seq_range_;
373  seqno_t aru_seq_;
374  int64_t fifo_seq_;
375  uint8_t flags_;
376  UUID source_;
377  ViewId source_view_id_;
378  ViewId install_view_id_;
379  UUID range_uuid_;
380  Range range_;
381  gu::datetime::Date tstamp_;
382  MessageNodeList node_list_;
383 
384 
385 };
386 
391 {
392 public:
393  UserMessage(const int version = -1,
394  const UUID& source = UUID::nil(),
395  const ViewId& source_view_id = ViewId(),
396  const seqno_t seq = -1,
397  const seqno_t aru_seq = -1,
398  const seqno_t seq_range = 0,
399  const Order order = O_SAFE,
400  const int64_t fifo_seq = -1,
401  const uint8_t user_type = 0xff,
402  const uint8_t flags = 0) :
405  source,
407  ViewId(),
408  user_type,
409  order,
410  fifo_seq,
411  seq,
412  seq_range,
413  aru_seq,
414  flags,
415  UUID(),
416  Range())
417  { }
418 
419  void set_aru_seq(const seqno_t as) { aru_seq_ = as; }
420 
421  size_t serialize(gu::byte_t* buf, size_t buflen, size_t offset) const;
422  size_t unserialize(const gu::byte_t* buf, size_t buflen, size_t offset,
423  bool skip_header = false);
424  size_t serial_size() const;
425 
426 };
427 
428 
430 {
431 public:
432  AggregateMessage(const int flags = 0,
433  const size_t len = 0,
434  const uint8_t user_type = 0xff)
435  :
436  flags_ (gu::convert(flags, uint8_t(0))),
437  user_type_(user_type),
438  len_ (gu::convert(len, uint16_t(0)))
439  { }
440 
441  int flags() const { return flags_; }
442  size_t len() const { return len_; }
443  uint8_t user_type() const { return user_type_; }
444 
445  size_t serialize(gu::byte_t* buf, size_t buflen, size_t offset) const;
446  size_t unserialize(const gu::byte_t* buf, size_t buflen, size_t offset);
447  size_t serial_size() const;
448  bool operator==(const AggregateMessage& cmp) const
449  {
450  return (flags_ == cmp.flags_ && len_ == cmp.len_ && user_type_ == cmp.user_type_);
451  }
452 
453 private:
454  uint8_t flags_;
455  uint8_t user_type_;
456  uint16_t len_;
457 };
458 
459 inline std::ostream& gcomm::evs::operator<<(std::ostream& os, const AggregateMessage& am)
460 {
461  return (os << "{flags=" << am.flags() << ",len=" << am.len() << "}");
462 }
463 
464 
466 {
467 public:
468  DelegateMessage(const int version = -1,
469  const UUID& source = UUID::nil(),
470  const ViewId& source_view_id = ViewId(),
471  const int64_t fifo_seq = -1) :
473  T_DELEGATE,
474  source,
476  ViewId(),
477  0xff,
478  O_UNRELIABLE,
479  fifo_seq)
480  { }
481  size_t serialize(gu::byte_t* buf, size_t buflen, size_t offset) const;
482  size_t unserialize(const gu::byte_t* buf, size_t buflen, size_t offset,
483  bool skip_header = false);
484  size_t serial_size() const;
485 };
486 
488 {
489 public:
490  GapMessage(const int version = -1,
491  const UUID& source = UUID::nil(),
492  const ViewId& source_view_id = ViewId(),
493  const seqno_t seq = -1,
494  const seqno_t aru_seq = -1,
495  const int64_t fifo_seq = -1,
496  const UUID& range_uuid = UUID::nil(),
497  const Range range = Range(),
498  const uint8_t flags = 0) :
500  T_GAP,
501  source,
503  ViewId(),
504  0xff,
505  O_UNRELIABLE,
506  fifo_seq,
507  seq,
508  -1,
509  aru_seq,
510  flags,
511  range_uuid,
512  range)
513  { }
514  size_t serialize(gu::byte_t* buf, size_t buflen, size_t offset) const;
515  size_t unserialize(const gu::byte_t* buf, size_t buflen, size_t offset,
516  bool skip_header = false);
517  size_t serial_size() const;
518 };
519 
521 {
522 public:
523  JoinMessage(const int version = -1,
524  const UUID& source = UUID::nil(),
525  const ViewId& source_view_id = ViewId(),
526  const seqno_t seq = -1,
527  const seqno_t aru_seq = -1,
528  const int64_t fifo_seq = -1,
532  source,
534  ViewId(),
535  0xff,
536  O_UNRELIABLE,
537  fifo_seq,
538  seq,
539  -1,
540  aru_seq,
541  0,
542  UUID(),
543  Range(),
544  node_list)
545  { }
546  size_t serialize(gu::byte_t* buf, size_t buflen, size_t offset) const;
547  size_t unserialize(const gu::byte_t* buf, size_t buflen, size_t offset,
548  bool skip_header = false);
549  size_t serial_size() const;
550 };
551 
553 {
554 public:
555  InstallMessage(const int version = -1,
556  const UUID& source = UUID::nil(),
557  const ViewId& source_view_id = ViewId(),
558  const ViewId& install_view_id = ViewId(),
559  const seqno_t seq = -1,
560  const seqno_t aru_seq = -1,
561  const int64_t fifo_seq = -1,
565  source,
567  install_view_id,
568  0xff,
569  O_UNRELIABLE,
570  fifo_seq,
571  seq,
572  -1,
573  aru_seq,
574  0,
575  UUID(),
576  Range(),
577  node_list)
578  { }
579  size_t serialize(gu::byte_t* buf, size_t buflen, size_t offset) const;
580  size_t unserialize(const gu::byte_t* buf, size_t buflen, size_t offset,
581  bool skip_header = false);
582  size_t serial_size() const;
583 };
584 
586 {
587 public:
588  LeaveMessage(const int version = -1,
589  const UUID& source = UUID::nil(),
590  const ViewId& source_view_id = ViewId(),
591  const seqno_t seq = -1,
592  const seqno_t aru_seq = -1,
593  const int64_t fifo_seq = -1,
594  const uint8_t flags = 0) :
596  T_LEAVE,
597  source,
599  ViewId(),
600  0xff,
601  O_UNRELIABLE,
602  fifo_seq,
603  seq,
604  -1,
605  aru_seq,
606  flags)
607  { }
608  size_t serialize(gu::byte_t* buf, size_t buflen, size_t offset) const;
609  size_t unserialize(const gu::byte_t* buf, size_t buflen, size_t offset,
610  bool skip_header = false);
611  size_t serial_size() const;
612 };
613 
614 
616 {
617 public:
619  const gcomm::ViewId& view_id,
620  const bool operational,
621  const bool leaving)
622  :
623  nl_ (nl),
624  view_id_ (view_id),
625  operational_ (operational),
626  leaving_ (leaving)
627  { }
628 
629  void operator()(const MessageNodeList::value_type& vt) const
630  {
631  const MessageNode& node(MessageNodeList::value(vt));
632  if ((view_id_ == ViewId() ||
633  node.view_id() == view_id_ ) &&
634  ((operational_ == true &&
635  leaving_ == true ) ||
636  (node.operational() == operational_ &&
637  node.leaving() == leaving_ ) ) )
638 
639  {
640  nl_.insert_unique(vt);
641  }
642  }
643 private:
644  MessageNodeList& nl_;
645  ViewId const view_id_;
646  bool const operational_;
647  bool const leaving_;
648 };
649 
650 
652 {
653 public:
654  bool operator()(const MessageNodeList::value_type& a,
655  const MessageNodeList::value_type& b) const
656  {
657  gcomm_assert(MessageNodeList::value(a).view_id() ==
658  MessageNodeList::value(b).view_id());
659  return (MessageNodeList::value(a).im_range().lu() <
660  MessageNodeList::value(b).im_range().lu());
661  }
662 };
663 
665 {
666 public:
667  bool operator()(const MessageNodeList::value_type& a,
668  const MessageNodeList::value_type& b) const
669  {
670  gcomm_assert(MessageNodeList::value(a).view_id() ==
671  MessageNodeList::value(b).view_id());
672  return (MessageNodeList::value(a).im_range().hs() <
673  MessageNodeList::value(b).im_range().hs());
674  }
675 };
676 
677 
678 #endif // EVS_MESSAGE2_HPP
Definition: view.hpp:29
gu::datetime::Date tstamp() const
Definition: evs_message2.hpp:274
Definition: evs_message2.hpp:132
static const uint8_t F_AGGREGATE
Definition: evs_message2.hpp:144
Message(const uint8_t version=0, const Type type=T_NONE, const UUID &source=UUID::nil(), const ViewId &source_view_id=ViewId(), const ViewId &install_view_id=ViewId(), const uint8_t user_type=0xff, const Order order=O_DROP, const int64_t fifo_seq=-1, const seqno_t seq=-1, const seqno_t seq_range=-1, const seqno_t aru_seq=-1, const uint8_t flags=0, const UUID &range_uuid=UUID(), const Range range=Range(), const MessageNodeList &node_list=MessageNodeList())
Definition: evs_message2.hpp:328
uint8_t user_type() const
Definition: evs_message2.hpp:177
Definition: evs_seqno.hpp:31
Order order() const
Definition: evs_message2.hpp:184
Definition: evs_message2.hpp:429
Definition: evs_message2.hpp:520
Definition: evs_message2.hpp:131
Definition: map.hpp:210
Definition: evs_message2.hpp:465
Definition: evs_message2.hpp:127
void set_source(const UUID &uuid)
Definition: evs_message2.hpp:219
Definition: evs_message2.hpp:128
Definition: evs_message2.hpp:552
Message order type enumeration.
static const uint8_t F_MSG_MORE
Definition: evs_message2.hpp:136
Type type() const
Definition: evs_message2.hpp:159
Definition: evs_message2.hpp:585
Definition: evs_message2.hpp:664
Definition: evs_message2.hpp:130
const UUID & range_uuid() const
Definition: evs_message2.hpp:247
Definition: evs_message2.hpp:615
static const uint8_t F_RETRANS
Definition: evs_message2.hpp:137
seqno_t seq_range() const
Definition: evs_message2.hpp:198
Range range() const
Definition: evs_message2.hpp:254
Definition: evs_message2.hpp:390
const gcomm::ViewId & source_view_id() const
Definition: evs_message2.hpp:238
Definition: evs_message2.hpp:129
uint8_t flags() const
Definition: evs_message2.hpp:212
const UUID & source() const
Definition: evs_message2.hpp:230
uint8_t version() const
Definition: evs_message2.hpp:152
Definition: evs_message2.hpp:487
Definition: evs_message2.hpp:46
seqno_t aru_seq() const
Definition: evs_message2.hpp:205
bool is_membership() const
Definition: evs_message2.hpp:166
static const uint8_t F_SOURCE
Message source has been set explicitly via set_source()
Definition: evs_message2.hpp:142
Definition: evs_message2.hpp:113
Message(const Message &msg)
Definition: evs_message2.hpp:284
seqno_t seq() const
Definition: evs_message2.hpp:191
#define gcomm_assert(cond_)
Definition: exception.hpp:21
static const uint8_t F_BC
Definition: evs_message2.hpp:146
Definition: evs_message2.hpp:121
Definition: evs_message2.hpp:651
const MessageNodeList & node_list() const
Definition: evs_message2.hpp:269
Type
Definition: evs_message2.hpp:124
Definition: uuid.hpp:26
int64_t fifo_seq() const
Definition: evs_message2.hpp:262