bool MultiprocessRollingFileAppender::synchronizedRollover()

in src/main/cpp/multiprocessrollingfileappender.cpp [257:368]


bool MultiprocessRollingFileAppender::synchronizedRollover(Pool& p, const TriggeringPolicyPtr& trigger)
{
	bool result = false;
	LogString fileName = getFile();
	if (!_priv->rollingPolicy)
		; // can't roll without a policy
	else if (isAlreadyRolled(fileName, &_priv->fileLength))
		reopenFile(fileName);
	else
	{
		MultiprocessRollingFileAppenderPriv::Lock lk(_priv, fileName);
		if (!lk.hasLock())
			LogLog::warn(LOG4CXX_STR("Failed to lock ") + fileName);
		else if (isAlreadyRolled(fileName, &_priv->fileLength))
			reopenFile(fileName);
		else if (trigger && !trigger->isTriggeringEvent(this, _priv->_event, fileName, _priv->fileLength))
			;
		else if (auto rollover1 = _priv->rollingPolicy->rollover(fileName, getAppend(), p))
		{
			closeWriter();
			if (rollover1->getActiveFileName() == fileName)
			{
				bool success = true; // A synchronous action is not required
				if (auto pAction = rollover1->getSynchronous())
					success = pAction->execute(p);

				bool appendToExisting = true;
				if (success)
				{
					appendToExisting = rollover1->getAppend();
					if (appendToExisting)
					{
						_priv->fileLength = File().setPath(rollover1->getActiveFileName()).length(p);
					}
					else
					{
						_priv->fileLength = 0;
					}

					if (auto asyncAction = rollover1->getAsynchronous())
					{
						try
						{
							asyncAction->execute(p);
						}
						catch (std::exception& ex)
						{
							LogString msg(LOG4CXX_STR("Async action in rollover ["));
							msg.append(fileName);
							msg.append(LOG4CXX_STR("] failed"));
							_priv->errorHandler->error(msg, ex, 0);
						}
					}
				}
				else
				{
					LogString msg(LOG4CXX_STR("Rollover of ["));
					msg.append(fileName);
					msg.append(LOG4CXX_STR("] failed"));
					_priv->errorHandler->error(msg);
				}
				setFileInternal(rollover1->getActiveFileName(), appendToExisting, _priv->bufferedIO, _priv->bufferSize, p);
			}
			else
			{
				setFileInternal(rollover1->getActiveFileName());
				// Call activateOptions to create any intermediate directories(if required)
				FileAppender::activateOptionsInternal(p);
				OutputStreamPtr os = std::make_shared<FileOutputStream>
					( rollover1->getActiveFileName()
					, rollover1->getAppend()
					);
				setWriterInternal(createWriter(os));

				bool success = true; // A synchronous action is not required
				if (auto pAction = rollover1->getSynchronous())
					success = pAction->execute(p);

				if (success)
				{
					if (rollover1->getAppend())
					{
						_priv->fileLength = File().setPath(rollover1->getActiveFileName()).length(p);
					}
					else
					{
						_priv->fileLength = 0;
					}

					if (auto asyncAction = rollover1->getAsynchronous())
					{
						try
						{
							asyncAction->execute(p);
						}
						catch (std::exception& ex)
						{
							LogString msg(LOG4CXX_STR("Async action in rollover ["));
							msg.append(fileName);
							msg.append(LOG4CXX_STR("] failed"));
							_priv->errorHandler->error(msg, ex, 0);
						}
					}
				}
			}

			result = true;
		}
	}

	return result;
}