Rucbase 存储管理——磁盘管理器

1.需求

本题需要实现磁盘管理器DiskManager的相关接口,磁盘管理器负责文件操作、读写页面等。阅读项目结构文档中磁盘管理器的相关说明,以及代码框架中src/errors.h、src/storage/disk_manager.h、src/storage/disk_manager.cpp、src/common/config.h文件,

实现以下接口:

(1)void DiskManager::create_file(const std::string &path);

该接口的参数path为文件名,该接口的功能是创建文件,其文件名为path参数指定的文件名。

(2)void DiskManager::open_file(const std::string &path);

该接口的参数path为文件名,该接口的功能是打开文件名参数path指定的文件。

(3)void DiskManager::close_file(const std::string &path);

该接口的参数path为文件名,该接口的功能是关闭文件名参数path指定的文件。

(4)void DiskManager::destroy_file(const std::string &path);

该接口的参数path为文件名,该接口的功能是删除文件名参数path指定的文件。

(5)void DiskManager::write_page(int fd, page_id_t page_no, const char *offset, int num_bytes);

该接口负责在文件的指定页面写入指定长度的数据,该接口从指定页面的起始位置开始写入数据。

(6)void DiskManager::read_page(int fd, page_id_t page_no, char *offset, int num_bytes);

该接口需要从文件的指定页面读取指定长度的数据,该接口从指定页面的起始位置开始读取数据。

2.熟悉框架

查看disk_manager数据结构,path2fd_与fd2path_两张哈希表用来相互映射文件句柄和文件路径,保证在O(1)的时间复杂度内查询,两张表的功能为:查看记录文件是否被打开,存在于两张表的文件即为正在被打开的文件

   private:// 文件打开列表,用于记录文件是否被打开std::unordered_map<std::string, int> path2fd_;  //<Page文件磁盘路径,Page fd>哈希表std::unordered_map<int, std::string> fd2path_;  //<Page fd,Page文件磁盘路径>哈希表int log_fd_ = -1;                             // WAL日志文件的文件句柄,默认为-1,代表未打开日志文件std::atomic<page_id_t> fd2pageno_[MAX_FD]{};  // 文件中已经分配的页面个数,初始值为0

接着看另外一个重要的函数is_file

此函数的作用是通过文件路径判断该文件是否存在数据库中,不在及时抛出异常,防止异常访问导致段错误崩溃

/*** @description: 判断指定路径文件是否存在* @return {bool} 若指定路径文件存在则返回true * @param {string} &path 指定路径文件*/
bool DiskManager::is_file(const std::string &path) {// 用struct stat获取文件信息struct stat st;return stat(path.c_str(), &st) == 0 && S_ISREG(st.st_mode);
}

所有的修改均在rucbase-lab/src/storage/disk_manager.cpp

3.实现功能

create_file(const std::string &path)

  • O_RDWR 是一个打开模式标志,表示以可读写的方式打开文件。
  • O_CREAT 是一个创建标志,表示如果文件不存在,则创建一个新文件。
  • S_IRUSR | S_IWUSR 是权限标志,表示用户具有读取和写入权限。

1.打开文件时既具有读写权限又能够创建文件

2.用户具有读取和写入权限

/*** @description: 用于创建指定路径文件* @return {*}* @param {string} &path*/
void DiskManager::create_file(const std::string &path) {// Todo:// 调用open()函数,使用O_CREAT模式// 注意不能重复创建相同文件if(is_file(path)) {throw FileExistsError(path);}//通过is_file函数保证不创建重复的文件int fd = open(path.c_str(),O_RDWR | O_CREAT , S_IRUSR | S_IWUSR );if( fd < 0) throw FileNotOpenError(fd);close(fd);
}

destroy_file(const std::string &path)

/*** @description: 删除指定路径的文件* @param {string} &path 文件所在路径*/
void DiskManager::destroy_file(const std::string &path) {// Todo:// 调用unlink()函数// 注意不能删除未关闭的文件if(!is_file(path)) throw FileNotFoundError(path);if(path2fd_.count(path)) throw FileNotClosedError(path);//文件未关闭unlink(path.c_str());
}

 open_file(const std::string &path)

/*** @description: 打开指定路径文件 * @return {int} 返回打开的文件的文件句柄* @param {string} &path 文件所在路径*/
int DiskManager::open_file(const std::string &path) {// Todo:// 调用open()函数,使用O_RDWR模式// 注意不能重复打开相同文件,并且需要更新文件打开列表if(!is_file(path)) throw FileNotFoundError(path);if(path2fd_.count(path)) throw FileNotClosedError(path);int fd = open(path.c_str(),O_RDWR);//更新文件打开列表操作fd2path_[fd] = path;path2fd_[path] = fd;return fd;
}

close_file(int fd)

根据文件句柄查看文件是否未关闭,关闭后即可清理哈希表中的映射

/*** @description:用于关闭指定路径文件 * @param {int} fd 打开的文件的文件句柄*/
void DiskManager::close_file(int fd) {// Todo:// 调用close()函数// 注意不能关闭未打开的文件,并且需要更新文件打开列表if(!fd2path_.count(fd)){//该文件未打开throw FileNotOpenError(fd);}close(fd);path2fd_.erase(fd2path_[fd]);fd2path_.erase(fd);
}

DiskManager::write_page(int fd, page_id_t page_no, const char *offset, int num_bytes)

fseek(FILE *stream, long offset, int whence);

1.offset表示文件指针的偏移量

SEEK_SET:基准位置为文件开头,即offset表示距离文件开头的偏移量。

SEEK_CUR:基准位置为文件当前位置,即offset表示距离文件当前位置的偏移量。

SEEK_END:基准位置为文件末尾,即offset表示距离文件末尾的偏移量。
2.whence表示偏移量的基准位置

当whence为SEEK_SET时,offset表示距离文件开头的偏移量;

当whence为SEEK_CUR时,offset表示距离文件当前位置的偏移量;

当whence为SEEK_END时,offset表示距离文件末尾的偏移量。

void DiskManager::write_page(int fd, page_id_t page_no, const char *offset, int num_bytes) {// Todo:// 1.lseek()定位到文件头,通过(fd,page_no)可以定位指定页面及其在磁盘文件中的偏移量// 2.调用write()函数// 注意write返回值与num_bytes不等时 throw InternalError("DiskManager::write_page Error");lseek(fd,page_no*PAGE_SIZE,SEEK_SET);int write_bytes = write(fd,offset,num_bytes);if(write_bytes<0) throw InternalError("DiskManager::write_page Error");
}

DiskManager::read_page(int fd, page_id_t page_no, char *offset, int num_bytes) 

void DiskManager::read_page(int fd, page_id_t page_no, char *offset, int num_bytes) {// Todo:// 1.lseek()定位到文件头,通过(fd,page_no)可以定位指定页面及其在磁盘文件中的偏移量// 2.调用read()函数// 注意read返回值与num_bytes不等时,throw InternalError("DiskManager::read_page Error");lseek(fd,page_no*PAGE_SIZE,SEEK_SET);int read_bytes = read(fd,offset,num_bytes);if(read_bytes<0) throw InternalError("DiskManager::read_page Error");
}

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

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

相关文章

Apache简介与安装

先导概念: 静态网站: 最早的建站方式,每个页面都是一个独立的文件,需要手动上传或编辑。网页内容固定不变。例如,个人博客、静态企业官网等。 动态网站: 网站内容可根据不同情况动态变更,一般通过数据库进行架构。包含服务器端脚本,可以实现更丰富的功能。例如,社…

构建智能医患沟通:陪诊小程序开发实战

在医疗科技的浪潮中&#xff0c;陪诊小程序的开发成为改善医患沟通的创新途径之一。本文将介绍如何使用Node.js和Express框架构建一个简单而强大的陪诊小程序&#xff0c;实现患者导诊和医生咨询功能。 1. 安装Node.js和Express 首先确保已安装Node.js&#xff0c;然后使用以…

Linux procps-ng - top

procps-ng 是一个开源的进程管理工具集&#xff0c;它提供了一系列用于监控和管理系统进程的命令行工具。它是 procps 工具集的一个分支&#xff0c;旨在改进和增强原有的 procps 工具。 procps-ng 包括了一些常用的命令行工具&#xff0c;例如&#xff1a; ps&#xff1a;用于…

Day28|Leetcode 93. 复原 IP 地址 Leetcode 78. 子集 Leetcode 90. 子集 II

Leetcode 93. 复原 IP 地址 题目链接 93 复原 IP 地址 本题目也是分割的典型题目&#xff0c;属于分割回文子串的升级版&#xff0c;大概的思路都是一样的&#xff0c;注意几点&#xff0c;第一个是对ip地址正确与否的条件&#xff0c;第二个插入逗点后&#xff0c;下一个子串…

机器学习笔记 - 创建CNN + RNN + CTC损失的模型来识别图像中的文本

我们将创建一个具有CTC损失的卷积循环神经网络来实现我们的OCR识别模型。 一、数据集 我们将使用 Visual Geometry Group 提供的数据。 Visual Geometry Group - University of OxfordComputer Vision group from the University of Oxfordhttps://www.robots.ox.ac.uk/~vgg/d…

最新AIGC创作系统ChatGPT系统源码,支持最新GPT-4-Turbo模型,支持DALL-E3文生图,图片对话理解功能

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

leetcode:415. 字符串相加(模拟竖式计算)

一、题目 链接&#xff1a; 415. 字符串相加 - 力扣&#xff08;LeetCode&#xff09; 函数原型&#xff1a;char* addStrings(char* num1, char* num2) 二、思路&#xff1a; 本题本质是将两个字符型数字相加&#xff0c;字符型数字相加就一定需要进行字符与数字的相互转换 详…

秋招JAVA面经总结

面试的范围是Java基础+Java并发+Java框架+mysql+网络。 Java基础 重载与重写有什么区别? 重载(Overloading)指的是在同一个类中,可以有多个同名方法,它们具有不同的参数列表(参数类型、参数个数或参数顺序不同),编译器根据调用时的参数类型来决定调用哪个方法。 重写…

笔试强训2

目录 &#x1f449;&#x1f3fb;字符串反转&#x1f449;&#x1f3fb;公共子串计算 &#x1f449;&#x1f3fb;字符串反转 mycode:100% #include <iostream> #include<algorithm> using namespace std;int main() {string s;cin>>s;reverse(s.begin(),s.…

Java(五)(Object类,克隆,Objects类,包装类,StringBuilder,StringJoiner,BigDecimal)

目录 Object类 Object类的常见方法: 克隆 浅克隆 深克隆 Objects类 包装类 StringBuilder StringJoiner BigDecimal Object类 Object类是java中的祖宗类,因此,Java中所有的类的对象都可以直接使用object类提供的一些方法 Object类的常见方法: public String toStrin…

23111701[含文档+PPT+源码等]计算机毕业设计javaweb点餐系统全套餐饮就餐订餐餐厅

文章目录 **项目功能简介:****点餐系统分为前台和后台****前台功能介绍&#xff1a;****后台功能介绍&#xff1a;** **论文截图&#xff1a;****实现&#xff1a;****代码片段&#xff1a;** 编程技术交流、源码分享、模板分享、网课教程 &#x1f427;裙&#xff1a;77687156…

智能座舱架构与芯片- (8) 视觉篇

一、概述 相比起用于ADAS感知系统的摄像头&#xff0c;用于智能座舱内部的摄像头&#xff0c;其功能特性和性能要求相对简单。例如&#xff0c;OMS乘客监控摄像头&#xff0c;一般达到5MP即可有良好的效果。同时&#xff0c;OMS也可应用于车内会议系统&#xff0c;还应用于车内…

微服务 Spring Cloud 8,开源RPC框架如何选型?

目录 一、开源RPC框架有哪些&#xff1f;1、跟语言平台绑定的开源RPC框架2、跨语言平台的开源RPC框架 二、跟语言平台绑定的开源RPC框架 -- Dubbo1、Dubbo的架构主要包含四个角色2、Dubbo的调用框架是如何实现的&#xff1f; 三、如何选择&#xff1f;四、跨语言平台的开源RPC框…

UI for Apache Kafka

文章Overview of UI Tools for Monitoring and Management of Apache Kafka Clusters | by German Osin | Towards Data Science中介绍了8种常见的kafka UI工具,这些产品的核心功能对比信息如下图所示, 通过对比发现 UI for Apache Kafka 功能齐全且免费,因此可以作为我们的首…

Kubernetes容器状态探测的艺术

在Kubernetes集群中维护容器状态更像是一种艺术&#xff0c;而不是科学。原文: The Art and Science of Probing a Kubernetes Container[1] 在Kubernetes集群中维护容器状态更像是一种艺术&#xff0c;而不是科学。 本文将带你深入理解容器探测[2]&#xff0c;并特别关注相对较…

Linux安装ErLang(亲测可用)

注&#xff08;我这里安装完成后显示的是中文&#xff0c;有的是显示的英文&#xff09; 1.下载er wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm2.安装er yum -y install epel-release截图截不全&#xff0c;就只截安装完成的部分了 rp…

2023年中国语言大模型行业发展趋势分析:预计未来行业将迎来高速增长[图]

自然语言处理&#xff08;NLP&#xff09;大模型是一种利用深度学习技术来理解、解释和生成人类语言的高参数模型。语言大模型通过编码解码的方式模仿人类处理语言的过程从而达到进行自然语言文本输出的能力。 语言大模型主要组成部分 资料来源&#xff1a;共研产业咨询&#…

STM32出现 Invalid Rom Table 芯片锁死解决方案

出现该现象的原因为板子外部晶振为25M&#xff0c;而程序软件上以8M为输入晶振频率&#xff0c;导致芯片超频锁死&#xff0c;无法连接、下载。 解决方案 断电&#xff0c;将芯片原来通过10k电阻接地的BOOT0引脚直接接3.3V&#xff0c;硬件上置1上电&#xff0c;连接目标板&am…

3.9-Dockerfile实战

这一节介绍怎么将python程序打包成一个image&#xff0c;然后运行为一个container。 首先&#xff0c;创建/home/python/目录 mkdir /home/python/ 然后创建app.py文件。 vim app.py app.py文件的内容如下&#xff1a; from flask import Flaskapp Flask(__name__)app.route(…

解决收集问卷难的方法与策略:提升数据收集效率

随着社会的发展和科技的进步&#xff0c;问卷调查成为了获取信息和研究数据的重要手段之一。然而&#xff0c;面临的一个普遍难题是如何解决收集问卷困难的问题。无论是在学术研究、市场调研还是社会调查中&#xff0c;都存在着一些挑战和阻碍因素。本文将从不同角度探讨如何突…