XARecoveryLog.h
上传用户:xfwatch
上传日期:2020-12-14
资源大小:872k
文件大小:3k
源码类别:

中间件编程

开发平台:

Java

  1. /*
  2.  * JBoss, Home of Professional Open Source
  3.  * Copyright 2009, Red Hat, Inc., and others contributors as indicated
  4.  * by the @authors tag. All rights reserved.
  5.  * See the copyright.txt in the distribution for a
  6.  * full listing of individual contributors.
  7.  * This copyrighted material is made available to anyone wishing to use,
  8.  * modify, copy, or redistribute it subject to the terms and conditions
  9.  * of the GNU Lesser General Public License, v. 2.1.
  10.  * This program is distributed in the hope that it will be useful, but WITHOUT A
  11.  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
  12.  * PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
  13.  * You should have received a copy of the GNU Lesser General Public License,
  14.  * v.2.1 along with this distribution; if not, write to the Free Software
  15.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  16.  * MA  02110-1301, USA.
  17.  */
  18. #ifndef _XARECOVERYLOG_H
  19. #define _XARECOVERYLOG_H
  20. #include "xa.h"
  21. #include <fstream>
  22. #include "atmiBrokerTxMacro.h"
  23. #include "RMException.h"
  24. //#include "SynchronizableObject.h"
  25. /*
  26.  * Simple log for recording branch recovery coordinators at
  27.  * prepare time, for deleting them after commit and for
  28.  * reading outstanding branches after a crash.
  29.  *
  30.  * As branch records are created and deleted the backing store for
  31.  * the log is kept in sync with the in memory copy thus ensuring
  32.  * that the log can be recreated correctly after a crash.
  33.  *
  34.  * The algorithm manages a chunk of memory from allocations are
  35.  * a created and freed (cf malloc and free). Unfortunately, the
  36.  * standard allocator algorithms cannot be used since they
  37.  * generally rely on multiple memory locations for managing the
  38.  * the storage area:
  39.  * 
  40.  * - a recovery record needs to be created or deleted in a single
  41.  *   atomic sync operations.
  42.  *
  43.  */
  44. /*
  45.  * A recovery record consists of an XID and a CosTransactions RecoveryCoordinator IOR
  46.  * The string form of the IOR follows directly after the recovery record).
  47.  */
  48. typedef struct rrec {
  49. size_t next; // offset to the next free block
  50. long magic; // mark to indicate the block is allocated
  51. XID xid;
  52. } rrec_t;
  53. class BLACKTIE_TX_DLL XARecoveryLog {
  54. public:
  55. XARecoveryLog(const char *logfile = 0) throw (RMException);
  56. ~XARecoveryLog();
  57. // add, lookup and delete log records
  58. int add_rec(XID& xid, char *ior);
  59. char* find_ior(XID& xid);
  60. int del_rec(XID& xid);
  61. // mechanism for iterating through the log
  62. rrec_t* find_next(rrec_t* from);
  63. const char *get_ior(rrec_t&);
  64. private:
  65. std::fstream log_;
  66. rrec_t* arena_;
  67. size_t nblocks_;
  68. size_t maxblocks_; // limit the arena to this many blocks (configurable)
  69. // SynchronizableObject lock_;
  70. bool morecore(size_t nblocks, bool dosync);
  71. void sync_rec(void* p, size_t sz);
  72. void check_log();
  73. rrec_t* next_free(size_t nblocks);
  74. int find(XID xid, rrec_t** prev, rrec_t** next);
  75. bool load_log(const char* logname);
  76. void debug_dump(rrec_t* from, rrec_t* to);
  77. rrec_t* next_rec(rrec_t* p);
  78. };
  79. #endif //_XARECOVERYLOG_H