<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題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關鍵字專題關鍵字專題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
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        決定徹底放棄對MooseFS的研究

        來源:懂視網 責編:小采 時間:2020-11-09 08:22:23
        文檔

        決定徹底放棄對MooseFS的研究

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

        雖然對 分布式 也有一些了解,但是一直沒有深入到代碼去 研究 具體的實現。在群里咨詢了一下,自己也google了一些資料,最終 決定 從MooseFS入手來深入 研究 分布式 系統 。第一步,就是從網上找文檔,自己動手安裝部署一番。官方網站上有一個中文的安裝手冊

        雖然對分布式也有一些了解,但是一直沒有深入到代碼去研究具體的實現。在群里咨詢了一下,自己也google了一些資料,最終決定從MooseFS入手來深入研究分布式系統。第一步,就是從網上找文檔,自己動手安裝部署一番。官方網站上有一個中文的安裝手冊,非常nice,整個安裝配置過程也非常順利,感覺還不錯,就是看它的代碼實現。看完之后有些失望,在main函數中的第一個函數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}
        };
        很明顯,那個循環僅僅是為了計算errtab中元素的個數,而這樣的計算有必要用一個循環么?sizeof不能解決么?我實現看不出來作者這里要寫一個循環的好處是什么?

        另一個地方讓我感覺作者在寫代碼的時候很不用心,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);
        	}
        	} 
        這個APPNAME是在編譯的時候通過-DAPPNAME=mfsmaster這樣的方式定義的一個宏,所以這個宏是必須定義的,否則前面的代碼就沒法運行(獲取配置文件名稱)。而且獲取SYSLOG_IDENT配置變量的值是會指定默認值,所以if (logappname[0])這樣的判斷完全多余。如果是在兩個函數中,這樣的判斷還說的過去,可是獲取配置變量值的操作和
        判斷僅一個空行之隔,沒必要到極點了吧。

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

         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時,為什么要檢查EAGAIN錯誤。查看了man手冊,只有EFAULT、EINTR、EINVAL、ENOMEM錯誤,看了一下內核代碼,也沒有返回EAGAIN錯誤的地方。而且很不明白,為什么在EAGAIN的時候要調用usleep()等待100毫秒,不理解!

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

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

        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;
        	}
        	}
        }

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        決定徹底放棄對MooseFS的研究

        決定徹底放棄對MooseFS的研究:雖然對 分布式 也有一些了解,但是一直沒有深入到代碼去 研究 具體的實現。在群里咨詢了一下,自己也google了一些資料,最終 決定 從MooseFS入手來深入 研究 分布式 系統 。第一步,就是從網上找文檔,自己動手安裝部署一番。官方網站上有一個中文的安裝手冊
        推薦度:
        標簽: 徹底 完全 放棄
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 中文字幕成人免费高清在线| 亚洲av午夜福利精品一区| 亚洲AV一二三区成人影片| 精品亚洲永久免费精品| 亚洲成av人片在线观看无码不卡| 一区二区三区视频免费观看| 亚洲第一页日韩专区| 久久综合亚洲色hezyo| 国产免费69成人精品视频| 亚洲av中文无码字幕色不卡| 色www永久免费视频| 国产成人亚洲综合无| 亚洲人成电影在线播放| 99视频免费在线观看| 亚洲人成网址在线观看| 1024免费福利永久观看网站| 亚洲 欧洲 日韩 综合在线| 午夜一区二区免费视频| 免费看美女午夜大片| 亚洲午夜国产精品无码| 免费一区二区无码东京热| 亚洲黄色片在线观看| 成人免费午夜视频| 成人免费网站视频www| 亚洲韩国精品无码一区二区三区| 精品无码无人网站免费视频| 亚洲首页国产精品丝袜| 亚洲国产香蕉人人爽成AV片久久 | 亚洲精品NV久久久久久久久久| 一级全免费视频播放| 亚洲日本一区二区三区| 成人免费看黄20分钟| 男女一进一出抽搐免费视频 | 成全视频免费观看在线看| 亚洲成aⅴ人片在线影院八| 日韩免费视频网站| 最新久久免费视频| 在线亚洲午夜片AV大片| 久久精品亚洲福利| 精品国产污污免费网站aⅴ| 老妇激情毛片免费|