static void findBlockFiles() { gChainSize = 0; auto blockChainDir = getBlockchainDir(); auto blockDir = blockChainDir + std::string("/blocks"); info("loading block chain from directory: %s", blockChainDir.c_str()); struct stat statBuf; auto r = stat(blockDir.c_str(), &statBuf); auto oldStyle = (r<0 || !S_ISDIR(statBuf.st_mode)); int blkDatId = (oldStyle ? 1 : 0); auto fmt = oldStyle ? "/blk%04d.dat" : "/blocks/blk%05d.dat"; while(1) { char buf[64]; sprintf(buf, fmt, blkDatId++); auto fileName = blockChainDir + std::string(buf) ; auto fd = open(fileName.c_str(), O_RDONLY); if(fd<0) { if(1<blkDatId) { break; } sysErrFatal( "failed to open block chain file %s", fileName.c_str() ); } struct stat statBuf; auto r0 = fstat(fd, &statBuf); if(r0<0) { sysErrFatal( "failed to fstat block chain file %s", fileName.c_str() ); } auto fileSize = statBuf.st_size; #if !defined(_WIN64) auto r1 = posix_fadvise(fd, 0, fileSize, POSIX_FADV_NOREUSE); if(r1<0) { warning( "failed to posix_fadvise on block chain file %s", fileName.c_str() ); } #endif BlockFile blockFile; blockFile.fd = fd; blockFile.size = fileSize; blockFile.name = fileName; blockFiles.push_back(blockFile); gChainSize += fileSize; } info("block chain size = %.3f Gigs", 1e-9*gChainSize); }
static void makeBlockMaps() { auto blockChainDir = getBlockchainDir(); auto blockDir = blockChainDir + std::string("/blocks"); info("loading block chain from: %s", blockChainDir.c_str()); struct stat statBuf; auto r = stat(blockDir.c_str(), &statBuf); auto oldStyle = (r<0 || !S_ISDIR(statBuf.st_mode)); int blkDatId = (oldStyle ? 1 : 0); auto fmt = oldStyle ? "/blk%04d.dat" : "/blocks/blk%05d.dat"; while(1) { char buf[64]; sprintf(buf, fmt, blkDatId++); auto blockMapFileName = blockChainDir + std::string(buf) ; auto blockMapFD = open(blockMapFileName.c_str(), O_RDONLY); if(blockMapFD<0) { if(1<blkDatId) { break; } sysErrFatal( "failed to open block chain file %s", blockMapFileName.c_str() ); } struct stat statBuf; int st0 = fstat(blockMapFD, &statBuf); if(st0<0) { sysErrFatal( "failed to fstat block chain file %s", blockMapFileName.c_str() ); } auto mapSize = statBuf.st_size; auto st1 = posix_fadvise(blockMapFD, 0, mapSize, POSIX_FADV_NOREUSE); if(st1<0) { warning( "failed to posix_fadvise on block chain file %s", blockMapFileName.c_str() ); } Map map; map.size = mapSize; map.fd = blockMapFD; map.name = blockMapFileName; mapVec.push_back(map); } }