• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當(dāng)前位置: 首頁 - 科技 - 知識(shí)百科 - 正文

    決定徹底放棄對(duì)MooseFS的研究

    來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-09 08:22:23
    文檔

    決定徹底放棄對(duì)MooseFS的研究

    決定徹底放棄對(duì)MooseFS的研究:雖然對(duì) 分布式 也有一些了解,但是一直沒有深入到代碼去 研究 具體的實(shí)現(xiàn)。在群里咨詢了一下,自己也google了一些資料,最終 決定 從MooseFS入手來深入 研究 分布式 系統(tǒng) 。第一步,就是從網(wǎng)上找文檔,自己動(dòng)手安裝部署一番。官方網(wǎng)站上有一個(gè)中文的安裝手冊(cè)
    推薦度:
    導(dǎo)讀決定徹底放棄對(duì)MooseFS的研究:雖然對(duì) 分布式 也有一些了解,但是一直沒有深入到代碼去 研究 具體的實(shí)現(xiàn)。在群里咨詢了一下,自己也google了一些資料,最終 決定 從MooseFS入手來深入 研究 分布式 系統(tǒng) 。第一步,就是從網(wǎng)上找文檔,自己動(dòng)手安裝部署一番。官方網(wǎng)站上有一個(gè)中文的安裝手冊(cè)

    雖然對(duì) 分布式 也有一些了解,但是一直沒有深入到代碼去 研究 具體的實(shí)現(xiàn)。在群里咨詢了一下,自己也google了一些資料,最終 決定 從MooseFS入手來深入 研究 分布式 系統(tǒng) 。第一步,就是從網(wǎng)上找文檔,自己動(dòng)手安裝部署一番。官方網(wǎng)站上有一個(gè)中文的安裝手冊(cè)

    雖然對(duì)分布式也有一些了解,但是一直沒有深入到代碼去研究具體的實(shí)現(xiàn)。在群里咨詢了一下,自己也google了一些資料,最終決定從MooseFS入手來深入研究分布式系統(tǒng)。第一步,就是從網(wǎng)上找文檔,自己動(dòng)手安裝部署一番。官方網(wǎng)站上有一個(gè)中文的安裝手冊(cè),非常nice,整個(gè)安裝配置過程也非常順利,感覺還不錯(cuò),就是看它的代碼實(shí)現(xiàn)。看完之后有些失望,在main函數(shù)中的第一個(gè)函數(shù)strerr_init()中看到了這樣的代碼:

    for (n=0 ; errtab[n].str ; n++) {}
    而errtab的定義(部分)如下所示:

    static errent errtab[] = {
    #ifdef E2BIG
    	{E2BIG,"E2BIG (Argument list too long)"},
    #endif
    #ifdef EACCES
    	{EACCES,"EACCES (Permission denied)"},
    #endif
    ......
    	{0,NULL}
    };
    很明顯,那個(gè)循環(huán)僅僅是為了計(jì)算errtab中元素的個(gè)數(shù),而這樣的計(jì)算有必要用一個(gè)循環(huán)么?sizeof不能解決么?我實(shí)現(xiàn)看不出來作者這里要寫一個(gè)循環(huán)的好處是什么?

    另一個(gè)地方讓我感覺作者在寫代碼的時(shí)候很不用心,cfg_reload()在解析配置文件時(shí)定義了一個(gè)緩沖區(qū)linebuff[1000]數(shù)組來存儲(chǔ)每行讀取的內(nèi)容。mfs解析配置文件時(shí)是按行讀取的,每行的配置內(nèi)容類似“key=value"這樣的形式。這個(gè)緩沖區(qū)的長(zhǎng)度定義為1000,也讓我很不解。因?yàn)樵诙x緩沖區(qū)或分配內(nèi)存的時(shí)候,一般都會(huì)考慮到對(duì)齊,都會(huì)對(duì)齊到word size或者CPU cache line的長(zhǎng)度。這里的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);
    	}
    	} 
    這個(gè)APPNAME是在編譯的時(shí)候通過-DAPPNAME=mfsmaster這樣的方式定義的一個(gè)宏,所以這個(gè)宏是必須定義的,否則前面的代碼就沒法運(yùn)行(獲取配置文件名稱)。而且獲取SYSLOG_IDENT配置變量的值是會(huì)指定默認(rèn)值,所以if (logappname[0])這樣的判斷完全多余。如果是在兩個(gè)函數(shù)中,這樣的判斷還說的過去,可是獲取配置變量值的操作和
    判斷僅一個(gè)空行之隔,沒必要到極點(diǎn)了吧。

    拋開這些細(xì)節(jié)性的東西不提,mfs選擇的I/O復(fù)用機(jī)制也讓人不敢恭維。現(xiàn)在需要監(jiān)聽套接字的讀寫事件,毫無疑問首選的eventpoll。如果沒有記錯(cuò)的話,moosefs是07年開始的,這個(gè)時(shí)候內(nèi)核中的eventpoll機(jī)制已經(jīng)很完善了,實(shí)在不懂作者為什么要選用poll()來作為I/O復(fù)用的接口。在繼續(xù)之前,先看一下下面的代碼:

     i = poll(pdesc,ndesc,50);
    	......
    	if (i<0) {
    	if (errno==EAGAIN) {
    	syslog(LOG_WARNING,"poll returned EAGAIN");
    	usleep(100000);
    	continue;
    	}
    	if (errno!=EINTR) {
    	syslog(LOG_WARNING,"poll error: %s",strerr(errno));
    	break;
    	}
    	} else {
    	 ......
    	}
    我不明白在poll()返回-1時(shí),為什么要檢查EAGAIN錯(cuò)誤。查看了man手冊(cè),只有EFAULT、EINTR、EINVAL、ENOMEM錯(cuò)誤,看了一下內(nèi)核代碼,也沒有返回EAGAIN錯(cuò)誤的地方。而且很不明白,為什么在EAGAIN的時(shí)候要調(diào)用usleep()等待100毫秒,不理解!

    最終徹底擊穿我的信心的是matoclserv_gotpacket()函數(shù),這個(gè)函數(shù)通過判斷eptr->registered的值來做不同的三種處理,這三個(gè)代碼塊中很多都是可以合并的。要么給每種處理封裝成一個(gè)函數(shù),要么將這三塊代碼合并成一塊,這樣看著不是更簡(jiǎn)潔么?很多switch-case分支中的處理也不用區(qū)分eptr->registered的值,為什么寫的這么龐大?難道作者在寫的時(shí)候?yàn)榱朔奖悖瑥?fù)制粘貼了一番?反正我是很不理解,這樣的代碼風(fēng)格真是讓我沒辦法看下去,我決定放棄了。我知道半途而廢很不好,本來自己寫代碼風(fēng)格就不好,怕看完之后更偏了,所以果斷放棄!

    下面是matoclserv_gotpacket()函數(shù)的代碼,大家欣賞一下:

    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->registered<100) {	// mounts and new tools
    	if (eptr->sesdata==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;
    	}
    	}
    }

    聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    決定徹底放棄對(duì)MooseFS的研究

    決定徹底放棄對(duì)MooseFS的研究:雖然對(duì) 分布式 也有一些了解,但是一直沒有深入到代碼去 研究 具體的實(shí)現(xiàn)。在群里咨詢了一下,自己也google了一些資料,最終 決定 從MooseFS入手來深入 研究 分布式 系統(tǒng) 。第一步,就是從網(wǎng)上找文檔,自己動(dòng)手安裝部署一番。官方網(wǎng)站上有一個(gè)中文的安裝手冊(cè)
    推薦度:
    標(biāo)簽: 徹底 完全 放棄
    • 熱門焦點(diǎn)

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 国产精品亚洲欧美一区麻豆| 国产精品99久久精品| 亚洲精品高清国产一线久久| 久久国产精品99精品国产987| 亚洲永久精品ww47| 国产人成精品综合欧美成人| 97久久久精品综合88久久| 亚洲精品无码专区2| 国内精品久久久久影院网站 | mm1313亚洲国产精品无码试看| 久久久久无码精品国产不卡| 欧美精品人爱a欧美精品| 隔壁老王国产在线精品| 99精品无人区乱码在线观看| 亚洲国产第一站精品蜜芽| 91精品国产人成网站| 91精品视频观看| 久久国产乱子精品免费女| 国产精品兄妹在线观看麻豆| 亚洲精品无码永久中文字幕 | 国产乱子伦精品无码码专区| 中文无码久久精品| 午夜精品久久影院蜜桃| 精品国产黑色丝袜高跟鞋| 91久久福利国产成人精品| 青青草国产精品| 久久99精品国产麻豆宅宅| 国产2021精品视频免费播放| 国内精品久久久久影院日本 | 国产在线精品一区二区三区不卡| 日本欧美韩国日本精品| 国产精品久久久久9999高清| 国产乱人伦偷精品视频免下载| 久久久久亚洲精品无码蜜桃| 无码人妻精品一区二区三18禁| 亚洲精品网站在线观看不卡无广告| 女人高潮内射99精品| 欧美国产精品久久高清| 久久精品成人免费观看97| 久久久久国产精品三级网| 久久久久99精品成人片|