关于读写部分主要从二个地方来的:
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来替代。