源码

zookeeper源码分析之FileTxnSnapLog

雨燕双飞 提交于 2020-01-21 05:09:22
目录 一、SnapShot 二、FileSnap 三、TxnLog 四、FileTxnLog 五、FileTxnIterator 六、FileTxnSnapLog zookeeper维护的数据有树形结构的DataTree,它的每一个节点是DataNode。另一个是TxnLog事务日志,它包括 事务头TxnHeader和事务数据Record。它们存在zookeeper服务器的内存中,zookeeper也会将它们序列化至文件中。FileSnap文件快照保证内存中的DataTree和session与数据文件的一致性。FileTxnLog则是保证内存中事务数据Record与实务文件的一致性。 一、SnapShot SnapShot接口为持久层提供,实现此接口,提供DataTree和session持久化功能。 public interface SnapShot { // 反序列化至DataTree和sessions,返回被序列化的最后一个zxid long deserialize(DataTree dt, Map<Long, Integer> sessions) throws IOException; // 序列化DataTree和sessions至文件名为name中 void serialize(DataTree dt, Map<Long, Integer> sessions, File

weston与gdm编译

萝らか妹 提交于 2020-01-21 05:03:30
目录 引言 1 weston源码编译 1 .1 配置weston编译的环境变量 1.2 安装libwayland 1.3 安装wayland-protocols 1.4 安装libinput 1.5 安装X Server 1.6 安装weston 2 gdm3源码编译 2.1 下载源码及依赖 2.2 编译 总结 引言 由于在开发调试桌面系统时候,会遇到一些问题。如:通过gstreamer管道搭建的视频播放能够直接在weston桌面上显示,而weston的demo也能够同时跑在weston桌面上,那么gstreamer的管道是否作为一个client来对接weston呢?还有如:嵌入式板卡搭建起ubuntu-desktop桌面环境后,启动到gdm界面很慢,该问题也需要分析。该篇博客主要讲解weston及gdm的源码编译,只有编译了源码才能随心所欲的打log 1 weston 源码编译 1 .1 配置 weston编译的环境变量 1)创建install文件 mkdir ~/install 2)设置环境变量 # setup environment for local install: export WLD=$HOME/install export LD_LIBRARY_PATH=$WLD/lib export PKG_CONFIG_PATH=$WLD/lib/pkgconfig/:$WLD

Redis源码剖析和注释(二十)--- 网络连接库剖析(client的创建/释放、命令接收/回复、Redis通信协议分析等)

流过昼夜 提交于 2020-01-21 04:16:00
Redis 网络连接库剖析 Redis网络连接库介绍 Redis网络连接库对应的文件是networking.c。这个文件主要负责 客户端的创建与释放 命令接收与命令回复 Redis通信协议分析 CLIENT 命令的实现 我们接下来就这几块内容分别列出源码,进行剖析。 客户端的创建与释放 redis 网络链接库的源码详细注释 2.1客户端的创建 Redis 服务器是一个同时与多个客户端建立连接的程序。当客户端连接上服务器时,服务器会建立一个server.h/client结构来保存客户端的状态信息。所以在客户端创建时,就会初始化这样一个结构,客户端的创建源码如下: client * createClient ( int fd ) { client * c = zmalloc ( sizeof ( client ) ) ; //分配空间 // 如果fd为-1,表示创建的是一个无网络连接的伪客户端,用于执行lua脚本的时候。 // 如果fd不等于-1,表示创建一个有网络连接的客户端 if ( fd != - 1 ) { // 设置fd为非阻塞模式 anetNonBlock ( NULL , fd ) ; // 禁止使用 Nagle 算法,client向内核递交的每个数据包都会立即发送给server出去,TCP_NODELAY anetEnableTcpNoDelay ( NULL , fd

Dubbo 2.7.5在线程模型上的优化

ぃ、小莉子 提交于 2020-01-21 04:05:09
这是why技术的第30篇原创文章 这可能是全网第一篇解析Dubbo 2.7.5里程碑版本中的改进点之一:客户端线程模型优化的文章。 先劝退:文本共计8190字,54张图。阅读之前需要对Dubbo相关知识点有一定的基础。内容比较硬核,劝君谨慎阅读。 读不下去不要紧,我写的真的很辛苦的,帮忙拉到最后点个赞吧。 本文目录 第一节:官方发布 本小节主要是通过官方发布的一篇名为《Dubbo 发布里程碑版本,性能提升30%》的文章作为引子,引出本文所要分享的内容:客户端线程模型优化。 第二节:官网上的介绍 在介绍优化后的消费端线程模型之前,先简单的介绍一下Dubbo的线程模型是什么。同时发现官方文档对于该部分的介绍十分简略,所以结合代码对其进行补充说明。 第三节:2.7.5版本之前的线程模型的问题 通过一个issue串联本小节,道出并分析一些消费端应用,当面临需要消费大量服务且并发数比较大的大流量场景时(典型如网关类场景),经常会出现消费端线程数分配过多的问题。 第四节:thredless是什么 通过第三节引出了新版本的解决方案,thredless。并对其进行一个简单的介绍。 第五节:场景复现 由于条件有限,场景复现起来比较麻烦,但是我在issues#890中发现了一个很好的终结,所以我搬过来了。 第六节:新旧线程模型对比 本小节通过对比新老线程模型的调用流程,并对比2.7.4.1版本和2.7

Spring源码 - FactoryBean 应用拓展(附源码解析)

自古美人都是妖i 提交于 2020-01-21 03:58:32
前言 在学习Spring Core中IOC容器时,你肯定会接触到BeanFactory这个Spring中最基础的IOC容器。这个应该是大家学习Spring源码时最先接触到的类了。Spring中还存在这一个FactoryBean类,两者拼写上十分相似,并且使用频率都十分得高。在一些Spring面试题,也会问你这两者有什么区别。 这里先说结论: BeanFactory:Spring中的IoC容器,所有Spring Bean 的Factory FactoryBean:一个Bean,一个不简单的Bean,一个能产生对象或者修饰对象生成的工厂Bean,它的实现与设计模式中的工厂模式和修饰器模式类似 在学习Spring源码和其他开源项目的源码的过程当中,发现FactoryBean是一些框架在做集成Spring时经常会使用到的类,本文具体讲述的也是FactoryBean的简单实用和具体应用拓展。 What is FactoryBean Spring 中有两种类型的Bean,一种是普通Bean,另一种是工厂Bean 即 FactoryBean。 一般情况下,Spring 通过反射机制利用bean的class属性指定实现类来实例化bean 。在某些情况下,实例化bean 过程比较复杂,如果按照传统的方式,则需要在 <bean> 中提供大量的配置信息,配置方式的灵活性是受限的,

hbase--walgroup源码分析

白昼怎懂夜的黑 提交于 2020-01-21 03:21:02
本文介绍hbase的walgroup原理及实现 开启多wal 默认情况下,一个regionserver只有一个wal文件。 在HBase-5699之后,可以配置多个wal,在hbase-site.xml中,添加以下配置,既可开启多wal(同一个RS服务中): <property> <name>hbase.wal.provider</name> <value>multiwal</value> </property> 具体有几个walgroup,实际是通过 org.apache.hadoop.hbase.wal.BoundedGroupingStrategy#NUM_REGION_GROUPS 的配置值来决定的,默认是 org.apache.hadoop.hbase.wal.BoundedGroupingStrategy#DEFAULT_NUM_REGION_GROUPS=2 。 walgroup的格式为: providerId.regiongroup-0;providerId.regiongroup-1 写入性能较单WAL提升20% hbase.wal.regiongrouping.strategy = bounded(分组策略) hbase.wal.regiongrouping.numgroups = 2(组数量,可以根据盘数设置,默认是2) 这里有两个概念,一个是walgroup

Mycat的sql解析源码剖析

半腔热情 提交于 2020-01-21 01:32:22
 Mycat 的 SQL 解析分为浅解析和深解析两部分,下面就分别讲解这两部分。 本文分析的 Mycat 版本号是 1.6.7.4-test-20191226161308 ,具体的版本号信息详见源码的 io.mycat.config. Versions #SERVER_VERSION 属性。 一、浅解析  不同类型的 sql 语句需要不同的逻辑处理,而浅解析则是用于判定出 sql 语句所属的类型,比如 INSERT 类型、DELETE 类型、UPDATE 类型、SELECT 类型。在当前版本中 Mycat 就将所有 sql 归纳为下述共计 29 种类型。 package io . mycat . server . parser ; public final class ServerParse { public static final int OTHER = - 1 ; public static final int BEGIN = 1 ; public static final int COMMIT = 2 ; public static final int DELETE = 3 ; public static final int INSERT = 4 ; public static final int REPLACE = 5 ; public static final int

spring源码学习笔记之BeanDefinition接口

喜夏-厌秋 提交于 2020-01-21 00:32:38
package org.springframework.beans.factory.config; import org.springframework.beans.BeanMetadataElement; import org.springframework.beans.MutablePropertyValues; import org.springframework.core.AttributeAccessor; import org.springframework.lang.Nullable; /** * A BeanDefinition describes a bean instance, which has property values, * constructor argument values, and further information supplied by * concrete implementations. * 一个 BeanDefinition 描述了一个bean实例的属性值,构造参数值,它的具体实现还会描述更多的信息。 可以理解为: BeanDefinition主要是用于描述bean实例信息) * <p>This is just a minimal interface: The main intention is to allow a * {

HashMap源码分析(一)

社会主义新天地 提交于 2020-01-20 23:26:03
基于JDK1.7 HashMap源码分析 概述 HashMap是存放键值对的集合,数据结构如下: table被称为桶,大小(capacity)始终为2的幂,当发生扩容时,map容量扩大为两倍 HashMap采用拉链法解决Hash冲突,发生冲突时,新元素采用头插法插入到对应桶的链表中 HashMap有几个重要字段: size:HashMap键值对的数量 capacity:桶数量,即table.length,默认16 loadFactor:负载因子,度量负载程度,基于时间和空间的权衡,默认0.75 threshold:阈值,当 size>=threshold 将发生扩容, threshold=capacity * loadFactor 。 JDK1.7 源码分析 属性 /** * 默认初始容量 (必须是2的幂) */ static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 /** * 最大容量 */ static final int MAXIMUM_CAPACITY = 1 << 30; /** * 默认负载因子 */ static final float DEFAULT_LOAD_FACTOR = 0.75f; /** * 空表 */ static final Entry<?,?>[] EMPTY_TABLE = {

你为什么要看源码?如何看源码?

喜欢而已 提交于 2020-01-20 22:39:02
前言 本文主要内容摘自加多大神的《Java并发编程之美》的前言内容,讲了为什么要看源码和如何看源码,讲的很精炼。这部分是属于源码学习方面的方法论,所以单独摘录下来并且总结。 为什么要看源码? 我们在做项目的时候一般会遇到下面的问题: 不知道如何去设计。比如刚入职场时,来一个需求需做概要设计,不知如何下手,不得不去看当前系统类似需求是如何设计的,然后仿照去设计。 设计的时候,考虑问题不周全。相比职场新手,这类人对一个需求依靠自己的经验已经能够拿出一个概要设计,但是设计中经常会遗漏一些异常细节,比如使用多线程有界队列执行任务,遇到机器宕机了,如果队列里面的任务不存盘的话,那么机器下次启动的时候这些任务就丢失了。 对于这些问题,说到底主要还是因为 经验不够,而经验主要从项目实践中积累 ,所以招聘单位一般都会限定工作时间大于3年,因为这些人的项目经验相对较丰富,在项目中遇到的场景相对较多。工作经验的积累来自于年限与实践,然而 看源码可以扩展我们的思路,这是变相增加我们经验的不错方法。虽然不能在短时间内通过时间积累经验,但是可以通过学习开源框架、开源项目来获取经验 。 另外,进职场后一般都要先熟悉现有系统,如果有文档还好,没文档的话就得自己去翻代码研究。如果之前对阅读源码有经验,那么在研究新系统的代码逻辑时就不会那么费劲了。 还有一点就是, 当你使用框架或者工具做开发时