diff options
author | Steve Slaven <bpk@hoopajoo.net> | 2009-08-06 23:23:10 (GMT) |
---|---|---|
committer | Steve Slaven <bpk@hoopajoo.net> | 2009-08-06 23:23:10 (GMT) |
commit | 48c3c17f734f2e548b6c8d0d75a0060306a75ee6 (patch) | |
tree | f4829510a82181fb62c7f324859a6cc18ca1ec60 /FuseArchive/Storage/FileSystem.py | |
parent | 2a98d3391ca347317284347e5cd1c3ecbadc3d7e (diff) | |
download | fusearchive-48c3c17f734f2e548b6c8d0d75a0060306a75ee6.zip fusearchive-48c3c17f734f2e548b6c8d0d75a0060306a75ee6.tar.gz fusearchive-48c3c17f734f2e548b6c8d0d75a0060306a75ee6.tar.bz2 |
Add reference counting so we can delete unused chunks
Diffstat (limited to 'FuseArchive/Storage/FileSystem.py')
-rw-r--r-- | FuseArchive/Storage/FileSystem.py | 58 |
1 files changed, 44 insertions, 14 deletions
diff --git a/FuseArchive/Storage/FileSystem.py b/FuseArchive/Storage/FileSystem.py index a6687b5..04c6bb9 100644 --- a/FuseArchive/Storage/FileSystem.py +++ b/FuseArchive/Storage/FileSystem.py @@ -4,6 +4,47 @@ from FuseArchive.Chunk import Chunk magic_depth = 5 +def inc_chunk( key, count ): + # Increment this chunk header reference + path = _key_to_path( key ) + logging.debug( "Updating header on %s, ref count + %d" % ( path, count ) ) + f = open( path, "r+" ) + data = f.read( Chunk.header_length() ) + newcount, data = Chunk.inc_header_ref( data, count ) + f.seek( 0 ) + f.write( data ) + f.close() + logging.debug( "Count is now: %d" % newcount ) + + assert newcount >= 0, "Count is negative?!!" + + if newcount == 0: + logging.debug( "Freeing chunk" ) + os.unlink( path ) + +def lock_chunk( key ): + inc_chunk( key, 1 ) + +def unlock_chunk( key ): + inc_chunk( key, -1 ) + +def _key_to_path( key ): + logging.debug( "Converting key to path" ) + ( thash, seq ) = key + chars = list( thash ) + logging.debug( chars ) + + # Todo: make a digest -> path function to share with deflate + hexdigest = ''.join( [ "%02x" % ord( x ) for x in chars ] ) + logging.debug( "Hash is: %s sub %d" % ( hexdigest, seq ) ) + subparts = [ "%02x" % ord( x ) for x in chars[ :magic_depth ] ] + subpath = '/'.join( subparts ) + logging.debug( "Subpath: " + subpath ) + + subpath += "/%s_%d" % ( hexdigest, seq ) + return( "./storage/" + subpath ) + + # This will write out a data block, it will return a key that can get this # data back later def save_chunk( chunk ): @@ -77,26 +118,15 @@ def load_chunk( key ): if FuseArchive.magic_profiling: return '' - ( thash, seq ) = key logging.debug( "Begin load_chunk" ) - chars = list( thash ) - logging.debug( chars ) - - # Todo: make a digest -> path function to share with deflate - hexdigest = ''.join( [ "%02x" % ord( x ) for x in chars ] ) - logging.debug( "Hash is: %s sub %d" % ( hexdigest, seq ) ) - subparts = [ "%02x" % ord( x ) for x in chars[ :magic_depth ] ] - subpath = '/'.join( subparts ) - logging.debug( "Subpath: " + subpath ) - - subpath += "/%s_%d" % ( hexdigest, seq ) + subpath = _key_to_path( key ) logging.debug( "Chunk path: " + subpath ) - if os.path.exists( "./storage/" + subpath ): + if os.path.exists( subpath ): logging.debug( "Exporting chunk" ) - readchunk = open( "./storage/" + subpath ) + readchunk = open( subpath ) chunk = Chunk.deserialize( readchunk.read() ).chunk readchunk.close() else: |