def testGetLayout(t, env): """Verify layout handling FLAGS: pnfs CODE: GETLAYOUT1 """ sess = env.c1.new_pnfs_client_session(env.testname(t)) blocksize = get_blocksize(sess, use_obj(env.opts.path)) # Create the file res = create_file(sess, env.testname(t)) check(res) # Get layout fh = res.resarray[-1].object open_stateid = res.resarray[-2].stateid ops = [op.putfh(fh), op.layoutget(False, LAYOUT4_BLOCK_VOLUME, LAYOUTIOMODE4_READ, 0, 0xffffffffffffffff, 4*blocksize, open_stateid, 0xffff)] res = sess.compound(ops) check(res) # Parse opaque for layout in res.resarray[-1].logr_layout: if layout.loc_type == LAYOUT4_BLOCK_VOLUME: p = BlockUnpacker(layout.loc_body) opaque = p.unpack_pnfs_block_layout4() p.done() print(opaque)
def testEmptyCommit(t, env): """Check for proper handling of empty LAYOUTCOMMIT. FLAGS: block CODE: BLOCK3 """ sess = env.c1.new_pnfs_client_session(env.testname(t)) # Create the file res = create_file(sess, env.testname(t)) check(res) # Get layout 1 fh = res.resarray[-1].object open_stateid = res.resarray[-2].stateid print open_stateid ops = [op.putfh(fh), op.layoutget(False, LAYOUT4_BLOCK_VOLUME, LAYOUTIOMODE4_RW, 0, 8192, 8192, open_stateid, 0xffff)] res = sess.compound(ops) check(res) # Get layout 2 lo_stateid1 = res.resarray[-1].logr_stateid print lo_stateid1 ops = [op.putfh(fh), op.layoutget(False, LAYOUT4_BLOCK_VOLUME, LAYOUTIOMODE4_RW, 8192, 8192, 8192, lo_stateid1, 0xffff)] res = sess.compound(ops) check(res) lo_stateid2 = res.resarray[-1].logr_stateid print lo_stateid2 # Parse opaque to get info for commit # STUB not very general layout = res.resarray[-1].logr_layout[-1] p = BlockUnpacker(layout.loc_body) opaque = p.unpack_pnfs_block_layout4() p.done() extent = opaque.blo_extents[-1] extent.bex_state = PNFS_BLOCK_READWRITE_DATA p = BlockPacker() p.pack_pnfs_block_layoutupdate4(pnfs_block_layoutupdate4([extent])) time = newtime4(True, get_nfstime()) ops = [op.putfh(fh), op.layoutcommit(extent.bex_file_offset, extent.bex_length, False, lo_stateid2, newoffset4(True, 2 * 8192 - 1), time, layoutupdate4(LAYOUT4_BLOCK_VOLUME, p.get_buffer()))] res = sess.compound(ops) check(res) # Send another LAYOUTCOMMIT, with an empty opaque time = newtime4(True, get_nfstime()) ops = [op.putfh(fh), op.layoutcommit(extent.bex_file_offset, extent.bex_length, False, lo_stateid2, newoffset4(True, 2 * 8192 - 1), time, layoutupdate4(LAYOUT4_BLOCK_VOLUME, ""))] res = sess.compound(ops) check(res)
def testGetDevInfo(t, env): """Check devlist FLAGS: pnfs DEPEND: GETDLIST1 CODE: GETDINFO1 """ sess = env.c1.new_pnfs_client_session(env.testname(t)) # Test that fs handles block layouts ops = use_obj(env.opts.path) + [op.getattr(1<<FATTR4_FS_LAYOUT_TYPES)] res = sess.compound(ops) check(res) if FATTR4_FS_LAYOUT_TYPES not in res.resarray[-1].obj_attributes: fail("fs_layout_type not available") for lo_type in res.resarray[-1].obj_attributes[FATTR4_FS_LAYOUT_TYPES]: # Send GETDEVICELIST lo_type = LAYOUT4_BLOCK_VOLUME ops = use_obj(env.opts.path) + [op.getdevicelist(lo_type, 0xffffffff, 0, "")] res = sess.compound(ops) check(res) dev_list = res.resarray[-1].gdlr_deviceid_list p = BlockUnpacker("") for dev_id in dev_list: ops = use_obj(env.opts.path) + [op.getdeviceinfo(dev_id, lo_type, 0xffffffff, 0)] res = sess.compound(ops) check(res) if lo_type==LAYOUT4_BLOCK_VOLUME: p.reset(res.resarray[-1].da_addr_body) decode = p.unpack_pnfs_block_deviceaddr4() p.done() print(decode)
def testEMCGetLayout(t, env): """Verify layout handling Debugging test that looks for pre-existing file (server2fs1/dump.eth) so we don't have to worry about creating a file. FLAGS: CODE: GETLAYOUT100 """ sess = env.c1.new_pnfs_client_session(env.testname(t)) blocksize = get_blocksize(sess, use_obj(env.opts.path)) # Create the file file = ["server2fs1", "dump.eth"] res = open_file(sess, env.testname(t), file) check(res) # Get layout fh = res.resarray[-1].object stateid = res.resarray[-2].stateid stateid.seqid = 0 ops = [op.putfh(fh), op.layoutget(False, LAYOUT4_BLOCK_VOLUME, LAYOUTIOMODE4_READ, 0, 0xffffffffffffffff, 4*blocksize, stateid, 0xffff)] res = sess.compound(ops) check(res) # Parse opaque for layout in res.resarray[-1].logr_layout: if layout.loc_type == LAYOUT4_BLOCK_VOLUME: p = BlockUnpacker(layout.loc_body) opaque = p.unpack_pnfs_block_layout4() p.done() print(opaque)
def testGetDevInfo(t, env): """Check devlist FLAGS: pnfs DEPEND: GETDLIST1 CODE: GETDINFO1 """ # Make sure E_ID returns MDS capabilities c1 = env.c1.new_client(env.testname(t), flags=EXCHGID4_FLAG_USE_PNFS_MDS) if not c1.flags & EXCHGID4_FLAG_USE_PNFS_MDS: fail("Server did not set EXCHGID4_FLAG_USE_PNFS_MDS") sess = c1.create_session() # Test that fs handles block layouts ops = use_obj(env.opts.path) + [op.getattr(1<<FATTR4_FS_LAYOUT_TYPES)] res = sess.compound(ops) check(res) if FATTR4_FS_LAYOUT_TYPES not in res.resarray[-1].obj_attributes: fail("fs_layout_type not available") for lo_type in res.resarray[-1].obj_attributes[FATTR4_FS_LAYOUT_TYPES]: # Send GETDEVICELIST lo_type = LAYOUT4_BLOCK_VOLUME ops = use_obj(env.opts.path) + [op.getdevicelist(lo_type, 0xffffffff, 0, "")] res = sess.compound(ops) check(res) dev_list = res.resarray[-1].gdlr_deviceid_list p = BlockUnpacker("") for dev_id in dev_list: ops = use_obj(env.opts.path) + [op.getdeviceinfo(dev_id, lo_type, 0xffffffff, 0)] res = sess.compound(ops) check(res) if lo_type==LAYOUT4_BLOCK_VOLUME: p.reset(res.resarray[-1].da_addr_body) decode = p.unpack_pnfs_block_deviceaddr4() p.done() print decode
def testStateid2(t, env): """Check for proper sequence handling in layout stateids. FLAGS: block CODE: BLOCK2 """ sess = env.c1.new_pnfs_client_session(env.testname(t)) # Create the file res = create_file(sess, env.testname(t)) check(res) # Get layout 1 fh = res.resarray[-1].object open_stateid = res.resarray[-2].stateid print open_stateid ops = [op.putfh(fh), op.layoutget(False, LAYOUT4_BLOCK_VOLUME, LAYOUTIOMODE4_RW, 0, 8192, 8192, open_stateid, 0xffff)] res = sess.compound(ops) check(res) # Get layout 2 lo_stateid1 = res.resarray[-1].logr_stateid print lo_stateid1 ops = [op.putfh(fh), op.layoutget(False, LAYOUT4_BLOCK_VOLUME, LAYOUTIOMODE4_RW, 8192, 8192, 8192, lo_stateid1, 0xffff)] res = sess.compound(ops) check(res) # Get layout 3 (merge of prior two) lo_stateid2 = res.resarray[-1].logr_stateid print lo_stateid2 ops = [op.putfh(fh), op.layoutget(False, LAYOUT4_BLOCK_VOLUME, LAYOUTIOMODE4_RW, 0, 2*8192, 2*8192, lo_stateid2, 0xffff)] res = sess.compound(ops) check(res) lo_stateid3 = res.resarray[-1].logr_stateid print lo_stateid3 # lo_stateid3.seqid = 3 # BUG - work around emc problem # Parse opaque to get info for commit # STUB not very general layout = res.resarray[-1].logr_layout[-1] p = BlockUnpacker(layout.loc_body) opaque = p.unpack_pnfs_block_layout4() p.done() extent = opaque.blo_extents[-1] extent.bex_state = PNFS_BLOCK_READWRITE_DATA p = BlockPacker() p.pack_pnfs_block_layoutupdate4(pnfs_block_layoutupdate4([extent])) time = newtime4(True, get_nfstime()) ops = [op.putfh(fh), op.layoutcommit(extent.bex_file_offset, extent.bex_length, False, lo_stateid3, newoffset4(True, 2 * 8192 - 1), time, layoutupdate4(LAYOUT4_BLOCK_VOLUME, p.get_buffer()))] res = sess.compound(ops) check(res)
def testLayoutCommit(t, env): """ Do some commits FLAGS: pnfs CODE: LAYOUTCOMMIT1 """ sess = env.c1.new_pnfs_client_session(env.testname(t)) blocksize = get_blocksize(sess, use_obj(env.opts.path)) # Create the file res = create_file(sess, env.testname(t)) check(res) # Get layout fh = res.resarray[-1].object open_stateid = res.resarray[-2].stateid ops = [op.putfh(fh), op.layoutget(False, LAYOUT4_BLOCK_VOLUME, LAYOUTIOMODE4_RW, 0, 4*blocksize, 4*blocksize, open_stateid, 0xffff)] res = sess.compound(ops) check(res) layout_stateid = res.resarray[-1].logr_stateid # Parse opaque for layout in res.resarray[-1].logr_layout: if layout.loc_type != LAYOUT4_BLOCK_VOLUME: fail("Did not get Block layout") p = BlockUnpacker(layout.loc_body) opaque = p.unpack_pnfs_block_layout4() p.done() print(opaque) final_extent = opaque.blo_extents[-1] print(final_extent) if final_extent.bex_state != PNFS_BLOCK_INVALID_DATA: fail("Expected INVALID_DATA in extent") # LAYOUTCOMMIT final_extent.bex_state = PNFS_BLOCK_READWRITE_DATA p = BlockPacker() p.pack_pnfs_block_layoutupdate4(pnfs_block_layoutupdate4([final_extent])) notime = newtime4(False) ops = [op.putfh(fh), op.layoutcommit(final_extent.bex_file_offset, final_extent.bex_length, False, layout_stateid, newoffset4(True, 4 * blocksize - 1), notime, layoutupdate4(LAYOUT4_BLOCK_VOLUME, p.get_buffer()))] res = sess.compound(ops) check(res) print(res)
def testSplitCommit(t, env): """Check for proper handling of disjoint LAYOUTCOMMIT.opaque FLAGS: block CODE: BLOCK4 """ sess = env.c1.new_client_session(env.testname(t), flags=EXCHGID4_FLAG_USE_PNFS_MDS) # Create the file res = create_file(sess, env.testname(t)) check(res) # Get layout 1 fh = res.resarray[-1].object open_stateid = res.resarray[-2].stateid print open_stateid ops = [ op.putfh(fh), op.layoutget(False, LAYOUT4_BLOCK_VOLUME, LAYOUTIOMODE4_RW, 0, 2 * 8192, 2 * 8192, open_stateid, 0xffff) ] res = sess.compound(ops) check(res) lo_stateid1 = res.resarray[-1].logr_stateid print lo_stateid1 # Parse opaque to get info for commit # STUB not very general layout = res.resarray[-1].logr_layout[-1] p = BlockUnpacker(layout.loc_body) opaque = p.unpack_pnfs_block_layout4() p.done() dev = opaque.blo_extents[-1].bex_vol_id extent1 = pnfs_block_extent4(dev, 0, 8192, 0, PNFS_BLOCK_READWRITE_DATA) extent2 = pnfs_block_extent4(dev, 8192, 8192, 0, PNFS_BLOCK_READWRITE_DATA) p = BlockPacker() p.pack_pnfs_block_layoutupdate4( pnfs_block_layoutupdate4([extent1, extent2])) time = newtime4(True, get_nfstime()) ops = [ op.putfh(fh), op.layoutcommit(0, 2 * 8192, False, lo_stateid1, newoffset4(True, 2 * 8192 - 1), time, layoutupdate4(LAYOUT4_BLOCK_VOLUME, p.get_buffer())) ] res = sess.compound(ops) check(res)
def testEMCGetLayout(t, env): """Verify layout handling Debugging test that looks for pre-existing file (server2fs1/dump.eth) so we don't have to worry about creating a file. FLAGS: CODE: GETLAYOUT100 """ # Make sure E_ID returns MDS capabilities c1 = env.c1.new_client(env.testname(t), flags=EXCHGID4_FLAG_USE_PNFS_MDS) if not c1.flags & EXCHGID4_FLAG_USE_PNFS_MDS: fail("Server can not be used as pnfs metadata server") sess = c1.create_session() # Test that fs handles block layouts ops = use_obj(env.opts.path) + [op.getattr(1 << FATTR4_FS_LAYOUT_TYPE)] res = sess.compound(ops) check(res) if FATTR4_FS_LAYOUT_TYPE not in res.resarray[-1].obj_attributes: fail("fs_layout_type not available") if LAYOUT4_BLOCK_VOLUME not in res.resarray[-1].obj_attributes[ FATTR4_FS_LAYOUT_TYPE]: fail("layout_type does not contain BLOCK") # Create the file file = ["server2fs1", "dump.eth"] res = open_file(sess, env.testname(t), file) check(res) # Get layout fh = res.resarray[-1].object stateid = res.resarray[-2].stateid stateid.seqid = 0 ops = [ op.putfh(fh), op.layoutget(False, LAYOUT4_BLOCK_VOLUME, LAYOUTIOMODE4_READ, 0, 0xffffffffffffffff, 0, stateid, 0xffff) ] res = sess.compound(ops) check(res) # Parse opaque for layout in res.resarray[-1].logr_layout: if layout.loc_type == LAYOUT4_BLOCK_VOLUME: p = BlockUnpacker(layout.loc_body) opaque = p.unpack_pnfs_block_layout4() p.done() print opaque
def testLayoutCommit(t, env): """ Do some commits FLAGS: layoutcommit all CODE: LAYOUTCOMMIT1 """ # Make sure E_ID returns MDS capabilities c1 = env.c1.new_client(env.testname(t), flags=EXCHGID4_FLAG_USE_PNFS_MDS) if not c1.flags & EXCHGID4_FLAG_USE_PNFS_MDS: fail("Server can not be used as pnfs metadata server") sess = c1.create_session() # Test that fs handles block layouts ops = use_obj(env.opts.path) + [ op.getattr(1 << FATTR4_FS_LAYOUT_TYPE | 1 << FATTR4_LAYOUT_BLKSIZE) ] res = sess.compound(ops) check(res) attrdict = res.resarray[-1].obj_attributes if FATTR4_FS_LAYOUT_TYPE not in attrdict: fail("fs_layout_type not available") if LAYOUT4_BLOCK_VOLUME not in attrdict[FATTR4_FS_LAYOUT_TYPE]: fail("layout_type does not contain BLOCK") blocksize = attrdict[FATTR4_LAYOUT_BLKSIZE] # Create the file res = create_file(sess, env.testname(t)) check(res) # Get layout fh = res.resarray[-1].object open_stateid = res.resarray[-2].stateid ops = [ op.putfh(fh), op.layoutget(False, LAYOUT4_BLOCK_VOLUME, LAYOUTIOMODE4_RW, 0, 4 * blocksize, 4 * blocksize, open_stateid, 0xffff) ] res = sess.compound(ops) check(res) layout_stateid = res.resarray[-1].logr_stateid # Parse opaque for layout in res.resarray[-1].logr_layout: if layout.loc_type != LAYOUT4_BLOCK_VOLUME: fail("Did not get Block layout") p = BlockUnpacker(layout.loc_body) opaque = p.unpack_pnfs_block_layout4() p.done() print opaque final_extent = opaque.blo_extents[-1] print final_extent if final_extent.bex_state != PNFS_BLOCK_INVALID_DATA: fail("Expected INVALID_DATA in extent") # LAYOUTCOMMIT final_extent.bex_state = PNFS_BLOCK_READWRITE_DATA p = BlockPacker() p.pack_pnfs_block_layoutupdate4(pnfs_block_layoutupdate4([final_extent])) notime = newtime4(False) ops = [ op.putfh(fh), op.layoutcommit(final_extent.bex_file_offset, final_extent.bex_length, False, layout_stateid, newoffset4(True, 4 * blocksize - 1), notime, layoutupdate4(LAYOUT4_BLOCK_VOLUME, p.get_buffer())) ] res = sess.compound(ops) check(res) print res