https://mp.weixin.qq.com/s/1vyfhZuF4RyRE5Qjj6AGWA
简单介绍SourceShrinker的实现。
1. 基本介绍
用于把上游节点的source数量压缩到指定的值(maxInFlight)。
2. diplomacy node
diplomacy node用于与上下游节点相连接,并分别向上下游传递参数信息。
1) client
压缩之后的client参数,即要展示给下游节点看的client参数:
其中:sourceId的范围限定在最大值是maxInFlight。
2) node
定义用于适配参数的clientFn和managerFn:
其中:
a. clientFn:在client的基础上,对requestFifo进行处理,确定是否需要下游节点的FIFO支持;
b. managerFn:如果maxInFlight==1,那么SourceShrinker节点只能并发处理一个请求,相当于告诉上游节点SourceShrinker只有一个fifo。
3. lazy module
lazy module用于实现SourceShrinker的内部逻辑。这里主要是在上下游节点之间对source域进行适配。
1) 成对的输入边和输出边
2) 不支持适配Cache节点
3) 如果maxInFlight的值大于原有sourceId的数目那么就相当于要放大,也就不存在压缩sourceId的情况,直接透传source域即可,无需适配:
下面介绍需要压缩sourceId的情况。
4) 生成一个sourceId的位图:
其中:
a. sourceIdMap的宽度为maxInFlight位,即每个允许的sourceId一位;
b. allocated:记录哪些sourceId已分配的位图;
c. nextFree:下一个空闲可使用的sourceId;
d. full:是否所有的sourceId都已经被分配占用;
5) 如果所有的sourceId都被占用,就阻止上游节点继续发送请求:
6) 把in.a.bits.source适配成下一个可使用的sourceId:
记录新分配的sourceId,对应的原sourceId:
7) 根据响应消息中的source,查找记录中对应的sourceId,并还原到in.d.bits.source:
其中:bypass用于处理同一个时钟周期可以返回响应消息的情况。
8) 更新位图信息: