Exemple #1
0
    def write(self, path, data, offset, fh):
#        print "Writing", data, path, offset, fh
        meta = getmetadata(path)
        dblocks = meta['blocks']

        whichblock = offset / BLOCKSIZE
        whereinblock = offset % BLOCKSIZE


        if whichblock >= len(dblocks):
            curblock = ""
        else:
            curblock = getblock(dblocks[whichblock])


        datalen = min(len(data), BLOCKSIZE) #only write one block at a time
        data = data[:datalen] #truncate data that can't be written

        curblock = curblock[:offset] + data + curblock[offset + datalen:]
        

        blockname = nameblock(curblock)

        putblock(blockname, curblock) #store the new block

        #now update the metadata
        if whichblock < len(dblocks):
            dblocks[whichblock] = blockname
        else:
            #new block, need to update the size
            sze = BLOCKSIZE * len(dblocks) #how many full blocks do we have?
            sze += len(curblock) #add in the length of the current block
            
            #New block, update size
            dblocks += [blockname]

            meta['st_size'] = sze


        meta['blocks'] = dblocks
        setmetadata(path, meta)

        return min(len(data), BLOCKSIZE)
Exemple #2
0
    def truncate(self, path, length, fh=None):
        #truncate path to length bytes
        meta = getmetadata(path)
        dblocks = meta['blocks']
        
        numblocks = length / BLOCKSIZE
        lastblocklen = length % BLOCKSIZE

        dblocks = dblocks[:numblocks]

        if len(dblocks) == 0:
            meta['blocks'] = dblocks
            setmetadata(path, meta)
            return

        lastblock = getblock(dblocks[-1])
        lastblock = lastblock[:lastblocklen]
        
        blockname = nameblock[block]
        putblock(blockname, lastblock)
        dblocks[-1] = blockname

        meta['blocks'] = dblocks
        setmetadata(path, meta)
Exemple #3
0
def setmetadata(path, meta):
#    print "Setting", path, "metadata to", meta
    putblock('METADATA=' + path,  simplejson.dumps(meta))