CE-938 Add releaseById; Remove throws from release methods (so you don't always have to try-catch yourself); more robust holder processing

This commit is contained in:
2024-05-20 11:34:57 -05:00
parent b91da93858
commit 1c582621aa
2 changed files with 101 additions and 3 deletions

View File

@ -44,7 +44,9 @@ import com.kingsrook.qqq.backend.core.model.actions.tables.update.UpdateInput;
import com.kingsrook.qqq.backend.core.model.data.QRecord;
import com.kingsrook.qqq.backend.core.model.session.QSession;
import com.kingsrook.qqq.backend.core.utils.CollectionUtils;
import com.kingsrook.qqq.backend.core.utils.ObjectUtils;
import com.kingsrook.qqq.backend.core.utils.SleepUtils;
import com.kingsrook.qqq.backend.core.utils.StringUtils;
import com.kingsrook.qqq.backend.core.utils.ValueUtils;
import com.kingsrook.qqq.backend.core.utils.memoization.Memoization;
import static com.kingsrook.qqq.backend.core.logging.LogUtils.logPair;
@ -80,7 +82,10 @@ public class ProcessLockUtils
}
QSession qSession = QContext.getQSession();
holder = qSession.getUser().getIdReference() + "-" + qSession.getUuid() + "-" + holder;
holder = ObjectUtils.tryAndRequireNonNullElse(() -> qSession.getUser().getIdReference(), "anonymous")
+ "-"
+ ObjectUtils.tryAndRequireNonNullElse(() -> qSession.getUuid(), "no-session")
+ (StringUtils.hasContent(holder) ? ("-" + holder) : "");
Instant now = Instant.now();
ProcessLock processLock = new ProcessLock()
@ -240,9 +245,53 @@ public class ProcessLockUtils
/*******************************************************************************
**
*******************************************************************************/
public static void release(ProcessLock processLock) throws QException
public static void releaseById(Integer id)
{
if(id == null)
{
LOG.debug("No id passed in to releaseById - returning with noop");
return;
}
ProcessLock processLock = null;
try
{
processLock = ProcessLockUtils.getById(id);
if(processLock == null)
{
LOG.info("Process lock not found in releaseById call", logPair("id", id));
}
}
catch(QException e)
{
LOG.warn("Exception releasing processLock byId", e, logPair("id", id));
}
if(processLock != null)
{
release(processLock);
}
}
/*******************************************************************************
**
*******************************************************************************/
public static void release(ProcessLock processLock)
{
try
{
DeleteOutput deleteOutput = new DeleteAction().execute(new DeleteInput(ProcessLock.TABLE_NAME).withPrimaryKey(processLock.getId()));
if(CollectionUtils.nullSafeHasContents(deleteOutput.getRecordsWithErrors()))
{
throw (new QException("Error deleting processLock record: " + deleteOutput.getRecordsWithErrors().get(0).getErrorsAsString()));
}
}
catch(QException e)
{
LOG.warn("Exception releasing processLock", e, logPair("processLockId", () -> processLock.getId()));
}
}

View File

@ -35,6 +35,7 @@ import com.kingsrook.qqq.backend.core.model.actions.tables.insert.InsertInput;
import com.kingsrook.qqq.backend.core.model.metadata.MetaDataProducerMultiOutput;
import com.kingsrook.qqq.backend.core.model.metadata.QInstance;
import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData;
import com.kingsrook.qqq.backend.core.model.session.QUser;
import com.kingsrook.qqq.backend.core.utils.SleepUtils;
import com.kingsrook.qqq.backend.core.utils.TestUtils;
import org.junit.jupiter.api.BeforeEach;
@ -189,8 +190,56 @@ class ProcessLockUtilsTest extends BaseTest
ProcessLockUtils.checkIn(processLock);
ProcessLock freshLock = ProcessLockUtils.getById(processLock.getId());
assertNotNull(freshLock);
assertNotEquals(originalCheckIn, freshLock.getCheckInTimestamp());
assertNotEquals(originalExpiration, freshLock.getExpiresAtTimestamp());
}
/*******************************************************************************
**
*******************************************************************************/
@Test
void testReleaseById() throws QException
{
////////////////////////////////////////////
// assert no exceptions for these 2 cases //
////////////////////////////////////////////
ProcessLockUtils.releaseById(null);
ProcessLockUtils.releaseById(1);
ProcessLock processLock = ProcessLockUtils.create("1", "typeA", "me");
ProcessLockUtils.releaseById(processLock.getId());
assertNull(ProcessLockUtils.getById(processLock.getId()));
}
/*******************************************************************************
**
*******************************************************************************/
@Test
void testHolders() throws QException
{
QContext.getQSession().setUser(new QUser().withIdReference("me"));
assertThat(ProcessLockUtils.create("1", "typeA", null).getHolder())
.isEqualTo("me-" + QContext.getQSession().getUuid());
assertThat(ProcessLockUtils.create("2", "typeA", "foo").getHolder())
.isEqualTo("me-" + QContext.getQSession().getUuid() + "-foo");
QContext.getQSession().setUser(null);
assertThat(ProcessLockUtils.create("3", "typeA", "bar").getHolder())
.isEqualTo("anonymous-" + QContext.getQSession().getUuid() + "-bar");
QContext.getQSession().setUuid(null);
assertThat(ProcessLockUtils.create("4", "typeA", "baz").getHolder())
.isEqualTo("anonymous-no-session-baz");
QContext.getQSession().setUuid(null);
assertThat(ProcessLockUtils.create("5", "typeA", "").getHolder())
.isEqualTo("anonymous-no-session");
}
}