栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

zookeeper源码解析(五)

zookeeper源码解析(五)

2021SC@SDUSC

IWatchManager

zookeeper的watch管理器接口

    //将watcher加入指定路径,返回布尔值,若为真,则说明原本对应该路径不存在watcher
    boolean addWatch(String path, Watcher watcher);

    
    //将watcher加入指定路径,返回布尔值,若为真,则说明原本对应该路径不存在watcher
    //并且设置了watcher模式
    default boolean addWatch(String path, Watcher watcher, WatcherMode watcherMode) {
        if (watcherMode == WatcherMode.DEFAULT_WATCHER_MODE) {
            return addWatch(path, watcher);
        }
        throw new UnsupportedOperationException(); 
    }

    
    //检查指定的路径是否存在指定的watcher
    boolean containsWatcher(String path, Watcher watcher);

    
    //移除指定的路径的指定的watcher
    boolean removeWatcher(String path, Watcher watcher);

    
    //移除watcher
    void removeWatcher(Watcher watcher);

    
    //给指定路径分配watch event,返回已经被通知的所有watcher
    WatcherOrBitSet triggerWatch(String path, EventType type);

    
    //给指定路径分配watch event,返回已经被通知的所有watcher,但忽略被压制的一系列watcher
    //返回已经被通知的所有watcher
    WatcherOrBitSet triggerWatch(String path, EventType type, WatcherOrBitSet suppress);

   
    //获取watcher数量
    int size();

    
    //清空watch管理器
    void shutdown();

    
    //返回watch信息的概要
    WatchesSummary getWatchesSummary();

   
    //返回watch报告
    WatchesReport getWatches();

    
    //返回watcher路径报告
    WatchesPathReport getWatchesByPath();

    
    //watches,warning的字符串表示,byPath是true则根据path输出,false则根据连接输出
    void dumpWatches(PrintWriter pwriter, boolean byPath);

    
    //返回递归watchers的当前数量
    default int getRecursiveWatchQty() {
        return 0;
    }
WatchManager

IWatchManager的一种实现

成员变量:

    //日志
    private static final Logger LOG = LoggerFactory.getLogger(WatchManager.class);
    //路径到对应watcher的哈希表
    private final Map> watchTable = new HashMap<>();
    //watcher到对应的一系列路径的哈希表
    private final Map> watch2Paths = new HashMap<>();
    //watcher模式管理器
    private final WatcherModeManager watcherModeManager = new WatcherModeManager();

size方法

    public synchronized int size() {
        int result = 0;
        for (Set watches : watchTable.values()) {
            result += watches.size();
        }
        return result;
    }

size方法有synchronized关键字,保证了多线程环境下的安全性

addWatch方法

主要是遍历watchTable的值集合,将每个路径对应的watch的数目都加起来得到size

    //addWatch只有两个参数,则默认watcher模式是DEFAULT_WATCHER_MODE
    public boolean addWatch(String path, Watcher watcher) {
        return addWatch(path, watcher, WatcherMode.DEFAULT_WATCHER_MODE);
    }


    public synchronized boolean addWatch(String path, Watcher watcher, WatcherMode watcherMode) {
        if (isDeadWatcher(watcher)) {
            LOG.debug("Ignoring addWatch with closed cnxn");
            return false;
        }

        //根据路径获取对应的一系列watcher
        Set list = watchTable.get(path);
        if (list == null) {
            //如果list为null,那就new一个哈希集合
            //选择4是一种折衷,如果一开始就设置过大,可能浪费了内存
            //如果满了,再双倍扩大空间
            list = new HashSet<>(4);
            watchTable.put(path, list);
        }
        list.add(watcher);
        
        //通过watcher获取对应的路径
        Set paths = watch2Paths.get(watcher);
        if (paths == null) {
            paths = new HashSet<>();
            watch2Paths.put(watcher, paths);
        }
        //指定watcher,指定路径,设置watcher模式
        watcherModeManager.setWatcherMode(watcher, path, watcherMode);

        return paths.add(path);
    }

addWatch主要更新watchTable和watch2Paths两个成员变量,更新映射关系。还有就是也更新了watcherModeManager。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/389335.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号