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
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
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
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