예제 #1
0
파일: embr.py 프로젝트: ialzuru/ncfs
def decodeFile(setting, metadata, mode):
    '''Decode chunks into original file.'''
    n = metadata.totalnode
    k = metadata.datanode
    nativeBlockNum = embrutil.getNativeBlockNum(n, k)
    parityBlockNum = embrutil.getParityBlockNum(n, k)
    authenticNum = nativeBlockNum + parityBlockNum
    if setting.healthynode >= setting.totalnode-1:
        dest = setting.mirrordir + '/' + metadata.filename
        src = []
        for i in range(nativeBlockNum):
            chunkname = setting.chunkdir + '/' + metadata.filename + '.chunk' + str(i) 
            src.append(chunkname)
        if mode == 'download':
            codingutil.join(src, dest, metadata.filesize)
    elif setting.healthynode >= metadata.datanode:
        #Case of two or more node failure:
        dest = setting.mirrordir + '/' + metadata.filename
        n = int(metadata.totalchunk/2)
        k = nativeBlockNum
        src = []
        blocknums = []
        chunklist = []
        failedchunks = []
        failedchunktype = []
        for i in range(int(metadata.totalchunk/2)):
            chunkname = setting.chunkdir + '/' + metadata.filename + '.chunk' + str(i)
            chunktype = metadata.chunkInfo[i].chunktype
            authenticChunkAction = metadata.chunkInfo[i].action
            replicaChunkAction = metadata.chunkInfo[i+authenticNum].action
            chunklist.append(chunkname)
            if authenticChunkAction == 'sos' and replicaChunkAction == 'sos':
                failedchunktype.append(chunktype)
                failedchunks.append(i)
            elif authenticChunkAction == 'download' or replicaChunkAction == 'download':
                src.append(chunkname)
                blocknums.append(i)

        if mode == 'download' and ('native' not in failedchunktype):
            codingutil.join(src, dest, metadata.filesize)
        elif mode == 'download' and ('native' in failedchunktype):
            codingutil.ecDecodeFile(n, k, src, blocknums, dest, metadata.filesize, setting)
        elif mode == 'repair' and ('native' in failedchunktype):
            codingutil.ecDecodeChunks(n, k, src, blocknums, chunklist, setting, failed=failedchunks)
        elif mode == 'repair':
            codingutil.ecDecodeChunks(n, k, src, blocknums, chunklist, setting, failed=failedchunks, nativeFailed=False)
        else:
            return False

        return True
    else:
        return False
예제 #2
0
파일: parityrs.py 프로젝트: ialzuru/ncfs
def decodeFile(setting, metadata, mode):
    '''Decode chunks into original file.'''
    if setting.healthynode == setting.totalnode:
        #Case of no failure:
        dest = setting.mirrordir + '/' + metadata.filename
        src = []
        for i in range(metadata.datanode):
            chunkname = setting.chunkdir + '/' + metadata.filename + '.node' + str(i)
            src.append(chunkname)
        codingutil.join(src, dest, metadata.filesize)

    elif setting.healthynode >= metadata.datanode:
        #Case of one-node or two-node failure:
        dest = setting.mirrordir + '/' + metadata.filename
        n = metadata.totalnode
        k = metadata.datanode
        src = []
        blocknums = []
        chunklist = []
        failedchunks = []
        failedchunkname = []
        failedchunktype = []
        for i in range(metadata.totalchunk):
            nodeid = metadata.chunkInfo[i].nodeid
            chunkname = setting.chunkdir + '/' + metadata.filename + '.node' + str(i)
            chunktype = metadata.chunkInfo[i].chunktype
            chunklist.append(chunkname)
            if metadata.chunkInfo[i].action == 'download':
                src.append(chunkname)
                blocknums.append(i)
            else:
                failedchunkname.append(chunkname)
                failedchunktype.append(chunktype)
                if metadata.chunkInfo[i].action == 'sos':
                    failedchunks.append(i)

        if mode == 'download' and ('native' not in failedchunktype):
            codingutil.join(src, dest, metadata.filesize)
        elif mode == 'download' and ('native' in failedchunktype):
            codingutil.ecDecodeFile(n, k, src, blocknums, dest, metadata.filesize, setting)
        elif mode == 'repair' and ('native' in failedchunktype):
            codingutil.ecDecodeChunks(n, k, src, blocknums, chunklist, setting, failed=failedchunks)
        elif mode == 'repair':
            codingutil.ecDecodeChunks(n, k, src, blocknums, chunklist, setting, failed=failedchunks, nativeFailed=False)
        else:
            return False

        return True
    else:
        return False
예제 #3
0
def decodeFile(setting, metadata, mode):
    '''Decode chunks into original file.'''
    n = metadata.totalnode
    k = metadata.datanode
    nativeBlockNum = embrutil.getNativeBlockNum(n, k)
    parityBlockNum = embrutil.getParityBlockNum(n, k)
    authenticNum = nativeBlockNum + parityBlockNum
    if setting.healthynode >= setting.totalnode - 1:
        dest = setting.mirrordir + '/' + metadata.filename
        src = []
        for i in range(nativeBlockNum):
            chunkname = setting.chunkdir + '/' + metadata.filename + '.chunk' + str(
                i)
            src.append(chunkname)
        if mode == 'download':
            codingutil.join(src, dest, metadata.filesize)
    elif setting.healthynode >= metadata.datanode:
        #Case of two or more node failure:
        dest = setting.mirrordir + '/' + metadata.filename
        n = int(metadata.totalchunk / 2)
        k = nativeBlockNum
        src = []
        blocknums = []
        chunklist = []
        failedchunks = []
        failedchunktype = []
        for i in range(int(metadata.totalchunk / 2)):
            chunkname = setting.chunkdir + '/' + metadata.filename + '.chunk' + str(
                i)
            chunktype = metadata.chunkInfo[i].chunktype
            authenticChunkAction = metadata.chunkInfo[i].action
            replicaChunkAction = metadata.chunkInfo[i + authenticNum].action
            chunklist.append(chunkname)
            if authenticChunkAction == 'sos' and replicaChunkAction == 'sos':
                failedchunktype.append(chunktype)
                failedchunks.append(i)
            elif authenticChunkAction == 'download' or replicaChunkAction == 'download':
                src.append(chunkname)
                blocknums.append(i)

        if mode == 'download' and ('native' not in failedchunktype):
            codingutil.join(src, dest, metadata.filesize)
        elif mode == 'download' and ('native' in failedchunktype):
            codingutil.ecDecodeFile(n, k, src, blocknums, dest,
                                    metadata.filesize, setting)
        elif mode == 'repair' and ('native' in failedchunktype):
            codingutil.ecDecodeChunks(n,
                                      k,
                                      src,
                                      blocknums,
                                      chunklist,
                                      setting,
                                      failed=failedchunks)
        elif mode == 'repair':
            codingutil.ecDecodeChunks(n,
                                      k,
                                      src,
                                      blocknums,
                                      chunklist,
                                      setting,
                                      failed=failedchunks,
                                      nativeFailed=False)
        else:
            return False

        return True
    else:
        return False
예제 #4
0
def decodeFile(setting, metadata, mode):
    '''Decode chunks into original file.'''
    if setting.healthynode == setting.totalnode:
        #Case of no failure:
        dest = setting.mirrordir + '/' + metadata.filename
        src = []
        for i in range(metadata.datanode):
            chunkname = setting.chunkdir + '/' + metadata.filename + '.node' + str(
                i)
            src.append(chunkname)
        codingutil.join(src, dest, metadata.filesize)

    elif setting.healthynode >= metadata.datanode:
        #Case of one-node or two-node failure:
        dest = setting.mirrordir + '/' + metadata.filename
        n = metadata.totalnode
        k = metadata.datanode
        src = []
        blocknums = []
        chunklist = []
        failedchunks = []
        failedchunkname = []
        failedchunktype = []
        for i in range(metadata.totalchunk):
            nodeid = metadata.chunkInfo[i].nodeid
            chunkname = setting.chunkdir + '/' + metadata.filename + '.node' + str(
                i)
            chunktype = metadata.chunkInfo[i].chunktype
            chunklist.append(chunkname)
            if metadata.chunkInfo[i].action == 'download':
                src.append(chunkname)
                blocknums.append(i)
            else:
                failedchunkname.append(chunkname)
                failedchunktype.append(chunktype)
                if metadata.chunkInfo[i].action == 'sos':
                    failedchunks.append(i)

        if mode == 'download' and ('native' not in failedchunktype):
            codingutil.join(src, dest, metadata.filesize)
        elif mode == 'download' and ('native' in failedchunktype):
            codingutil.ecDecodeFile(n, k, src, blocknums, dest,
                                    metadata.filesize, setting)
        elif mode == 'repair' and ('native' in failedchunktype):
            codingutil.ecDecodeChunks(n,
                                      k,
                                      src,
                                      blocknums,
                                      chunklist,
                                      setting,
                                      failed=failedchunks)
        elif mode == 'repair':
            codingutil.ecDecodeChunks(n,
                                      k,
                                      src,
                                      blocknums,
                                      chunklist,
                                      setting,
                                      failed=failedchunks,
                                      nativeFailed=False)
        else:
            return False

        return True
    else:
        return False