cleversafe 的读写机制分析与编解码接口

 

关于读写部分主要从二个地方来的:

1、org.cleversafe.layer.block.dsd.SystemBlockDeviceController.ReadBlocksDeviceJob.call()

主要在

org.cleversafe.layer.access.cli.CreateTarget.main(String[])

org.cleversafe.layer.access.cli.CreateVault.main(String[])

org.cleversafe.layer.access.cli.ListVaults.main(String[])

等处用到。也就是管理target和vault的时候用到的。

 

 

2、org.cleversafe.layer.target.tasks.ReadGridTask.execute()

这一个是从org.jscsi.scsi.tasks.AbstractTask.run()来的,也就是上图中的JSCSI层(iscsi)

 

 

 

 

 


 

 

org.cleversafe.layer.block中的BlockDeviceController;

的:

   public byte[] readBlocks(long firstBlock, int numBlocks) 中

这二个参数分别是第一个块,读取的总块数。

 

 

关于拆包、编码、解码的关键在grid 层。

org.cleversafe.layer.grid.smartcontroller 中的SmartReadController

这个应该是人工写的。

在readImpl 方法中

先初始化一个matrix,

调用ReadStateMachine及unimod来实现一些具体逻辑

先进行一系列的初始化,run()中运行unimod的图逻辑,

运行完以后由BasedVault来解码:   vault.rebuildSources(matrix, false);

注:其中先解的是IDA码,后解的是decode的stack.

org.cleversafe.vault.BaseVault.applyAssemblyStack(SourceSliceSet, boolean)中先解IDA

 


下面来看一下unimod:

 

具体逻辑 主要由read、write二个功能模块组成,用了很奇怪的unimod框架,无语了。个人觉着这一块的逻辑还不是太复杂,没有必要用这种框架,用了反而复杂了。

 


package org.cleversafe.layer.grid;

ReaderXXXX.unimod

 


 

 

 

以read为例,每一步操作完成以后:

用  this.fireEvent(new UnimodEvent(EV_OK), true);

写到eventQueue中,即      this.eventQueue.add(event);

 

 

public Object runStateMachine(UnimodStateMachineContext context) throws Exception

中会有一个while(true)循环对eventQueue中的event及时处理。

 

 this.modelEventManager.handleAndWait(event, context);//事件在这里为发布。

 

 

每一步,组合起来的逻辑用unimod本身的机制画出来的。

NND,这玩意的效率能高吗?

 

 

在解码步骤中用

decodeSlice(DataSlice slice) 对单slice先解码,再写入matrix。

 

其中decodeSlice(DataSlice slice) 在BaseVault中的有定义:

   public DataSlice decodeSlice(DataSlice slice) throws DataTransformationException
   {
      byte[] data =
            this.decodeDataImpl(this.reverseSliceCodecs, slice.getSliceName().getSourceName(),
                  slice.getTransactionId(), slice.getData());
      return new DataSlice(slice.getSliceName(), slice.getTransactionId(), data);
   }

 

/以下是单slice的编解码方式//

其中 reverseSliceCodecs,由 :

  protected void setSliceCodecs(List<Codec> sliceCodecs)
   {
      if (sliceCodecs != null)
      {
         this.sliceCodecs = sliceCodecs;
      }
      else
      {
         this.sliceCodecs = new ArrayList<Codec>();
      }
      this.reverseSliceCodecs = new ArrayList<Codec>(this.sliceCodecs);
      Collections.reverse(this.reverseSliceCodecs);
   }

来生成。

 

this.sliceCodecs,MS是由xmlbeans直接读xml后生成的。

 

主要构架关系:

 

BaseVault implement Vault;  //sliceCodecs在构造函数中传入

 

org.cleversafe.layer.block中

BlockDeviceVault extends BaseVault // sliceCodecs也在构造函数中传入

 

该类的实例化,是在org.cleversafe.layer.block.dsd中的BlockDeviceMain类的main()

但是这里MS加进来的是空的。

 

 

/ 以上是单slice的编解码方式 //

 

 

 

 

/ 以下是IDA的编解码方式 //

 

 

/ 以上是IDA的编解码方式 //

 

 

 

=================有效读写多少个包,才能开始读写=====================

grid层是在BaseVault.java中的initialize()中计算出来的

 int t = this.idaCodec.getThreshold();
      int n = this.idaCodec.getNumSlices();

源于上二个数。

coset中的实现(修改):

CosetInformationDispersalCodec

初始化函数中加了
      this.threshold_anycom_coset=this.threshold;
      this.threshold=this.numSlices;

其中.threshold_anycom_coset是在  abstract class InformationDispersalCodecBase 中加的新属性。

 在 new CosetIDAParameters()中将原来的 this.threshold 改用了这个,因为threshold对内部还是有用的,不能用this.numSlices来替代。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值