Alluxio源码分析定位策略:最大可用容量优先策略MostAvailableFirstPolicy
最大可用容量优先策略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个区域** - 代码区:存放**函数体的二进制代码**,由操作系统进行管理的 - 全局区(静态区):存放**全局变量和静态变量以及常量** - 常量区:**常量**存储在这里,不允许修改 - 栈区:由编译器自动分配释放, 存放**函数的参数值**,**局部变量等** - 堆区:**由程序员分配和释放**,若程序员不释放,程序结束时由操作系统回收
相关文章
- div定位relative和absolute测试1
- 基于halcon实现视觉定位框架(C#做主算法,C#、MFC、Qt二次开发)【附源码】
- 基于python+pyqt+halcon实现视觉定位(halcon12.0)【附部分源码】
- 32位汇编第五讲,逆向实战干货,(OD)快速定位扫雷内存.
- WEB自动化测试之元素定位自动生成探索实践
- 购物中心定位分析、调整方案及租金建议
- 《新媒体营销精华:精准定位+爆款打造+匠心运营+内容变现》笔者的新书,欢迎各位粉丝上京东购买
- 自制简单表单验证relative与absolute定位
- selenium定位方式源码的存放位置
- 新增文章出现bug怎么定位是前端问题还是后端问题
- 6 款 Java 8 自带工具,轻松分析定位 JVM 问题!
- 【短视频运营】账号定位 ( 擅长方向 | 利他性 | 变项方向 | 赛道现状 | 账号成本 | 账号领域垂直 )
- 定位vc运行时库问题 依赖问题,屡试不爽的一招
- CSS3 positon定位详解(通俗易懂)
- notepad++ 插件推荐——快速定位文件
- Alluxio源码分析定位策略:循环遍历策略RoundRobinPolicy