首页 > 编程语言 >StoneDB 源码解读系列|Tianmu 引擎工具类模块源码详解(一)

StoneDB 源码解读系列|Tianmu 引擎工具类模块源码详解(一)

时间:2023-08-21 10:55:55浏览次数:32  
标签:Tianmu 源码 线程 StoneDB 堆栈 日志

图片

StoneDB 源码解读系列文章正式开启,预计以周更的形式跟大家见面,请多多支持~

本篇源码解读内容已进行直播分享,可在视频号观看直播回放,也可点击阅读原文跳转至 B 站观看回放视频。

PPT内容可在社区论坛中查看下载:https://forum.stonedb.io/t/topic/89

图片

各个工具类属于 Tianmu 引擎的核心组件,这些组件可以说是 Tianmu 的基石,由于工具类的范围广,在源码解读系列中会挑选主要的一些跟大家做分享,包括:日志系统、异常处理、堆栈跟踪、线程池、内存管理、数据压缩/解压缩等。本篇内容主要分享前面四点。

图片

源码结构

众所周知大型项目会有巨量的代码,为了方便管理和维护,一般开发人员会根据功能模块对源代码划分为不同的目录,所以在分析大型项目时首先要知道项目中每个目录的作用是干什么的,然后再根据自己的需求去对应的目录解读对应的代码。

1. StoneDB 源码目录结构

image.png

2. Tianmu 引擎的源码目录结构

图片

图片

Tianmu 引擎的日志系统

Tianmu 引擎的日志类型分为了三类,系统日志、调试日志、和查询引擎执行的结果日志。其中系统的异常信息、异常情况的堆栈信息 和一些计时信息都记录在系统日志里面。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。

下图为 Tianmu 引擎的日志系统结构关系图:

图片

1. 日志系统

系统日志把日志分为了以下 7 个级别 :

图片

使用枚举类型表示各个级别

enumLogCtl_Level {     DISABLED = 0, FATAL = 1, ERROR = 2, WARN = 3, INFO = 4, DEBUG = 5, TRACE = 6 };

并支持将MySQL日志级别映射到Tianmu日志级别,可以通过 设置参数 tianmu_global_debug_level 来控制日志的输出级别:

图片

日志的级别越高输出的信息就越多,当然详细的日志信息会影响系统的运行性能,需要视情况而定。

Tianmu 的系统日志会统一落地到 MySQL 安装目录下/log/tianmu.log文件

日志系统核心类:

class utils:: LogCtl

2. 调试日志

调试日志落地到mysql安装目录下/log/trace.log文件。

由 tianmu_control_trace 该配置项控制,为1打开记录日志的开关,为0则关闭

调用接口对象:

system::Channel rccontrol

3. 查询引擎执行的结果日志

查询引擎执行的结果日志落地到 StoneDB 安装目录下/log/ query.log文件。

由 tianmu_ini_controlquerylog 该配置项控制,为1打开记录日志的开关,为0则关闭

调用接口对象:

system::Channel rcquerylog

image.png
堆栈跟踪

保存堆栈的相关信息(堆栈的函数调用和堆栈的符号信息等),方便后续调试和问题排查,目前 Tianmu 系统基于异常处理模块加上了堆栈信息的记录,如果有异常情况出现,就会把现场的堆栈信息记录下来。堆栈的调用信息会以 WARN 级别的日志信息记录在 Tianmu 的系统日志里面,日志所在的目录:StoneDB 安装目录下/log/tianmu.log文件中。

其中为了获得堆栈信息,Tianmu 这里使用了 glibc中提供的backtrace()和backtrace_symbols() 两个函数来输出和解析程序的 call stack,并使用 g++ 中的 abi::__cxa_demangle 来 demangle(将C++ ABI标识符(C++ ABI identifier)转换成C++源程序标识符(original C++ source identifier)的过程称为demangle。更简单的说,识别C++编译以后的函数名的过程,就叫demangle。)

调用函数接口:

GetStackTrace();

图片

异常处理

Tianmu支持的异常处理类型如下图:

图片

异常处理的流程图如下:

图片

出现异常后Tianmu 系统会把异常信息,和出现异常逻辑的堆栈调用信息以WARN级别的日志信息记录在Tianmu的系统日志里面,日志所在的目录:StoneDB安装目录下/log/tianmu.log文件中。

异常处理模块核心基类:

class common:: Exception

图片

线程池

Tianmu 的线程是基于 C++ 新特性实现的

线程池核心类:

class utils::thread_pool

其具有以下优点:

  • Tianmu 的线程池的实现是基于 C++11 标准的线程库:std::thread。可进行跨平台编译而无需修改代码。

  • 使用 std::condition_variable 和 std::mutex  进行线程的阻塞控制和唤醒,避免线程无效的循环和等待,提高程序效率。

  • 对添加线程的入口使用了函数模板与可变长参数模板,使之可添加任意的处理流程进入到线程池中。

  • 其中 Tianmu 引擎支持利用 std:

    标签:Tianmu,源码,线程,StoneDB,堆栈,日志
    From: https://www.cnblogs.com/stonedb/p/17645432.html

相关文章

  • 手机直播源码开发,协议讨论篇(三):RTMP实时消息传输协议
    一、实时消息传输协议RTMP简介RTMP又称实时消息传输协议,是一种实时通信协议。在当今数字化时代,手机直播源码平台为全球用户进行服务,如何才能增加用户,提升用户黏性?就需要让一对一直播平台能够为用户提供优质的体验。而RTMP协议的部署就能为手机直播源码平台提供出低延迟、高质量的......
  • [完结25章]Java七大热门技术框架源码解析
    点击下载:[完结25章]Java七大热门技术框架源码解析提取码:ygnz《Java七大热门技术框架源码解析》已完结25章,任何框架都是有助于更快更好地开发软件解决方案的工具之一。框架的基本原理不必重新发明轮子。框架使开发人员的工作变得更轻松,并帮助他们专注于业务逻辑,而不必担心通用的......
  • x86_64/aarch64架构下ffpyplayer源码编译
    问题来源:某鱼上挂着pytorch的aarch64架构下的源码编译,遇到某网友提出的要在aarch64架构下的ubuntu上ffpyplayer源码编译,于是有了本文。  =================================================   1.下载源码ffpyplayer源码下载地址:https://github.com/matham/ffpypla......
  • ffpyplayer源码编译报错:ffpyplayer/tools.pyx:182:28: Cannot assign type 'void (*)(
    编译ffpyplayer报错,具体错误如标题。  报错信息:ffpyplayer/tools.pyx:182:28:Cannotassigntype'void(*)(void*,int,constchar*,va_list)except*nogil'to'void(*)(void*,int,constchar*,va_list)noexceptnogil'  解决方法:pipinstallblos......
  • 完美运营版 Thinkphp内核盲盒商城2.0+前端源码
    源码介绍:Thinkphp盲盒商城源码V2.0,最新版本全解,对接的易支付。短信是阿里云的,存储是七牛云(都要提前注册,这个要审核一两天)。简单测试了一下,还是有一些问题的,不知道是不是打开的方式不对,技术有限,有能力的大神拿去研究研究。  免费下载链接  提取码:izk2......
  • java语言B/S医院HIS系统源码【springboot】
     医院云HIS全称为基于云计算的医疗卫生信息系统(Cloud-BasedHealthcareInformationSystem),是运用云计算、大数据、物联网等新兴信息技术,按照现代医疗卫生管理要求,在一定区域范围内以数字化形式提供医疗卫生行业数据收集、存储、传递、处理的业务和技术平台,实现区域内医疗卫......
  • 房产中介管理系统的设计与实现-计算机毕业设计源码+LW文档
    摘要随着计算机技术的不断发展,有效地促进了社会各行业的进步,信息化逐渐运用到人们的生活中。传统模式的房产中介管理满足不了现代人的生活追求、服务质量和服务速度。使用管理系统进行管理,成本大大减小,同时可借助互联网强大的流量入口,使得推广的难度也大大降低。因此设计一个管理......
  • 校园闲置物品交易系统-计算机毕业设计源码+LW文档
    一、选题背景及意义信息技术的发展给世界各国带来了巨大的变化,特别是Internet的出现,使得人们之间的交流更加顺畅,无论身在何处,只需要通过网络的连接就可以实现沟通。计算机、手机等各种设备的普及,计算机信息技术逐渐走向多元化,无论是经济、军事、服务行业都可以通过管理系统来提高......
  • 基于Java的校园打字练习系统的设计与实现-计算机毕业设计源码+LW文档
    一、研究目的和意义研究目的:随着互联网的进一步发展,打字这项技能几乎成为所以大学生的必备技能。校园打字系统已经成为大学生练习打字的重要帮手,它可以将古代和现代诗歌、网红文章、中外著名名著全部存储在里面,便于使用者自行选择文本进行练习打字;随着电脑的普及,各行各业都会有使......
  • 从JDK源码级别彻底剖析JVM类加载机制
    类加载运行全过程当我们用java命令运行某个类的main函数启动程序时,首先需要通过类加载器把主类加载到JVM。publicclassMath{publicstaticfinalintinitData=666;publicstaticUseruser=newUser();publicintcompute(){//一个方法对应一块栈帧......