int FileCreator::openAndSetSize()

in util/FileCreator.cpp [53:90]


int FileCreator::openAndSetSize(ThreadCtx &threadCtx,
                                BlockDetails const *blockDetails) {
  int fd;
  const bool doCreate = (blockDetails->allocationStatus == NOT_EXISTS);
  const bool isTooLarge = (blockDetails->allocationStatus == EXISTS_TOO_LARGE);
  if (doCreate) {
    fd = createFile(threadCtx, blockDetails->fileName);
  } else {
    fd = openExistingFile(threadCtx, blockDetails->fileName);
  }
  if (fd < 0) {
    return -1;
  }
  if (blockDetails->allocationStatus == EXISTS_CORRECT_SIZE) {
    return fd;
  }
  if (!setFileSize(threadCtx, fd, blockDetails->fileSize)) {
    close(fd);
    return -1;
  }
  if (threadCtx.getOptions().isLogBasedResumption()) {
    if (isTooLarge) {
      WLOG(WARNING) << "File size smaller in the sender side "
                    << blockDetails->fileName
                    << ", marking previous transferred chunks as invalid";
      transferLogManager_.addFileInvalidationEntry(blockDetails->prevSeqId);
    }
    if (isTooLarge || doCreate) {
      transferLogManager_.addFileCreationEntry(
          blockDetails->fileName, blockDetails->seqId, blockDetails->fileSize);
    } else {
      WDT_CHECK_EQ(EXISTS_TOO_SMALL, blockDetails->allocationStatus);
      transferLogManager_.addFileResizeEntry(blockDetails->seqId,
                                             blockDetails->fileSize);
    }
  }
  return fd;
}