Beispiel #1
0
 /**
  * д��һ��¼
  */
 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;
 }
Beispiel #2
0
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;
}
Beispiel #3
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;
 }
Beispiel #4
0
    /**
     * 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;         
    }
Beispiel #5
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;
}
Beispiel #6
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();
}
Beispiel #7
0
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;
}