CMU_15445_P4_Part1

news/2025/2/25 18:25:33/文章来源:https://www.cnblogs.com/wevolf/p/18736965

CMU_15445_Project4_Task1-2

到这部分, BUSTUB 数据库引擎的整体面容开始显现出来了, 在文件 src/include/common/bustub_instance.h 中, 当我们想要实例化一个 BUSTUB 对象的时候, 可以看到它的组成部分有:

  // Currently the followings are directly referenced by recovery test, so// we cannot do anything on them until someone decides to refactor the recovery test.// 磁盘管理器std::unique_ptr<DiskManager> disk_manager_;// BPM, 管理缓冲区std::unique_ptr<BufferPoolManager> buffer_pool_manager_;// 锁管理器std::unique_ptr<LockManager> lock_manager_;// 事务管理器, 这是我们 Project4 需要完成的部分std::unique_ptr<TransactionManager> txn_manager_;// 日志管理工具std::unique_ptr<LogManager> log_manager_;// 事务管理中创建 checkpointsstd::unique_ptr<CheckpointManager> checkpoint_manager_;// 数据库表存储的画布std::unique_ptr<Catalog> catalog_;// 数据库执行引擎, 也就是我们的 Executorstd::unique_ptr<ExecutionEngine> execution_engine_;/** Coordination for catalog */std::shared_mutex catalog_lock_;

这些可以看作是构成一个数据库的核心部分.

Watermark

Watermark is the lowest read timestamp among all in-progress transactions.

TransactionManager 中可以通过下面的 version_info_PageVersionInfo 获取某个 RID 对应的 Tuple 的当前最新版本的 VersionUndoLink.

struct PageVersionInfo {/** protects the map */std::shared_mutex mutex_;/** Stores previous version info for all slots. Note: DO NOT use `[x]` to access it because* it will create new elements even if it does not exist. Use `find` instead. 使用 version_info_ 中的 page_id_t 与* slot_offset_t 可以得到一个 Tuple 的 RID, 用于访问某个 Tuple 的版本链*/std::unordered_map<slot_offset_t, VersionUndoLink> prev_version_;
};/** protects version info */
std::shared_mutex version_info_mutex_;
/** Stores the previous version of each tuple in the table heap. Do not directly access this field. Use the helper* functions in `transaction_manager_impl.cpp`. */
std::unordered_map<page_id_t, std::shared_ptr<PageVersionInfo>> version_info_;

可以从这个 VersionUndoLink 中获取这个 Tuple 的 UndoLink.
UndoLink 和 UndoLog 是如何形成版本链的: 可以从 UndoLink 中获取前一个版本的事务的 ID(prev_txn_). 然后在 txn_map_ 事务 Map 中找到这个事务 ID 对应的事务 pre_txn, 在 UndoLink 中使用 prev_log_idx_ 记录前一个版本的 UndoLog 在事务中的下标, 因此使用 ``pre_txn->GetUndoLog(UndoLink.prev_log_idx_);可以得到前一个事务的UndoLog. 而在这个 UndoLog中又记录着更前一个事务的UndoLink. 这种方式形成了 Tuple 的版本链, 并且从 TransactionManager` 开始就可以找到这条链.

关于 UndoLog 的一些问题

UndoLog 结构体的信息如下所示:

struct UndoLog {/* Whether this log is a deletion marker */bool is_deleted_;/** The fields modified by this undo log* modified_fields is a vector of bool that has the same length as the table schema. If one of the fields is set to* true, it indicates that the field is updated. The tuple field contains the partial tuple.*/std::vector<bool> modified_fields_;/* The modified fields */Tuple tuple_;/* Timestamp of this undo log */timestamp_t ts_{INVALID_TS};/* Undo log prev version */UndoLink prev_version_{};
};

我们下列问题需要明确:

  1. UndoLog 是什么时候生成的呢, 其中的 timestamp_t 是什么意思?
  2. 在测试案例中, 为什么 is_deleted_ == true 的时候, 这个 UndoLog 对应的 tuple_ 是空的, 它不应该是记录删除之前的不为空的 tuple_ 吗?
  3. tuple_ 是记录当前 Tuple 在当前对应的 UndoLog 修改之前还是修改之后的 Tuple.
  4. 假设某个事务的 read_ts 等于当前 UndoLog 的 ts_, 是否需要执行这个 UndoLog 来进行回退当前事务

关于问题2, 为什么is_deleted_ == true这个 UndoLog 对应的 tuple_ 为空呢,
这是因为 UndoLog 记录都是这个 UndoLog 之前的状态, is_deleted_ == true 表示这个 UndoLog 之前的状态是删除状态, 所以 tuple_ 存储的内容当然为空了
具体的对于一个 Tuple 而言, 删除这个 Tuple, 只是将 TupleMeta 中的 is_deleted 设置为 true, 并没有对 Tuple 实际存储的数据进行修改, 所以 UndoLog 只需要记录一个标志位就可以了, 实际上没有任何数据修改
3. tuple_ 很明显是记录当前的 UndoLog 修改之间的状态, 但是仅记录了修改的部分

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/889687.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

啦啦啦啦啦啦啦啦啦

啦啦啦 啦啦啦啦啦啦啦啦啦 ABC221G 神秘题,将坐标轴转 \(45\),然后 bitset 优化背包,记录路径把刚刚被更新的找出来,然后 _Find_next,每个点只会记一次。 AGC050a 神秘题,想到 \(\log\),然后发现一下位置 \(x\) 走十次能到的区间是 \([1024x,1024x+1023]\),区间长度够…

破解 vLLM + DeepSeek 规模化部署的“不可能三角”

通过 FC GPU 预留实例的闲置计费功能,企业用户能在充分利用 vLLM 的强大功能的同时找到成本、性能、稳定的最佳平衡点,并保持开发和运维的高效性。无论是将 FC vLLM 函数直接对外提供服务,还是深度集成到现有系统中,或是通过 CAP 还是魔搭来简化部署,都能找到满足您业务需…

条形码编码规则全解析:从黑白条纹到数字世界的转换密码

条形码的编码规则是将字符(数字、字母等)转换为特定黑白条纹或矩阵结构的标准化方法,核心目的是让机器能够快速、准确地识别和解析信息。以下是常见条形码编码规则的简介: 一维条形码编码规则 1. ​基本原理通过不同宽度的黑白条纹​(或空格)组合表示字符。 每个字符对应…

[汽车电子/车联网] CANoe

概述:CANoe CAN 全家桶区别: CANoe vs CanalyzerCANoe和CANalyzer使用方法类似(简直可以说 相同)。 都可用于simulation,区别在于CANalyzer只能模拟单个Node,而CANoe可以同时模拟多个Node。如果入门学习了CANoe,就不用入门学习CANalyzer了。安装指南 安装 CANoeDemo on …

璞华易研PLM荣登软服之家多项榜单,PLM+AI为流程行业提供产品创新引擎

近日,国内知名软件与服务评测平台软服之家发布了多个PLM(Product Lifecycle Management,产品全生命周期管理)榜单,帮助用户了解PLM领域表现卓越的软件产品和服务。在软服之家的多项榜单中,璞华易研PLM凭借其自主研发能力与行业深耕优势,在流程行业、电子信息、装备制造等…

ELK 原理介绍及实践详解

介绍了ELK(Elasticsearch, Logstash, Kibana)在大规模日志管理中的重要性,阐述了ELK解决日志分析的挑战,如日志收集、传输、存储和分析。文章详细讲解了ELK的组成部分,包括Filebeat的工作原理、Logstash的输入、过滤和输出阶段,以及Kibana的分析和可视化功能。此外,还提…

工信部人才交流中心PostgreSQL认证考试 - 聊一下更多精彩

在数字经济高速发展的今天,数据库作为信息基础设施的核心组件,其技术自主性与人才储备已成为国家战略竞争力的关键。工业和信息化部人才交流中心(以下简称“工信人才”)推出PostgreSQL认证考试,不仅是对技术发展趋势的精准响应,更是推动信创产业生态建设、填补数据库人才缺…

单链表与单循环链表的C语言实现

单链表与单循环链表的C语言实现 目录单链表与单循环链表的C语言实现单链表的增删查改单循环链表的增删查改 单链表的增删查改 /*单链表*/#include<stdio.h> #include<stdlib.h>typedef struct Node{int data;struct Node* next; }Node;Node* initList(){Node* node…

可能是全球最快捷的修改hosts文件方式

使用快捷方式一键修改hosts文件。 下面请看VCR:其实关键的命令只有一条:powershell.exe -Command "Start-Process -FilePath notepad.exe -Verb RunAs -ArgumentList "$env:SystemRoot\system32\drivers\etc\hosts""它使用记事本以管理员权限打开位于 C:…

KUKA机器人KR70伺服电机力矩不足维修攻略

库卡机器人作为先进的工业自动化解决方案,广泛应用于各种生产线中。然而,当出现KUKA机械手伺服马达力矩不足干燥的问题时,可能会严重影响其工作效率和性能。 一、库卡机器人电机力矩不足故障的原因 1. 电机老化:随着使用时间的增加,电机内部的零部件可能会出现磨损,导致力…

S2-防护-战士Warrior-团体-大秘境-专精-天赋-配装-宏

S2毕业装--属性 急速>全能>爆击>精通 急速和全能越高越好。爆击和精通随缘。 --团本天赋(更新时间2月5日)--团本天赋代码 CkEAmidFBOBFf5oKuZ7r/WeW7YEDAAAAzMzYmZGMbzsMzMz2mZMMNzgZmBwyADbMzMwDMzDMMAAAAAAgZGAgltNADDsBLLGNmBwsFbYD --大秘天赋(更新时间2月5日)--大…

S2-武器-战士Warrior-团体-大秘境-专精-天赋-配装-宏

S2毕业装--属性 急速>爆击>精通>全能 急速和爆击越高越好。精通随缘。不要全能。 --团本/单体天赋(更新时间2月10日)--团本/单体天赋代码 CcEAmidFBOBFf5oKuZ7r/WeW7AAzYmZMzMzsZZZZmBAAAADmGmZYbGzAzYMzMYmhBGmhBAAAAAAAPwYWmZmBQgxy2ALgBMDTIDwG --大秘/AOE巨神兵天…