zl程序教程

您现在的位置是:首页 >  其他

当前栏目

Alluxio源码分析定位策略:最大可用容量优先策略MostAvailableFirstPolicy

定位源码 分析 策略 最大 可用 优先 容量
2023-09-27 14:29:33 时间
        最大可用容量优先策略MostAvailableFirstPolicy是一种worker可用容量最大的定位策略。如果没有worker合格的话该策略返回null。它的核心方法getWorkerForNextBlock()实现如下: * A policy that returns the worker with the most available bytes. The policy returns null if no * worker is qualified. * 一种worker可用容量最大的定位策略。

        最大可用容量优先策略MostAvailableFirstPolicy是一种worker可用容量最大的定位策略。如果没有worker合格的话该策略返回null。它的核心方法getWorkerForNextBlock()实现如下:

/**

 * A policy that returns the worker with the most available bytes. The policy returns null if no

 * worker is qualified.

 * 一种worker可用容量最大的定位策略。如果没有worker合格的话该策略返回null。

@ThreadSafe

public final class MostAvailableFirstPolicy implements FileWriteLocationPolicy {

 @Override

 public WorkerNetAddress getWorkerForNextBlock(List BlockWorkerInfo workerInfoList,

 long blockSizeBytes) {

 // 将输入参数BlockWorkerInfo列表workerInfoList转换成ArrayList形式的列表inputList

 List BlockWorkerInfo inputList = Lists.newArrayList(workerInfoList);

 // 标志变量:最大可用容量

 long mostAvailableBytes = -1;

 // 被选中的worker地址

 WorkerNetAddress result = null;

 // 遍历BlockWorkerInfo列表inputList,取出每个BlockWorkerInfo,即workerInfo:

 for (BlockWorkerInfo workerInfo : inputList) {

 // 如果该workerInfo的可用容量(总容量减去已用容量)大于最大可用容量mostAvailableBytes,则

 // 设置标志变量最大可用容量mostAvailableBytes为当前worker的可用容量,设置被选中的worker地址result为当前worker的网络地址

 if (workerInfo.getCapacityBytes() - workerInfo.getUsedBytes() mostAvailableBytes) {

 mostAvailableBytes = workerInfo.getCapacityBytes() - workerInfo.getUsedBytes();

 result = workerInfo.getNetAddress();

 // 返回被选中的worker地址

 return result;

}
        大体流程如下:

        1、将输入参数BlockWorkerInfo列表workerInfoList转换成ArrayList形式的列表inputList;

        2、初始化标志变量:最大可用容量mostAvailableBytes为-1;

        3、初始化被选中的worker地址result为null;

        4、遍历BlockWorkerInfo列表inputList,取出每个BlockWorkerInfo,即workerInfo:

              4.1、如果该workerInfo的可用容量(总容量减去已用容量)大于最大可用容量mostAvailableBytes,则:

                       4.1.1、设置标志变量最大可用容量mostAvailableBytes为当前worker的可用容量;

                       4.1.2、设置被选中的worker地址result为当前worker的网络地址;

        5、返回被选中的worker地址(有可能为null)。

        这里,有个问题:什么时候所有worker已用容量会大于总容量,也就是workerInfo.getCapacityBytes() - workerInfo.getUsedBytes()的值会小于等于-1,而导致最终结果返回null呢?即便是某一个worker,什么时候已用容量会大于总容量呢?留待以后再解决吧!


GoFrame gcache使用实践 | 缓存控制 淘汰策略 gcache模块默认提供的是一个高速的内存缓存,操作效率非常高效,CPU性能损耗在ns纳秒级别。使用简单易上手,非常适合单机应用使用。
C++内存分区模型分析与实例以及扩展 C++程序在执行时,将内存大方向划分为**5个区域** - 代码区:存放**函数体的二进制代码**,由操作系统进行管理的 - 全局区(静态区):存放**全局变量和静态变量以及常量** - 常量区:**常量**存储在这里,不允许修改 - 栈区:由编译器自动分配释放, 存放**函数的参数值**,**局部变量等** - 堆区:**由程序员分配和释放**,若程序员不释放,程序结束时由操作系统回收