func TestBlockFileScanSmallTxLastTxIncomplete(t *testing.T) { env := newTestEnv(t) defer env.Cleanup() blkfileMgrWrapper := newTestBlockfileWrapper(t, env) bg := testutil.NewBlockGenerator(t) blocks := []*common.Block{} blocks = append(blocks, bg.NextTestBlock(0, 0)) blocks = append(blocks, bg.NextTestBlock(0, 0)) blocks = append(blocks, bg.NextTestBlock(0, 0)) blkfileMgrWrapper.addBlocks(blocks) blkfileMgrWrapper.close() filePath := deriveBlockfilePath(env.conf.blockfilesDir, 0) _, fileSize, err := util.FileExists(filePath) testutil.AssertNoError(t, err, "") file, err := os.OpenFile(filePath, os.O_RDWR|os.O_APPEND|os.O_CREATE, 0660) defer file.Close() testutil.AssertNoError(t, err, "") err = file.Truncate(fileSize - 1) testutil.AssertNoError(t, err, "") _, numBlocks, err := scanForLastCompleteBlock(env.conf.blockfilesDir, 0, 0) testutil.AssertNoError(t, err, "") testutil.AssertEquals(t, numBlocks, len(blocks)-1) }
//cp = checkpointInfo, from the database gets the file suffix and the size of // the file of where the last block was written. Also retrieves contains the // last block number that was written. At init //checkpointInfo:latestFileChunkSuffixNum=[0], latestFileChunksize=[0], lastBlockNumber=[0] func syncCPInfoFromFS(conf *Conf, cpInfo *checkpointInfo) { logger.Debugf("Starting checkpoint=%s", cpInfo) //Checks if the file suffix of where the last block was written exists rootDir := conf.blockfilesDir filePath := deriveBlockfilePath(rootDir, cpInfo.latestFileChunkSuffixNum) exists, size, err := util.FileExists(filePath) if err != nil { panic(fmt.Sprintf("Error in checking whether file [%s] exists: %s", filePath, err)) } logger.Debugf("status of file [%s]: exists=[%t], size=[%d]", filePath, exists, size) //Test is !exists because when file number is first used the file does not exist yet //checks that the file exists and that the size of the file is what is stored in cpinfo //status of file [/tmp/tests/ledger/blkstorage/fsblkstorage/blocks/blockfile_000000]: exists=[false], size=[0] if !exists || int(size) == cpInfo.latestFileChunksize { // check point info is in sync with the file on disk return } //Scan the file system to verify that the checkpoint info stored in db is correct endOffsetLastBlock, numBlocks, err := scanForLastCompleteBlock( rootDir, cpInfo.latestFileChunkSuffixNum, int64(cpInfo.latestFileChunksize)) if err != nil { panic(fmt.Sprintf("Could not open current file for detecting last block in the file: %s", err)) } //Updates the checkpoint info for the actual last block number stored and it's end location cpInfo.lastBlockNumber += uint64(numBlocks) cpInfo.latestFileChunksize = int(endOffsetLastBlock) logger.Debugf("Checkpoint after updates by scanning the last file segment:%s", cpInfo) }
func TestBlockFileScanSmallTxOnly(t *testing.T) { env := newTestEnv(t) defer env.Cleanup() blkfileMgrWrapper := newTestBlockfileWrapper(t, env) bg := testutil.NewBlockGenerator(t) blocks := []*common.Block{} blocks = append(blocks, bg.NextTestBlock(0, 0)) blocks = append(blocks, bg.NextTestBlock(0, 0)) blocks = append(blocks, bg.NextTestBlock(0, 0)) blkfileMgrWrapper.addBlocks(blocks) blkfileMgrWrapper.close() filePath := deriveBlockfilePath(env.conf.blockfilesDir, 0) _, fileSize, err := util.FileExists(filePath) testutil.AssertNoError(t, err, "") endOffsetLastBlock, numBlocks, err := scanForLastCompleteBlock(env.conf.blockfilesDir, 0, 0) testutil.AssertNoError(t, err, "") testutil.AssertEquals(t, numBlocks, len(blocks)) testutil.AssertEquals(t, endOffsetLastBlock, fileSize) }