Skip to content
Snippets Groups Projects
Commit 46039385 authored by srosse's avatar srosse
Browse files

no-jira: fix background user log, fix concurrent entry access with MySQL

parent 8c58e8ce
No related branches found
No related tags found
No related merge requests found
...@@ -42,6 +42,7 @@ import org.olat.core.id.context.ContextEntry; ...@@ -42,6 +42,7 @@ import org.olat.core.id.context.ContextEntry;
import org.olat.core.id.context.StackedBusinessControl; import org.olat.core.id.context.StackedBusinessControl;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.olat.core.logging.Tracing; import org.olat.core.logging.Tracing;
import org.olat.core.util.StringHelper;
import org.olat.core.util.UserSession; import org.olat.core.util.UserSession;
import org.olat.core.util.session.UserSessionManager; import org.olat.core.util.session.UserSessionManager;
...@@ -604,43 +605,36 @@ public class UserActivityLoggerImpl implements IUserActivityLogger { ...@@ -604,43 +605,36 @@ public class UserActivityLoggerImpl implements IUserActivityLogger {
// to the database below right away // to the database below right away
List<ILoggingResourceable> resourceInfos = getCombinedOrderedLoggingResourceables(lriOrNull); List<ILoggingResourceable> resourceInfos = getCombinedOrderedLoggingResourceables(lriOrNull);
//fxdiff: see FXOLAT-104, move up here to remove targetIdentity before checking the LoggingResourcables, because of often obsolete delivery of targetIdentity. // Move up here to remove targetIdentity before checking the LoggingResourcables, because of often obsolete delivery of targetIdentity.
// TargetIdentity is often missing in XYLoggingAction. // TargetIdentity is often missing in XYLoggingAction.
if (session_==null) {
// then I can't log - log information without session/user information isn't of much use
// issue a log warn with a stacktrace for this
log_.error("No session available to UserActivityLogger. Cannot write log entry: "+
crudAction.name()+":"+actionVerb.name()+", "+actionObject+", "+
convertLoggingResourceableListToString(resourceInfos), new Exception());
return;
}
final String sessionId; final String sessionId;
if (session_.getSessionInfo() != null && if(session_ == null || session_.getSessionInfo() == null
session_.getSessionInfo().getSession() == null) { || (session_.getSessionInfo() != null && session_.getSessionInfo().getSession() == null)) {
//background taks //background task
sessionId = Thread.currentThread().getName(); sessionId = Thread.currentThread().getName();
} else if (session_.getSessionInfo() == null) {
// no session Id available - odd
log_.error("No session information available to UserActivityLogger. Cannot write log entry: "+
crudAction.name()+":"+actionVerb.name()+", "+actionObject+", "+
convertLoggingResourceableListToString(resourceInfos), new Exception());
return;
} else { } else {
sessionId = Long.toString(session_.getSessionInfo().getCreationTime()); sessionId = Long.toString(session_.getSessionInfo().getCreationTime());
} }
Identity identity = session_.getIdentity(); Long identityKey = null;
if (identity==null) { if(session_ != null && session_.getIdentity() != null) {
identityKey = session_.getIdentity().getKey();
} else {
for (ILoggingResourceable lr:resourceInfos) {
if (lr.getResourceableType() == StringResourceableType.targetIdentity && StringHelper.isLong(lr.getId())) {
identityKey = Long.valueOf(lr.getId());
}
}
}
if (identityKey == null) {
// no identity available - odd // no identity available - odd
log_.error("No identity available to UserActivityLogger. Cannot write log entry: "+ log_.error("No identity available to UserActivityLogger. Cannot write log entry: {}:{}, {}, {}",
crudAction.name()+":"+actionVerb.name()+", "+actionObject+", "+ crudAction, actionVerb, actionObject, convertLoggingResourceableListToString(resourceInfos),
convertLoggingResourceableListToString(resourceInfos), new Exception()); new Exception());
return; return;
} }
Long identityKey = identity.getKey();
if (actionType!=ActionType.admin) { if (actionType!=ActionType.admin) {
final String identityKeyStr = String.valueOf(identityKey); final String identityKeyStr = String.valueOf(identityKey);
for (Iterator<ILoggingResourceable> it = resourceInfos.iterator(); it.hasNext();) { for (Iterator<ILoggingResourceable> it = resourceInfos.iterator(); it.hasNext();) {
......
...@@ -24,9 +24,14 @@ import java.util.Collection; ...@@ -24,9 +24,14 @@ import java.util.Collection;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import javax.persistence.PersistenceException;
import org.apache.logging.log4j.Logger;
import org.hibernate.exception.ConstraintViolationException;
import org.olat.basesecurity.GroupRoles; import org.olat.basesecurity.GroupRoles;
import org.olat.core.commons.persistence.DB; import org.olat.core.commons.persistence.DB;
import org.olat.core.id.Identity; import org.olat.core.id.Identity;
import org.olat.core.logging.Tracing;
import org.olat.group.BusinessGroup; import org.olat.group.BusinessGroup;
import org.olat.group.manager.BusinessGroupRelationDAO; import org.olat.group.manager.BusinessGroupRelationDAO;
import org.olat.modules.assessment.AssessmentEntry; import org.olat.modules.assessment.AssessmentEntry;
...@@ -49,6 +54,8 @@ import org.springframework.stereotype.Service; ...@@ -49,6 +54,8 @@ import org.springframework.stereotype.Service;
@Service @Service
public class AssessmentServiceImpl implements AssessmentService, UserDataDeletable { public class AssessmentServiceImpl implements AssessmentService, UserDataDeletable {
private static final Logger log = Tracing.createLoggerFor(AssessmentServiceImpl.class);
@Autowired @Autowired
private DB dbInstance; private DB dbInstance;
@Autowired @Autowired
...@@ -59,11 +66,21 @@ public class AssessmentServiceImpl implements AssessmentService, UserDataDeletab ...@@ -59,11 +66,21 @@ public class AssessmentServiceImpl implements AssessmentService, UserDataDeletab
@Override @Override
public AssessmentEntry getOrCreateAssessmentEntry(Identity assessedIdentity, String anonymousIdentifier, public AssessmentEntry getOrCreateAssessmentEntry(Identity assessedIdentity, String anonymousIdentifier,
RepositoryEntry entry, String subIdent, Boolean entryRoot, RepositoryEntry referenceEntry) { RepositoryEntry entry, String subIdent, Boolean entryRoot, RepositoryEntry referenceEntry) {
AssessmentEntry assessmentEntry = assessmentEntryDao.loadAssessmentEntry(assessedIdentity, anonymousIdentifier, entry, subIdent); AssessmentEntry assessmentEntry = assessmentEntryDao.loadAssessmentEntry(assessedIdentity, anonymousIdentifier, entry, subIdent);
if(assessmentEntry == null) { if(assessmentEntry == null) {
assessmentEntry = assessmentEntryDao.createAssessmentEntry(assessedIdentity, anonymousIdentifier, entry, subIdent, entryRoot, referenceEntry); try {
dbInstance.commit(); dbInstance.commit();
assessmentEntry = assessmentEntryDao.createAssessmentEntry(assessedIdentity, anonymousIdentifier, entry, subIdent, entryRoot, referenceEntry);
dbInstance.commit();
} catch(PersistenceException e) {
if(e.getCause() instanceof ConstraintViolationException) {
log.warn("", e);
dbInstance.rollback();
assessmentEntry = assessmentEntryDao.loadAssessmentEntry(assessedIdentity, anonymousIdentifier, entry, subIdent);
} else {
log.error("", e);
}
}
} }
return assessmentEntry; return assessmentEntry;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment