决定彻底放弃对MooseFS的研究
虽然对 分布式 也有一些了解,但是一直没有深入到代码去 研究 具体的实现。在群里咨询了一下,自己也google了一些资料,最终 决定 从MooseFS入手来深入 研究 分布式 系统 。第一步,就是从网上找文档,自己动手安装部署一番。官方网站上有一个中文的安装手册
虽然对分布式也有一些了解,但是一直没有深入到代码去研究具体的实现。在群里咨询了一下,自己也google了一些资料,最终决定从MooseFS入手来深入研究分布式系统。第一步,就是从网上找文档,自己动手安装部署一番。官方网站上有一个中文的安装手册,非常nice,整个安装配置过程也非常顺利,感觉还不错,就是看它的代码实现。看完之后有些失望,在main函数中的第一个函数strerr_init()中看到了这样的代码:
for (n=0 ; errtab[n].str ; n++) {}
static errent errtab[] = { #ifdef E2BIG {E2BIG,"E2BIG (Argument list too long)"}, #endif #ifdef EACCES {EACCES,"EACCES (Permission denied)"}, #endif ...... {0,NULL} };
另一个地方让我感觉作者在写代码的时候很不用心,cfg_reload()在解析配置文件时定义了一个缓冲区linebuff[1000]数组来存储每行读取的内容。mfs解析配置文件时是按行读取的,每行的配置内容类似“key=value"这样的形式。这个缓冲区的长度定义为1000,也让我很不解。因为在定义缓冲区或分配内存的时候,一般都会考虑到对齐,都会对齐到word size或者CPU cache line的长度。这里的1000让我很不解!
代码中还有很多无用的、多余的判断。例如下面的代码段:
logappname = cfg_getstr("SYSLOG_IDENT",STR(APPNAME)); if (rundaemon) { if (logappname[0]) { openlog(logappname, LOG_PID | LOG_NDELAY , LOG_DAEMON); } else { openlog(STR(APPNAME), LOG_PID | LOG_NDELAY , LOG_DAEMON); } }
判断仅一个空行之隔,没必要到极点了吧。
抛开这些细节性的东西不提,mfs选择的I/O复用机制也让人不敢恭维。现在需要监听套接字的读写事件,毫无疑问首选的eventpoll。如果没有记错的话,moosefs是07年开始的,这个时候内核中的eventpoll机制已经很完善了,实在不懂作者为什么要选用poll()来作为I/O复用的接口。在继续之前,先看一下下面的代码:
i = poll(pdesc,ndesc,50); ...... if (i 我不明白在poll()返回-1时,为什么要检查EAGAIN错误。查看了man手册,只有EFAULT、EINTR、EINVAL、ENOMEM错误,看了一下内核代码,也没有返回EAGAIN错误的地方。而且很不明白,为什么在EAGAIN的时候要调用usleep()等待100毫秒,不理解! <p> 最终<strong>彻底</strong>击穿我的信心的是matoclserv_gotpacket()函数,这个函数通过判断eptr->registered的值来做不同的三种处理,这三个代码块中很多都是可以合并的。要么给每种处理封装成一个函数,要么将这三块代码合并成一块,这样看着不是更简洁么?很多switch-case分支中的处理也不用区分eptr->registered的值,为什么写的这么庞大?难道作者在写的时候为了方便,复制粘贴了一番?反正我是很不理解,这样的代码风格真是让我没办法看下去,我<strong>决定</strong><strong>放弃</strong>了。我知道半途而废很不好,本来自己写代码风格就不好,怕看完之后更偏了,所以果断<strong>放弃</strong>!</p> <p> 下面是matoclserv_gotpacket()函数的代码,大家欣赏一下:</p> <p></p><pre name="code" class="cpp">void matoclserv_gotpacket(matoclserventry *eptr,uint32_t type,const uint8_t *data,uint32_t length) { if (type==ANTOAN_NOP) { return; } if (eptr->registered==0) { // unregistered clients - beware that in this context sesdata is NULL switch (type) { case CLTOMA_FUSE_REGISTER: matoclserv_fuse_register(eptr,data,length); break; case CLTOMA_CSERV_LIST: matoclserv_cserv_list(eptr,data,length); break; case CLTOMA_SESSION_LIST: matoclserv_session_list(eptr,data,length); break; case CLTOAN_CHART: matoclserv_chart(eptr,data,length); break; case CLTOAN_CHART_DATA: matoclserv_chart_data(eptr,data,length); break; case CLTOMA_INFO: matoclserv_info(eptr,data,length); break; case CLTOMA_FSTEST_INFO: matoclserv_fstest_info(eptr,data,length); break; case CLTOMA_CHUNKSTEST_INFO: matoclserv_chunkstest_info(eptr,data,length); break; case CLTOMA_CHUNKS_MATRIX: matoclserv_chunks_matrix(eptr,data,length); break; case CLTOMA_QUOTA_INFO: matoclserv_quota_info(eptr,data,length); break; case CLTOMA_EXPORTS_INFO: matoclserv_exports_info(eptr,data,length); break; case CLTOMA_MLOG_LIST: matoclserv_mlog_list(eptr,data,length); break; default: syslog(LOG_NOTICE,"main master server module: got unknown message from unregistered (type:%"PRIu32")",type); eptr->mode=KILL; } } else if (eptr->registeredsesdata==NULL) { syslog(LOG_ERR,"registered connection without sesdata !!!"); eptr->mode=KILL; return; } switch (type) { case CLTOMA_FUSE_REGISTER: matoclserv_fuse_register(eptr,data,length); break; case CLTOMA_FUSE_RESERVED_INODES: matoclserv_fuse_reserved_inodes(eptr,data,length); break; case CLTOMA_FUSE_STATFS: matoclserv_fuse_statfs(eptr,data,length); break; case CLTOMA_FUSE_ACCESS: matoclserv_fuse_access(eptr,data,length); break; case CLTOMA_FUSE_LOOKUP: matoclserv_fuse_lookup(eptr,data,length); break; case CLTOMA_FUSE_GETATTR: matoclserv_fuse_getattr(eptr,data,length); break; case CLTOMA_FUSE_SETATTR: matoclserv_fuse_setattr(eptr,data,length); break; case CLTOMA_FUSE_READLINK: matoclserv_fuse_readlink(eptr,data,length); break; case CLTOMA_FUSE_SYMLINK: matoclserv_fuse_symlink(eptr,data,length); break; case CLTOMA_FUSE_MKNOD: matoclserv_fuse_mknod(eptr,data,length); break; case CLTOMA_FUSE_MKDIR: matoclserv_fuse_mkdir(eptr,data,length); break; case CLTOMA_FUSE_UNLINK: matoclserv_fuse_unlink(eptr,data,length); break; case CLTOMA_FUSE_RMDIR: matoclserv_fuse_rmdir(eptr,data,length); break; case CLTOMA_FUSE_RENAME: matoclserv_fuse_rename(eptr,data,length); break; case CLTOMA_FUSE_LINK: matoclserv_fuse_link(eptr,data,length); break; case CLTOMA_FUSE_GETDIR: matoclserv_fuse_getdir(eptr,data,length); break; /* CACHENOTIFY case CLTOMA_FUSE_DIR_REMOVED: matoclserv_fuse_dir_removed(eptr,data,length); break; */ case CLTOMA_FUSE_OPEN: matoclserv_fuse_open(eptr,data,length); break; case CLTOMA_FUSE_READ_CHUNK: matoclserv_fuse_read_chunk(eptr,data,length); break; case CLTOMA_FUSE_WRITE_CHUNK: matoclserv_fuse_write_chunk(eptr,data,length); break; case CLTOMA_FUSE_WRITE_CHUNK_END: matoclserv_fuse_write_chunk_end(eptr,data,length); break; // fuse - meta case CLTOMA_FUSE_GETTRASH: matoclserv_fuse_gettrash(eptr,data,length); break; case CLTOMA_FUSE_GETDETACHEDATTR: matoclserv_fuse_getdetachedattr(eptr,data,length); break; case CLTOMA_FUSE_GETTRASHPATH: matoclserv_fuse_gettrashpath(eptr,data,length); break; case CLTOMA_FUSE_SETTRASHPATH: matoclserv_fuse_settrashpath(eptr,data,length); break; case CLTOMA_FUSE_UNDEL: matoclserv_fuse_undel(eptr,data,length); break; case CLTOMA_FUSE_PURGE: matoclserv_fuse_purge(eptr,data,length); break; case CLTOMA_FUSE_GETRESERVED: matoclserv_fuse_getreserved(eptr,data,length); break; case CLTOMA_FUSE_CHECK: matoclserv_fuse_check(eptr,data,length); break; case CLTOMA_FUSE_GETTRASHTIME: matoclserv_fuse_gettrashtime(eptr,data,length); break; case CLTOMA_FUSE_SETTRASHTIME: matoclserv_fuse_settrashtime(eptr,data,length); break; case CLTOMA_FUSE_GETGOAL: matoclserv_fuse_getgoal(eptr,data,length); break; case CLTOMA_FUSE_SETGOAL: matoclserv_fuse_setgoal(eptr,data,length); break; case CLTOMA_FUSE_APPEND: matoclserv_fuse_append(eptr,data,length); break; case CLTOMA_FUSE_GETDIRSTATS: matoclserv_fuse_getdirstats_old(eptr,data,length); break; case CLTOMA_FUSE_TRUNCATE: matoclserv_fuse_truncate(eptr,data,length); break; case CLTOMA_FUSE_REPAIR: matoclserv_fuse_repair(eptr,data,length); break; case CLTOMA_FUSE_SNAPSHOT: matoclserv_fuse_snapshot(eptr,data,length); break; case CLTOMA_FUSE_GETEATTR: matoclserv_fuse_geteattr(eptr,data,length); break; case CLTOMA_FUSE_SETEATTR: matoclserv_fuse_seteattr(eptr,data,length); break; /* do not use in version before 1.7.x */ case CLTOMA_FUSE_QUOTACONTROL: matoclserv_fuse_quotacontrol(eptr,data,length); break; /* for tools - also should be available for registered clients */ case CLTOMA_CSERV_LIST: matoclserv_cserv_list(eptr,data,length); break; case CLTOMA_SESSION_LIST: matoclserv_session_list(eptr,data,length); break; case CLTOAN_CHART: matoclserv_chart(eptr,data,length); break; case CLTOAN_CHART_DATA: matoclserv_chart_data(eptr,data,length); break; case CLTOMA_INFO: matoclserv_info(eptr,data,length); break; case CLTOMA_FSTEST_INFO: matoclserv_fstest_info(eptr,data,length); break; case CLTOMA_CHUNKSTEST_INFO: matoclserv_chunkstest_info(eptr,data,length); break; case CLTOMA_CHUNKS_MATRIX: matoclserv_chunks_matrix(eptr,data,length); break; case CLTOMA_QUOTA_INFO: matoclserv_quota_info(eptr,data,length); break; case CLTOMA_EXPORTS_INFO: matoclserv_exports_info(eptr,data,length); break; case CLTOMA_MLOG_LIST: matoclserv_mlog_list(eptr,data,length); break; default: syslog(LOG_NOTICE,"main master server module: got unknown message from mfsmount (type:%"PRIu32")",type); eptr->mode=KILL; } } else { // old mfstools if (eptr->sesdata==NULL) { syslog(LOG_ERR,"registered connection (tools) without sesdata !!!"); eptr->mode=KILL; return; } switch (type) { // extra (external tools) case CLTOMA_FUSE_REGISTER: matoclserv_fuse_register(eptr,data,length); break; case CLTOMA_FUSE_READ_CHUNK: // used in mfsfileinfo matoclserv_fuse_read_chunk(eptr,data,length); break; case CLTOMA_FUSE_CHECK: matoclserv_fuse_check(eptr,data,length); break; case CLTOMA_FUSE_GETTRASHTIME: matoclserv_fuse_gettrashtime(eptr,data,length); break; case CLTOMA_FUSE_SETTRASHTIME: matoclserv_fuse_settrashtime(eptr,data,length); break; case CLTOMA_FUSE_GETGOAL: matoclserv_fuse_getgoal(eptr,data,length); break; case CLTOMA_FUSE_SETGOAL: matoclserv_fuse_setgoal(eptr,data,length); break; case CLTOMA_FUSE_APPEND: matoclserv_fuse_append(eptr,data,length); break; case CLTOMA_FUSE_GETDIRSTATS: matoclserv_fuse_getdirstats(eptr,data,length); break; case CLTOMA_FUSE_TRUNCATE: matoclserv_fuse_truncate(eptr,data,length); break; case CLTOMA_FUSE_REPAIR: matoclserv_fuse_repair(eptr,data,length); break; case CLTOMA_FUSE_SNAPSHOT: matoclserv_fuse_snapshot(eptr,data,length); break; case CLTOMA_FUSE_GETEATTR: matoclserv_fuse_geteattr(eptr,data,length); break; case CLTOMA_FUSE_SETEATTR: matoclserv_fuse_seteattr(eptr,data,length); break; /* do not use in version before 1.7.x */ case CLTOMA_FUSE_QUOTACONTROL: matoclserv_fuse_quotacontrol(eptr,data,length); break; /* ------ */ default: syslog(LOG_NOTICE,"main master server module: got unknown message from mfstools (type:%"PRIu32")",type); eptr->mode=KILL; } } }

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

大规模语言模型(LLMs)在许多重要任务中展现出了引人注目的能力,包括自然语言理解、语言生成和复杂推理,并对社会产生了深远的影响。然而,这些出色的能力却需要大量的训练资源(如左图所示)和较长的推理时间(如右图所示)。因此,研究人员需要开发有效的技术手段来解决它们的效率问题。此外,从图的右侧还可以看出,一些高效的LLMs(LanguageModels)如Mistral-7B,已经成功应用于LLMs的设计和部署中。这些高效的LLMs在保持与LLaMA1-33B相近的准确性的同时,能够大大减少推理内存

Windows.old文件夹是在使用Windows10更新之前的操作系统版本中生成的一个文件夹。此文件夹包含旧的Windows安装文件、程序文件和个人文件,它占用了大量的磁盘空间。当您在使用Windows10更新之后的一段时间内确认您不会回滚到旧的操作系统版本时,您可以考虑彻底删除Windows.old文件夹。下面将介绍一些方法供您选择

3纳米制程,性能超越H100!最近,据外媒DigiTimes爆料,英伟达正在开发下一代GPU,代号为「Blackwell」的B100据称,作为面向人工智能(AI)和高性能计算(HPC)应用的产品,B100将采用台积电的3nm工艺制程,以及更为复杂的多芯片模块(MCM)设计,并将于2024年第四季度现身。对于垄断了人工智能GPU市场80%以上份额的英伟达来说,则可以借着B100趁热打铁,在这波AI部署的热潮中进一步狙击AMD、英特尔等挑战者。根据英伟达的估计,到2027年,该领域的产值预计将达到约

图像到视频生成(I2V)任务是计算机视觉领域的一项挑战,旨在将静态图像转化为动态视频。这个任务的难点在于从单张图像中提取并生成时间维度的动态信息,同时保持图像内容的真实性和视觉上的连贯性。现有的I2V方法通常需要复杂的模型架构和大量的训练数据来实现这一目标。近期,快手主导的一项新研究成果《I2V-Adapter:AGeneralImage-to-VideoAdapterforVideoDiffusionModels》发布。该研究引入了一种创新的图像到视频转换方法,提出了一种轻量级适配器模块,即I

EfficientSAM这篇工作以5/5/5满分收录于CVPR2024!作者在某社交媒体上分享了该结果,如下图所示:LeCun图灵奖得主也强烈推荐了该工作!在近期的研究中,Meta研究者提出了一种新的改进方法,即使用SAM的掩码图像预训练(SAMI)。这一方法结合了MAE预训练技术和SAM模型,旨在实现高质量的预训练ViT编码器。通过SAMI,研究者试图提高模型的性能和效率,为视觉任务提供更好的解决方案。这一方法的提出为进一步探索和发展计算机视觉和深度学习领域带来了新的思路和机遇。通过结合不同的

如何使用Redis实现分布式数据同步随着互联网技术的发展和应用场景的日益复杂,分布式系统的概念越来越被广泛采用。在分布式系统中,数据同步是一个重要的问题。Redis作为一个高性能的内存数据库,不仅可以用来存储数据,还可以用来实现分布式数据同步。对于分布式数据同步,一般有两种常见的模式:发布/订阅(Publish/Subscribe)模式和主从复制(Maste

视频生成进展如火如荼,Pika迎来一位大将——谷歌研究员OmerBar-Tal,担任Pika创始科学家。一个月前,还在谷歌以共同一作的身份发布视频生成模型Lumiere,效果十分惊艳。当时网友表示:谷歌加入视频生成战局,又有好戏可看了。StabilityAICEO、谷歌前同事等在内一些业内人士送上了祝福。Lumiere一作,刚硕士毕业OmerBar-Tal,2021年本科毕业于特拉维夫大学的数学与计算机系,随后前往魏茨曼科学研究所攻读计算机硕士,主要聚焦于图像和视频合成领域的研究。其论文成果多次

Redis如何实现分布式会话管理,需要具体代码示例分布式会话管理是当下互联网热门话题之一,面对高并发、大数据量的场景,传统的会话管理方式逐渐显得力不从心。Redis作为一个高性能的键值数据库,提供了分布式会话管理的解决方案。本文将介绍如何使用Redis实现分布式会话管理,并给出具体的代码示例。一、Redis作为分布式会话存储介绍传统的会话管理方式是将会话信
