registor.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. /*
  2. * =====================================================================================
  3. *
  4. * Filename: registor.h
  5. *
  6. * Description: registor class definition.
  7. *
  8. * Version: 1.0
  9. * Created: 13/01/2021
  10. * Revision: none
  11. * Compiler: gcc
  12. *
  13. * Author: chenyujie, chenyujie28@jd.com@jd.com
  14. * Company: JD.com, Inc.
  15. *
  16. * =====================================================================================
  17. */
  18. #ifndef __HB_REGISTOR_H
  19. #define __HB_REGISTOR_H
  20. // local
  21. #include "async_file.h"
  22. // libs/api/cc_api/include
  23. #include "dtcapi.h"
  24. // common
  25. #include "log/log.h"
  26. class CRegistor {
  27. public:
  28. CRegistor()
  29. : _master(0)
  30. , _controller()
  31. , _master_ctime(-1) {
  32. } ~CRegistor() {
  33. }
  34. int Init(DTC::Server * m, DTC::Server * s) {
  35. _master = m;
  36. return _controller.Init();
  37. }
  38. int Init() {return _controller.Init();}
  39. void SetMasterServer(DTC::Server * m) { _master = m; }
  40. int Regist();
  41. void ClearJournalID() { _controller.JournalId() = 0x0;}
  42. JournalID& JournalId(void) {
  43. return _controller.JournalId();
  44. }
  45. void SetSyncStatus(int iState) {
  46. _controller.SetDirty(iState);
  47. }
  48. int GetSyncStaus() { return _controller.GetDirty(); }
  49. /*
  50. * 定期检查双方的共享内存,确保二者始终没有变化过。
  51. *
  52. * 如果slave上记录的内存创建时间和master共享内存
  53. * 创建时间相同,证明二者的内存自创建以来,没有
  54. * 被删除过,返回0, 否则返回1
  55. */
  56. int CheckMemoryCreateTime() {
  57. int64_t v0;
  58. if (_master_ctime <= 0) {
  59. log4cplus_info("please invoke \"Regist\" function first");
  60. return 0;
  61. }
  62. v0 = QueryMemoryCreateTime(_master, 1);
  63. if (v0 > 0) {
  64. if (v0 != _master_ctime) {
  65. log4cplus_error("master memory changed");
  66. return -1;
  67. }
  68. }
  69. return 0;
  70. }
  71. #ifdef UINT64FMT
  72. # undef UINT64FMT
  73. #endif
  74. #if __WORDSIZE == 64
  75. # define UINT64FMT "%lu"
  76. #else
  77. # define UINT64FMT "%llu"
  78. #endif
  79. /*
  80. * 设置hbp状态为 "全量同步未完成"
  81. * 当hbp出现任何不可恢复的错误时,应该invoke这个接口
  82. *
  83. */
  84. // void SetHBPStatusDirty() {
  85. // _controller.SetDirty();
  86. // }
  87. private:
  88. // inline int VerifyMemoryCreateTime(long long m, long long s) {
  89. // DTC::SvrAdminRequest rq(_slave);
  90. // rq.SetAdminCode(DTC::VerifyHBT);
  91. // rq.SetMasterHBTimestamp(m);
  92. // rq.SetSlaveHBTimestamp(s);
  93. // DTC::Result rs;
  94. // rq.Execute(rs);
  95. // if (rs.ResultCode() == -DTC::EC_ERR_SYNC_STAGE) {
  96. // return -1;
  97. // }
  98. // return 0;
  99. // }
  100. inline int64_t QueryMemoryCreateTime(DTC::Server * svr, int master) {
  101. DTC::SvrAdminRequest rq(svr);
  102. rq.SetAdminCode(DTC::GetHBTime);
  103. DTC::Result rs;
  104. rq.Execute(rs);
  105. if (rs.ResultCode() != 0)
  106. return -1;
  107. if(master)
  108. return rs.MasterHBTimestamp();
  109. else
  110. return rs.SlaveHBTimestamp();
  111. }
  112. private:
  113. DTC::Server * _master;
  114. CAsyncFileController _controller;
  115. /* master memory create time */
  116. int64_t _master_ctime;
  117. };
  118. #endif