Date: Tue, 25 May 2004 13:38:57 -0500 From: Dan Nelson <dnelson@allantgroup.com> To: Jason DiCioccio <jd@ods.org> Cc: freebsd-questions@freebsd.org Subject: Re: Question regarding reported directory sizes. Message-ID: <20040525183856.GN75036@dan.emsphone.com> In-Reply-To: <DBA76E45D93EA7C22D2BCDCB@[10.102.0.67]> References: <A4758F237E80785AEBADF883@[10.102.0.67]> <20040525154242.GL75036@dan.emsphone.com> <DBA76E45D93EA7C22D2BCDCB@[10.102.0.67]>
next in thread | previous in thread | raw e-mail | index | archive | help
In the last episode (May 25), Jason DiCioccio said: > <dnelson@allantgroup.com> wrote: > >In the last episode (May 25), Jason DiCioccio said: > >>I have a very large directory (say, a mail spool) whose directory entry > >>is approx 606K.. > >>drwx------ 5 cyrus cyrus 606208 May 25 10:29 . > >> > >>Now.. That directory had a lot of files in it. However, after > >>deleting all of the files in that directory, the directory entry's > >>size stays the same. I realize this is fairly unimportant, however > >>is there a way to 'garbage collect' that directory entry and all > >>others like it? > > > >Create another file in the directory, and you'll see it shrink down. > >The truncation code is in the file create codepath, not the delete > >one (which means it's not constantly trying to shrink the directory > >as you delete files). > > Thanks Dan.. However, this does not appear to be happening... I > could of course create a new directory and move everything into it as > was suggested earlier. However, this is more of a curiosity thing > than anything.. I'm wondering if at any point the entry does become > truncated, because it hasn't happened yet, even after the creation of > files. Your first post said you deleted all the files, but your second post mentions "move everything into it". The kernel can only truncate the directory past the last filename. If you happen to have an existing file in there that's sitting at the 600k mark in the directory, then that's as small as the directory can get. Run this script in a test directory to see it in action. Put the script itself someplace so it doesn't affect the dir sizes: #! /bin/sh echo Creating 1000 files for i in `jot 1000 10000` ; do touch $i ; done ls -ld . echo Deleting 999 files, leaving file 10500 for i in `jot 500 10000` `jot 499 10501` ; do rm $i ; done ls -ld . echo Creating 1 file. Directory should shrink by 50% touch 10000 ; ls -ld . echo Deleting last file rm 10500 ; ls -ld . echo Creating another file. Directory should shrink to one frag touch 10001 ; ls -ld . rm 10000 10001 -- Dan Nelson dnelson@allantgroup.com
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20040525183856.GN75036>