/** * д��һ��¼ */ int CFileQueue::push(void *data, int len) { if (m_writeFd == -1) { openWriteFile(); if (m_writeFd == -1) { TBSYS_LOG(WARN, "�ļ�û����: %s:%u", m_queuePath, m_head.write_seqno); return EXIT_FAILURE; } } if (data == NULL || len == 0) { TBSYS_LOG(WARN, "data: %p, len: %d", data, len); return EXIT_FAILURE; } int size = sizeof(int) + sizeof(queue_item) + len; if (size > TBFQ_MAX_FILE_SIZE) { TBSYS_LOG(WARN, "size: %d", size); return EXIT_FAILURE; } char *buffer = (char*)malloc(size); assert(buffer != NULL); *((int*)buffer) = size; queue_item *item = (queue_item*) (buffer + sizeof(int)); item->len = len; item->flag = TBFQ_FILE_QUEUE_FLAG; memcpy(&(item->data[0]), data, len); // �����ļ����������´���һ�� if (m_head.write_filesize >= m_maxFileSize) { m_head.write_seqno ++; m_head.write_filesize = 0; openWriteFile(); writeHead(); } item->pos.seqno = m_head.write_seqno; item->pos.offset = m_head.write_filesize; int ret = write(m_writeFd, buffer, size); if (ret > 0) { m_head.write_filesize += size; } free(buffer); if (ret != size) { // дʧ�� TBSYS_LOG(WARN, "дʧ��: %s, fd: %d, len: %d, %d<>%d", m_queuePath, m_writeFd, len, ret, size); ret = size - ret; if (ret>0 && ret<=size && size<m_maxFileSize) { TBSYS_LOG(WARN, "����%d���ֽ�д", ret); lseek(m_writeFd, ret, SEEK_CUR); } return EXIT_FAILURE; } m_head.queue_size ++; return EXIT_SUCCESS; }
int main(int argc, char *argv[]) { //INITILIZATION MPIInit(argc, argv); PTHREADInit(argc, argv); if (rank == 0) gettimeofday(&tvalBefore, NULL); //READFILE int fileArray[1000]; for (int ix = 0; ix < 10; ix++) { int file = fileArray[ix]; //Open new file with suffix ix openWriteFile((char *)nameGenerate("dummy", ix).c_str(), &file); //Print 0 to each file int num = 0; if (rank == 0) { lseek(file, 0, SEEK_SET); write(file, &num, sizeof(int)); } //Generate lock parameter struct flock lock; memset(&lock, 0, sizeof(lock)); MPIBarrier(); //Lock file lock.l_type = F_WRLCK; fcntl(file,F_SETLKW, &lock); //Read from file num lseek(file, 0, SEEK_SET); read(file, &num, sizeof(int)); num++; //Overwrite num+1 to file lseek(file, 0, SEEK_SET); write(file, &num,sizeof(int)); printf("(Process %2d) ix = %4d | num = %4d\n",rank, ix, num); //Unlock the file lock.l_type = F_UNLCK; fcntl(file, F_SETLK, &lock); } //FINALIZATION MPIBarrier(); if (rank == 0) { gettimeofday(&tvalAfter, NULL); printDiff(tvalBefore, tvalAfter); } MPIFinalize(); PTHREADFinalize(); return 0; }
/** * ���ն��� */ int CFileQueue::clear() { m_head.write_seqno ++; m_head.read_seqno = m_head.write_seqno; m_head.read_offset = 0; m_head.write_filesize = 0; m_head.queue_size = 0; openWriteFile(); openReadFile(); return EXIT_SUCCESS; }
/** * rootPath: queue��root·�� * queueName: * maxFileSize: �����ļ���С */ CFileQueue::CFileQueue(const char *rootPath, const char *queueName, int maxFileSize) { char tmp[256]; sprintf(tmp, "%s/%s", rootPath, queueName); m_queuePath = strdup(tmp); m_maxFileSize = maxFileSize; m_infoFd = -1; m_readFd = -1; m_writeFd = -1; // ����Ŀ¼ if (CFileUtil::mkdirs(m_queuePath) == false) { TBSYS_LOG(ERROR, "����Ŀ¼ʧ��: %s", m_queuePath); return; } // ͷ�ļ� sprintf(tmp, "%s/header.dat", m_queuePath); m_infoFd = open(tmp, O_RDWR|O_CREAT, 0600); if (m_infoFd == -1) { TBSYS_LOG(ERROR, "�����ļ�ʧ��: %s", tmp); return; } // ����ͷ��Ϣ if (read(m_infoFd, &m_head, sizeof(m_head)) != sizeof(m_head)) { memset(&m_head, 0, sizeof(m_head)); m_head.read_seqno = 1; m_head.write_seqno = 1; } // ����д if (openWriteFile() == EXIT_FAILURE) { return; } struct stat st; if (fstat(m_writeFd, &st) == 0) { m_head.write_filesize = st.st_size; } // �� if (openReadFile() == EXIT_FAILURE) { close(m_writeFd); m_writeFd = -1; return; } // �ָ���¼ if (m_head.exit_status == 0) { recoverRecord(); } m_head.exit_status = 0; }
/** * rootPath: queue的root路径 * queueName: * maxFileSize: 最大文件大小 */ CFileQueue::CFileQueue(char *rootPath, char *queueName, int maxFileSize) { char tmp[256]; sprintf(tmp, "%s/%s", rootPath, queueName); m_queuePath = strdup(tmp); m_maxFileSize = maxFileSize; m_infoFd = -1; m_readFd = -1; m_writeFd = -1; // 创建目录 if (CFileUtil::mkdirs(m_queuePath) == false) { SYS_LOG(ERROR, "create directory failed: %s", m_queuePath); return; } // 头文件 sprintf(tmp, "%s/header.dat", m_queuePath); m_infoFd = open(tmp, O_RDWR|O_CREAT, 0644); if (m_infoFd == -1) { SYS_LOG(ERROR, "open file failed: %s", tmp); return; } // 读进头信息 if (read(m_infoFd, &m_head, sizeof(m_head)) != sizeof(m_head)) { memset(&m_head, 0, sizeof(m_head)); m_head.read_seqno = 1; m_head.write_seqno = 1; } // 打开写 if (openWriteFile() == CTFO_EXIT_FAILURE) { return; } struct stat st; if (fstat(m_writeFd, &st) == 0) { m_head.write_filesize = st.st_size; } // 打开读 if (openReadFile() == CTFO_EXIT_FAILURE) { close(m_writeFd); m_writeFd = -1; return; } // 恢复记录 if (m_head.exit_status == 0) { recoverRecord(); } m_head.exit_status = 0; }
// 清理所有数据 void CFileQueue::remove() { // m_head.write_seqno ++; m_head.read_seqno = m_head.write_seqno; m_head.read_offset = 0; m_head.write_filesize = 0; m_head.queue_size = 0; deleteReadFile(m_head.read_seqno); openWriteFile(); openReadFile(); }
int receiveTheRequestFile()//rrq { debug("ok: receiveTheRequestFile().start."); if(dbug) { printf("ok: filename:%s.\n",pSession->pLocalFilename); printf("ok: mode:%s.\n",pSession->pMode); } pAboutWriteFile->pFilename = pSession->pLocalFilename; pAboutWriteFile->pOpenWriteType = pDefaultOpenWriteType; openWriteFile(); pSession->requsetOk = 1; pHandleTftpDataPacket->reachEofReceive = 0; pAboutWriteFile->sizeFile = 0; pSession->fileTimer = clock(); while(1) ///the "while" of: receive all the data of remote file and write to local file { debug("\nok: \"while\": receive and write.start."); receiveAndUnpackUdpPacket(); unpackTftpPacket(); if(pHandleTftpDataPacket->reachEofReceive) { debug("\nok: reachEofReceive the \"while\" of: receive."); break; } } closeWriteFile(); pSession->requsetOk = 0; pHandleTftpDataPacket->reachEofReceive = 0; pSession->fileTimer = clock() - pSession->fileTimer; pSession->fileTimer = pSession->fileTimer/CLOCKS_PER_SEC; if(pSession->fileTimer == 0) { pSession->fileTimer = 1; } printf("ok: receive file speed: %i bytes/s.\n",pAboutWriteFile->sizeFile/pSession->fileTimer ); pAboutWriteFile->sizeFile = 0; debug("ok: openWriteFileAndReceiveAndSaveDataAndClose().end."); return 0; }