Graphviz 块前后有大量空白

image.png

image.png

代码:

digraph log_flow { rankdir=TB; node [shape=rectangle, style="rounded", fontname="Microsoft YaHei"]; edge [fontname="Microsoft YaHei"]; // 日志文件结构 subgraph cluster_structure { label="日志文件结构"; labelloc=t; node [shape=box] XChecksum [label="四字节全局校验和\n(XChecksum)", width=2.5]; Log1 [label="日志1\n[4字节长度][4字节校验和][数据]", width=3]; Log2 [label="日志2\n[4字节长度][4字节校验和][数据]", width=3]; LogN [label="...\n日志N", width=1.5]; BadTail [label="残缺尾部\n(可能不存在)", style=dashed]; XChecksum -> Log1 -> Log2 -> LogN -> BadTail [style=invis]; } // 读取流程 subgraph cluster_read { label="读取日志流程 (internNext)"; labelloc=b; node [shape=ellipse] Start读 [label="读取位置定位到\n当前position"]; 读Size [label="读取4字节\n日志长度(size)"]; 检查空间 [label="position + 长度 + 8字节\n是否超过文件大小?", shape=diamond]; ReturnNull1 [label="返回空"]; 读完整日志 [label="读取校验和+数据\n(8字节+size长度)"]; 计算校验和 [label="用数据部分\n重新计算校验和"]; 比对校验和 [label="计算值\n是否等于\n存储值?", shape=diamond]; ReturnNull2 [label="返回空"]; 移动指针 [label="position += 日志总长度"]; 返回数据 [label="返回数据部分"]; Start读 -> 读Size -> 检查空间; 检查空间 -> ReturnNull1 [label="是"]; 检查空间 -> 读完整日志 [label="否"]; 读完整日志 -> 计算校验和 -> 比对校验和; 比对校验和 -> ReturnNull2 [label="不一致"]; 比对校验和 -> 移动指针 [label="一致"]; 移动指针 -> 返回数据; } // 校验和修复流程 subgraph cluster_recovery { label="启动时校验文件完整性"; node [shape=ellipse] Start校验 [label="初始化xCheck=0"]; 循环读取 [label="调用internNext()\n读取下一条日志"]; 是否空日志 [label="日志为空?", shape=diamond]; 更新全局校验和 [label="xCheck = calChecksum\n(xCheck, log)"]; 最终校验 [label="xCheck 是否等于\n文件头的XChecksum?", shape=diamond]; Panic [label="抛出异常"]; 截断文件 [label="截断文件到\n最后有效position"]; 重置指针 [label="文件指针归零"]; Start校验 -> 循环读取; 循环读取 -> 是否空日志; 是否空日志 -> 更新全局校验和 [label="否"]; 更新全局校验和 -> 循环读取; 是否空日志 -> 最终校验 [label="是"]; 最终校验 -> Panic [label="校验失败"]; 最终校验 -> 截断文件 [label="校验成功"]; 截断文件 -> 重置指针; } // 写入流程 subgraph cluster_write { label="写入日志流程"; node [shape=ellipse] Start写 [label="准备待写入数据"]; 包装日志 [label="添加长度头\n计算校验和\n拼接日志段"]; 追加写入 [label="定位到文件末尾\n写入日志内容"]; 内存更新校验 [label="更新内存中的\n全局校验和(xChecksum)"]; 写回文件头 [label="将新校验和\n写回文件开头"]; 强制刷盘 [label="强制同步到磁盘"]; Start写 -> 包装日志 -> 追加写入 -> 内存更新校验 -> 写回文件头 -> 强制刷盘; } // 跨子图连接关系 edge [style=dotted, dir=none]; 循环读取 -> internNext [label="调用", fontsize=8]; 内存更新校验 -> updateXChecksum [label="调用", fontsize=8]; }
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    26177 引用 • 108730 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    10058 引用 • 45707 回帖 • 68 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    16 引用 • 236 回帖 • 242 关注
  • 七牛云

    七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化 PaaS 服务。围绕富媒体场景,七牛先后推出了对象存储,融合 CDN 加速,数据通用处理,内容反垃圾服务,以及直播云服务等。

    29 引用 • 230 回帖 • 124 关注
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 70 关注
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    56 引用 • 85 回帖
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 642 关注
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    15 引用 • 7 回帖 • 1 关注
  • 自由行
    2 关注
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 671 关注
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    240 引用 • 224 回帖
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    59 引用 • 22 回帖 • 9 关注
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 61 关注
  • uTools

    uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。

    7 引用 • 28 回帖 • 1 关注
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    98 引用 • 367 回帖
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    268 引用 • 666 回帖
  • Logseq

    Logseq 是一个隐私优先、开源的知识库工具。

    Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.

    7 引用 • 69 回帖 • 7 关注
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 523 关注
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    345 引用 • 755 回帖
  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    21 引用 • 31 回帖
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 34 关注
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    188 引用 • 319 回帖 • 240 关注
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3455 回帖 • 150 关注
  • AWS
    11 引用 • 28 回帖 • 8 关注
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    291 引用 • 4495 回帖 • 662 关注
  • 负能量

    上帝为你关上了一扇门,然后就去睡觉了....努力不一定能成功,但不努力一定很轻松 (° ー °〃)

    89 引用 • 1251 回帖 • 392 关注
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 368 关注
  • 代码片段

    代码片段分为 CSS 与 JS 两种代码,添加在 [设置 - 外观 - 代码片段] 中,这些代码会在思源笔记加载时自动执行,用于改善笔记的样式或功能。

    用户在该标签下分享代码片段时需在帖子标题前添加 [css] [js] 用于区分代码片段类型。

    194 引用 • 1387 回帖