From 71f87b0320afe08473c9b4b3bbb7ea1bc28c4fe9 Mon Sep 17 00:00:00 2001 From: Victor Date: Sat, 11 Nov 2023 23:05:03 -0800 Subject: [PATCH 1/3] add instructions and steps to know how to do further testing --- test/layer1_API.cpp | 95 +++++++++++++++++++++++++-------------------- 1 file changed, 52 insertions(+), 43 deletions(-) diff --git a/test/layer1_API.cpp b/test/layer1_API.cpp index c71ac28..0c63001 100644 --- a/test/layer1_API.cpp +++ b/test/layer1_API.cpp @@ -11,37 +11,40 @@ int main(int argc, char *argv[]) { printf("test inode\n"); INodeOperation inop; - inop.initialize(*H); + inop.initialize(*H);//for inode initialization and datablock initialization char buffer[8] = {0}; - //test the begining of inode 1~524287 + /**************************test inode Initialization***************************/ + //test the begining of inode 1th H->rawdisk_read((1) * SECTOR_SIZE, buffer, sizeof(buffer)); u_int64_t t = 0; for (int j = 0; j < 8; j++) t |= ((u_int64_t)(unsigned char)buffer[j]) << (8 * j); - assert(t == 2); - //test the number before end of inode 524286 + assert(t == 2);//the first 1th unused inode will store the next unused inode 2th + //test the number before end of inode 524286th H->rawdisk_read((MAX_INODE - 2) * SECTOR_SIZE, buffer, sizeof(buffer)); t = 0; for (int j = 0; j < 8; j++) t |= ((u_int64_t)(unsigned char)buffer[j]) << (8 * j); - fprintf(stderr,"[t %llu,%d]\n",t,__LINE__); - assert(t == MAX_INODE - 1); - //test the end of inode 1~524287 + assert(t == MAX_INODE - 1);//store the maximun th inode + //test the end of inode 524287th H->rawdisk_read((MAX_INODE - 1) * SECTOR_SIZE, buffer, sizeof(buffer)); t = 0; for (int j = 0; j < 8; j++) t |= ((u_int64_t)(unsigned char)buffer[j]) << (8 * j); - assert(t == 0); - //test the begining of datablock - H->rawdisk_read((MAX_INODE) * SECTOR_SIZE, buffer, sizeof(buffer)); + assert(t == 0);//the end of inode(524287th inode) do not have the next inode address + /**************************test datablock Initialization***************************/ + //we separate 2048 4kB I/O block(1+2047) as a group and the first I/O block will manage the following 2047 I/O block usage. + //the first 8 bytes(0~7) in first I/O block store the address of next first I/O block, the following 256(8~263) bytes record 2047 I/O block usage. + //test the begining of free datablock + H->rawdisk_read((MAX_INODE) * SECTOR_SIZE, buffer, sizeof(buffer));//the begining of free datablock will store from address (MAX_INODE) * SECTOR_SIZE t = 0; for (int j = 0; j < 8; j++) t |= ((u_int64_t)(unsigned char)buffer[j]) << (8 * j); - assert(t == (MAX_INODE+2048*8)*SECTOR_SIZE); + assert(t == (MAX_INODE+2048*8)*SECTOR_SIZE);//the first 8 bytes of 4k I/O block will store the next address(after 2048*4k I/O block) //test the end of the datablock H->rawdisk_read((MAX_BLOCKNUM - 2048*8) * SECTOR_SIZE, buffer, sizeof(buffer)); t = 0; @@ -49,60 +52,66 @@ int main(int argc, char *argv[]) { t |= ((u_int64_t)(unsigned char)buffer[j]) << (8 * j); assert(t == (MAX_BLOCKNUM)*SECTOR_SIZE); - //initialize + + /***************************test inode de/allocation**********************************/ + //when requesting an inode, the inode_allocation will give you the inode number, we use inode_list to store the sequence allocate inode + //arrary version int inode_list[20] = {0}; - printf("Allocate 20 inode num:{"); + int record_free[10] = {0};//should do a pop up structure to record the free inode + int rec = 9; + //printf("Allocate 20 inode num:{"); for(int i=0;i<20;i++){ inode_list[i] = inop.inode_allocate(*H); - printf(" %d", inode_list[i]); + assert(inode_list[i] == i+1); + //printf(" %d", inode_list[i]); } - printf("}\n"); - //free the last 10 - printf("Free: inode num:{"); + //printf("}\n"); for(int i=10;i<20;i++){ - inop.inode_free(*H,inode_list[i]); - printf(" %d", inode_list[i]); + inop.inode_free(*H,inode_list[i]);//free the 10 element from inode_list[10] + record_free[i-10] = inode_list[i]; } - printf("}\n"); //allocate again the last 10 printf("Allocate again: inode num:{"); for(int i=10;i<20;i++){ inode_list[i] = inop.inode_allocate(*H); - printf(" %d", inode_list[i]); + //printf("inode %d, rec_f %d\n,", inode_list[i],record_free[rec]); + assert(inode_list[i] == record_free[rec]); + rec--; } printf("}\n"); - - printf("The status 20 inode num:{"); - for(int i=0;i<20;i++){ - printf(" %d", inode_list[i]); - } - printf("}\n"); - + /***************************test direct blocks[48] de/allocation**********************************/ + //after free the datablock, the program will find the first smallest address of datablock to give to the inode + //should test random resize each node, but should use datablock_free data structure to record INode inode_inside[10]; + u_int64_t rec_datablock_free[10][3] = {0};//array version for(int i=0;i<10;i++){ inode_inside[i].inode_construct(inode_list[i],*H); - printf("%dth data block starting addres: ", i); + //printf("%dth data block starting addres: ", i); for(int j=0;j<6;j++){ - printf("%d," ,inode_inside[i].datablock_allocate(*H)); + inode_inside[i].datablock_allocate(*H); + //printf("%d," ,inode_inside[i].datablock_allocate(*H)); } - printf("\n"); + //printf("\n"); } for(int i=0;i<10;i++){ - printf("%dth data block free addres: ", i); - for(int j=0;j<3;j++){ - printf("%d," ,inode_inside[i].datablock_deallocate(*H)); + //printf("%dth data block free addres: ", i); + for(int j = 2;j >=0;j--){ + rec_datablock_free[i][j] = inode_inside[i].datablock_deallocate(*H); + //printf("", rec_datablock_free[i][j]); } - printf("\n"); - } - for(int i=0;i<10;i++){ - printf("%dth data block allocate again addres: ", i); - for(int j=0;j<3;j++){ - printf("%d," ,inode_inside[i].datablock_allocate(*H)); - } - printf("\n"); + //printf("\n"); } - printf("}\n"); + for(int i=0;i<10;i++){ + //printf("%dth data block allocate again addres: ", i); + for(int j=0;j<3;j++){ + assert(inode_inside[i].datablock_allocate(*H) == rec_datablock_free[i][j]); + //printf("%d," ,inode_inside[i].datablock_allocate(*H)); + } + //printf("\n"); + } + + //printf("}\n"); delete H; // Delete the RawDisk object return 0; From f0c37e2587fdf1beab62f1d7e3971788c57aa36d Mon Sep 17 00:00:00 2001 From: FactorialN Date: Sun, 12 Nov 2023 13:29:14 -0800 Subject: [PATCH 2/3] some basic fixes --- include/fs.h | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/include/fs.h b/include/fs.h index 067d595..aa87410 100644 --- a/include/fs.h +++ b/include/fs.h @@ -15,7 +15,7 @@ one inode equipped with one 512 bytes block class SuperBlock{ public: - SuperBlock(const char *directory){ + SuperBlock(){ } ~SuperBlock(){ @@ -178,6 +178,8 @@ public: bool allo_single_indirect(RawDisk &disk, u_int64_t &single_i, u_int64_t freeBlockNum) { if (single_i == 0){ single_i = datablock_allocate_in_list(disk); + char new_buffer[IO_BLOCK_SIZE] = {0}; + disk.rawdisk_write(single_i, new_buffer, sizeof(new_buffer)); } bool inSingle = false; char buffer[IO_BLOCK_SIZE] = {0}; @@ -197,6 +199,8 @@ public: bool allo_double_indirect(RawDisk &disk, u_int64_t &double_i, u_int64_t freeBlockNum) { if (double_i == 0){ double_i = datablock_allocate_in_list(disk); + char new_buffer[IO_BLOCK_SIZE] = {0}; + disk.rawdisk_write(double_i, new_buffer, sizeof(new_buffer)); } bool inDouble = false; char buffer[IO_BLOCK_SIZE] = {0}; @@ -217,6 +221,8 @@ public: bool allo_triple_indirect(RawDisk &disk, u_int64_t &triple_i, u_int64_t freeBlockNum) { if (triple_i == 0){ triple_i = datablock_allocate_in_list(disk); + char new_buffer[IO_BLOCK_SIZE] = {0}; + disk.rawdisk_write(triple_i, new_buffer, sizeof(new_buffer)); } bool inTriple = false; char buffer[IO_BLOCK_SIZE] = {0}; @@ -270,18 +276,18 @@ public: // mark it alive in its bitmap char buffer[IO_BLOCK_SIZE] = {0}; - bool notEmpty = false; + bool nowInList = false; disk.rawdisk_read(freeBlockHead, buffer, sizeof(buffer)); for (int i = 8; i < 264; i++){ - if(buffer[i] != 0){ - notEmpty = true; + if((i < 263 && buffer[i] != -1) || (i == 263 && buffer[i] != 127)){ + nowInList = true; } } u_int64_t inBlockPos = (freeBlockNum-freeBlockHead)/IO_BLOCK_SIZE-1; buffer[8+inBlockPos/8] &= (-1)^(1<<(inBlockPos%8)); // if its bitmap was 0, add it back to the list head - if(!notEmpty){ + if(!nowInList){ u_int64_t freeListHead = SuperBlock::getFreeListHead(disk); write_byte_at(freeListHead, 0, buffer); SuperBlock::writeFreeListHead(disk, freeBlockHead); @@ -297,7 +303,7 @@ public: char buffer[IO_BLOCK_SIZE] = {0}; int delpoint = -1; disk.rawdisk_read(single_i, buffer, sizeof(buffer)); - for (int i=4088; i >= 0; i--){ + for (int i=4088; i >= 0; i-=8){ u_int64_t addr = read_byte_at(i, buffer); if(addr != 0){ freeBlockNum = addr; From 2c882839385e3288f111bef600fae58a58f442dc Mon Sep 17 00:00:00 2001 From: FactorialN Date: Sun, 12 Nov 2023 13:37:46 -0800 Subject: [PATCH 3/3] some merge --- include/fs.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/include/fs.h b/include/fs.h index aa87410..7a5a1ed 100644 --- a/include/fs.h +++ b/include/fs.h @@ -143,7 +143,8 @@ public: */ char buffer[IO_BLOCK_SIZE] = {0}; u_int64_t freeBlockNum = 0; - disk.rawdisk_read(freeListHead, buffer, sizeof(buffer)); + disk.rawdisk_read(freeListHea + d, buffer, sizeof(buffer)); for (int i = 8; i < 264; i++){ if((i < 263 && buffer[i] != -1) || (i == 263 && buffer[i] != 127)){ int j = 0;