Oplog 分析

OpLog 实现了 CompactableOplog, Flushable

有三种类型的oplog文件, crf, drf,krf

  private final OplogFile crf = new OplogFile();
  private final OplogFile drf = new OplogFile();
  private final KRFile krf = new KRFile();

OpLog被 DiskStore拥有

 /** The store that owns this Oplog* */
  private final DiskStoreImpl parent;

opLogSet 包含一个diskStoreImple下面的所有opLog

/**
   * The oplog set this oplog is part of
   */
  private final PersistentOplogSet oplogSet;

Region初始化

LocalRegion在构造函数中 会创建 diskSoreImpl 
this.diskStoreImpl = findDiskStore(attrs, internalRegionArgs);

GemfireCacheImpl.getOrCreateDefaultDiskStore

LocalRegion.createDiskRegion
DiskRegion.create
DiskInitFile.createDiskRegion

初始化 AbstractDiskRegion的时候   protected AbstractDiskRegion(DiskStoreImpl ds, String name)
DiskRegionView drv = ds.getDiskInitFile().takeDiskRegionByName(name);

oplogSet.parent = DiskStoreImpl
opLog.parent = DiskStoreImpl
DisStoreImpl 在 初始化的时候 loadFiles , 此时加载opLog到oplogSet

重要的属性

 /**
   * This system property instructs that writes be synchronously written to disk and not to file
   * system. (Use rwd instead of rw - RandomAccessFile property)
   * 同步写
   */
  private static final boolean SYNC_WRITES =
      Boolean.getBoolean(DistributionConfig.GEMFIRE_PREFIX + "syncWrites");

/**
   * The HighWaterMark of recentValues.
   * 最近数量
   */
  private final AtomicLong totalCount = new AtomicLong(0);

  /**
   * The number of records in this oplog that contain the most recent value of the entry.
   * 最近活跃数量
   */
  private final AtomicLong totalLiveCount = new AtomicLong(0);

/**
   * Set to true once compact is called on this oplog.
   * 做压缩的时候设置标记
   * @since GemFire prPersistSprint1
   */
  private volatile boolean compacting = false;

DiskStoreImpl

DistributedRegion 在初始化的时候,如果是从磁盘恢复数据, 会执行如下路径

DiskRegion dskRgn = getDiskRegion();

dskRgn.initializeOwner(this); // do recovery

DiskStoreImpl.initializeOwner(LocalRegion lr)

DiskStoreImpl.recoverRegionsThatAreReady()

PersistentOplogSet.recoverRegionsThatAreReady()

PersistentOplogSet.recoverOplogs(long byteCount)

OpLog.initAfterRecovery(boolean offline)

 void initAfterRecovery(boolean offline) {
   //删除crf
   else if (!offline) {
        // drf exists but crf has been deleted (because it was empty).
        // I don't think the drf needs to be opened. It is only used during
        // recovery.
        // At some point the compacter my identify that it can be deleted.
        this.crf.RAFClosed = true;
        deleteCRF();
        this.closed = true;
        this.deleted.set(true);
      }
      this.drf.RAFClosed = true; // since we never open it on a recovered oplog


//删除drf
if (hasNoLiveValues() && !offline) {
      getOplogSet().removeOplog(getOplogId(), true, getHasDeletes() ? this : null);
      if (!getHasDeletes()) {
        getOplogSet().drfDelete(this.oplogId);
        deleteFile(this.drf);
      }
    }
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值