一、前言
前面阐述了服务器的总体框架,下面来分析服务器的所有父类ZooKeeperServer。
二、ZooKeeperServer源码分析
2.1 类的继承关系
public class ZooKeeperServer implements SessionExpirer, ServerStats.Provider {}
说明:ZooKeeperServer是ZooKeeper中所有服务器的父类,其实现了Session.Expirer和ServerStats.Provider接口,SessionExpirer中定义了expire方法(表示会话过期)和getServerId方法(表示获取服务器ID),而Provider则主要定义了获取服务器某些数据的方法。
2.2 类的内部类
1. DataTreeBuilder类
public interface DataTreeBuilder { // 构建DataTree public DataTree build(); }
说明:其定义了构建树DataTree的接口。
2. BasicDataTreeBuilder类
static public class BasicDataTreeBuilder implements DataTreeBuilder { public DataTree build() { return new DataTree(); } }
说明:实现DataTreeBuilder接口,返回新创建的树DataTree。
3. MissingSessionException类
public static class MissingSessionException extends IOException { private static final long serialVersionUID = 7467414635467261007L; public MissingSessionException(String msg) { super(msg); } }
说明:表示会话缺失异常。
4. ChangeRecord类
static class ChangeRecord { ChangeRecord(long zxid, String path, StatPersisted stat, int childCount, List<ACL> acl) { // 属性赋值 this.zxid = zxid; this.path = path; this.stat = stat; this.childCount = childCount; this.acl = acl; } // zxid long zxid; // 路径 String path; // 统计数据 StatPersisted stat; /* Make sure to create a new object when changing */ // 子节点个数 int childCount; // ACL列表 List<ACL> acl; /* Make sure to create a new object when changing */ @SuppressWarnings("unchecked") // 拷贝 ChangeRecord duplicate(long zxid) { StatPersisted stat = new StatPersisted(); if (this.stat != null) { DataTree.copyStatPersisted(this.stat, stat); } return new ChangeRecord(zxid, path, stat, childCount, acl == null ? new ArrayList<ACL>() : new ArrayList(acl)); } }
说明:ChangeRecord数据结构是用于方便PrepRequestProcessor和FinalRequestProcessor之间进行信息共享,其包含了一个拷贝方法duplicate,用于返回属性相同的ChangeRecord实例。
2.3 类的属性
public class ZooKeeperServer implements SessionExpirer, ServerStats.Provider { // 日志器 protected static final Logger LOG; static { // 初始化日志器 LOG = LoggerFactory.getLogger(ZooKeeperServer.class); Environment.logEnv("Server environment:", LOG); } // JMX服务 protected ZooKeeperServerBean jmxServerBean; protected DataTreeBean jmxDataTreeBean; // 默认心跳频率 public static final int DEFAULT_TICK_TIME = 3000; protected int tickTime = DEFAULT_TICK_TIME; /** value of -1 indicates unset, use default */ // 最小会话过期时间 protected int minSessionTimeout = -1; /** value of -1 indicates unset, use default */ // 最大会话过期时间 protected int maxSessionTimeout = -1; // 会话跟踪器 protected SessionTracker sessionTracker; // 事务日志快照 private FileTxnSnapLog txnLogFactory = null; // Zookeeper内存数据库 private ZKDatabase zkDb; // protected long hzxid = 0; // 异常 public final static Exception ok = new Exception("No prob"); // 请求处理器 protected RequestProcessor firstProcessor; // 运行标志 protected volatile boolean running; /** * This is the secret that we use to generate passwords, for the moment it * is more of a sanity check. */ // 生成密码的密钥 static final private long superSecret = 0XB3415C00L; // int requestsInProcess; // 未处理的ChangeRecord final List<ChangeRecord> outstandingChanges = new ArrayList<ChangeRecord>(); // this data structure must be accessed under the outstandingChanges lock // 记录path对应的ChangeRecord final HashMap<String, ChangeRecord> outstandingChangesForPath = new HashMap<String, ChangeRecord>(); // 连接工厂 private ServerCnxnFactory serverCnxnFactory; // 服务器统计数据 private final ServerStats serverStats; }