Status StorageEngineLockFile::writePid() { if (!_lockFileHandle->isValid()) { return Status(ErrorCodes::FileNotOpen, str::stream() << "Unable to write process ID to " << _filespec << " because file has not been opened."); } if (::ftruncate(_lockFileHandle->_fd, 0)) { int errorcode = errno; return Status(ErrorCodes::FileStreamFailed, str::stream() << "Unable to write process id to file (ftruncate failed): " << _filespec << ' ' << errnoWithDescription(errorcode)); } ProcessId pid = ProcessId::getCurrent(); std::stringstream ss; ss << pid << std::endl; std::string pidStr = ss.str(); int bytesWritten = ::write(_lockFileHandle->_fd, pidStr.c_str(), pidStr.size()); if (bytesWritten < 0) { int errorcode = errno; return Status(ErrorCodes::FileStreamFailed, str::stream() << "Unable to write process id " << pid.toString() << " to file: " << _filespec << ' ' << errnoWithDescription(errorcode)); } else if (bytesWritten == 0) { return Status(ErrorCodes::FileStreamFailed, str::stream() << "Unable to write process id " << pid.toString() << " to file: " << _filespec << " no data written."); } if (::fsync(_lockFileHandle->_fd)) { int errorcode = errno; return Status(ErrorCodes::FileStreamFailed, str::stream() << "Unable to write process id " << pid.toString() << " to file (fsync failed): " << _filespec << ' ' << errnoWithDescription(errorcode)); } flushMyDirectory(_filespec); return Status::OK(); }
Status StorageEngineLockFile::writePid() { if (!_lockFileHandle->isValid()) { return Status(ErrorCodes::FileNotOpen, str::stream() << "Unable to write process ID to " << _filespec << " because file has not been opened."); } Status status = _truncateFile(_lockFileHandle->_handle); if (!status.isOK()) { return status; } ProcessId pid = ProcessId::getCurrent(); std::stringstream ss; ss << pid << std::endl; std::string pidStr = ss.str(); DWORD bytesWritten = 0; if (::WriteFile(_lockFileHandle->_handle, static_cast<LPCVOID>(pidStr.c_str()), static_cast<DWORD>(pidStr.size()), &bytesWritten, NULL) == FALSE) { int errorcode = GetLastError(); return Status(ErrorCodes::FileStreamFailed, str::stream() << "Unable to write process id " << pid.toString() << " to file: " << _filespec << ' ' << errnoWithDescription(errorcode)); } else if (bytesWritten == 0) { return Status(ErrorCodes::FileStreamFailed, str::stream() << "Unable to write process id " << pid.toString() << " to file: " << _filespec << " no data written."); } ::FlushFileBuffers(_lockFileHandle->_handle); return Status::OK(); }