glusterfs存储池用完




       在glusterfs存储池里创建文件时,在选择向哪个子卷上创建之前(在函数dht_mknod、dht_create或dht_mkdir里)会调用dht_get_du_info(使用statvfs)获取各个子卷的剩余空间和可用inode数量。
     在dht_create和dht_mknod中,调用dht_subvol_get_hashed函数根据要创建的文件的名字找到此文件hash值所处的subvol子卷,然后调用dht_is_subvol_filled判断subvol子卷是否已满,判断方法为:如果subvol子卷的剩余空间百分比小于min-free-disk,或者剩余inode数量百分比小于min-free-inodes,则认为subvol子卷已满(其中min-free-inodes参数表示未使用的inode数目占总共可用的inode数目的百分比,默认值为5%
,min-free-disk参数表示剩余磁盘空间占总磁盘空间的百分比,默认值为10%)。
根据subvol子卷是否已满,可以分为以下两种情况:
   1. 如果subvol子卷未满
              直接在这个子卷上创建文件。
   2. 如果subvol子卷已满

      调用dht_free_disk_available_subvol函数从所有子卷中获取一个最优的子卷avail_subvol,最优的条件为:如果子卷中有未满的,就从这些未满的中间选择一个剩余inode数目占 比最大的或剩余空间百分比最大的子卷;否则,就选择一个剩余空间百分比最大并且剩余inode数目不为0的子卷。
      如果找到最优的子卷avail_subvol,且不为subvol,则调用mknod以S_IFREG | S_ISVTX模式在subvol子卷中创建文件,创建成功后,调用create在avail_subvol子卷上创建文件,然后用avail_subvol子卷上创建的文件的属性设置subvol子卷中创建的文件,变成它的硬链接(inode 号相同)。
      如果找不到最优的子卷avail_subvol,则用create在subvol子卷中创建文件。


    由上面可以得出,如果某子卷没有空间或可用的inode,并且若创建的文件刚好在此子卷中,那么文件是创建不成功的。 因此,存储池中要预留一定的空间,保证每个子卷上都有可用空间和可用的inode。





猜你喜欢

转载自blog.csdn.net/qq_38918259/article/details/80704495