mirror of
https://github.com/Kingsrook/qqq.git
synced 2025-07-18 13:10:44 +00:00
Wrap cache table writes in try-catch - don't let a cache-updating action break a read
This commit is contained in:
@ -56,6 +56,7 @@ import com.kingsrook.qqq.backend.core.model.metadata.tables.cache.CacheUseCase;
|
|||||||
import com.kingsrook.qqq.backend.core.utils.CollectionUtils;
|
import com.kingsrook.qqq.backend.core.utils.CollectionUtils;
|
||||||
import com.kingsrook.qqq.backend.core.utils.ListingHash;
|
import com.kingsrook.qqq.backend.core.utils.ListingHash;
|
||||||
import org.apache.commons.lang.NotImplementedException;
|
import org.apache.commons.lang.NotImplementedException;
|
||||||
|
import static com.kingsrook.qqq.backend.core.logging.LogUtils.logPair;
|
||||||
|
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
@ -125,11 +126,21 @@ public class QueryActionCacheHelper
|
|||||||
|
|
||||||
if(CollectionUtils.nullSafeHasContents(recordsToCache))
|
if(CollectionUtils.nullSafeHasContents(recordsToCache))
|
||||||
{
|
{
|
||||||
InsertInput insertInput = new InsertInput();
|
try
|
||||||
insertInput.setTableName(queryInput.getTableName());
|
{
|
||||||
insertInput.setRecords(recordsToCache);
|
InsertInput insertInput = new InsertInput();
|
||||||
insertInput.setSkipUniqueKeyCheck(true);
|
insertInput.setTableName(queryInput.getTableName());
|
||||||
InsertOutput insertOutput = new InsertAction().execute(insertInput);
|
insertInput.setRecords(recordsToCache);
|
||||||
|
insertInput.setSkipUniqueKeyCheck(true);
|
||||||
|
InsertOutput insertOutput = new InsertAction().execute(insertInput);
|
||||||
|
}
|
||||||
|
catch(Exception e)
|
||||||
|
{
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// don't let an exception break this query - it (probably) just indicates some data that didn't get cached - so - that's generally "ok" //
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
LOG.warn("Error inserting cached records", e, logPair("cacheTable", queryInput.getTableName()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -220,17 +231,28 @@ public class QueryActionCacheHelper
|
|||||||
List<QRecord> recordsToUpdate = refreshedRecordsToReturn.stream().filter(r -> CacheUtils.shouldCacheRecord(table, r)).toList();
|
List<QRecord> recordsToUpdate = refreshedRecordsToReturn.stream().filter(r -> CacheUtils.shouldCacheRecord(table, r)).toList();
|
||||||
if(CollectionUtils.nullSafeHasContents(recordsToUpdate))
|
if(CollectionUtils.nullSafeHasContents(recordsToUpdate))
|
||||||
{
|
{
|
||||||
UpdateInput updateInput = new UpdateInput();
|
try
|
||||||
updateInput.setTableName(queryInput.getTableName());
|
{
|
||||||
updateInput.setRecords(recordsToUpdate);
|
UpdateInput updateInput = new UpdateInput();
|
||||||
UpdateOutput updateOutput = new UpdateAction().execute(updateInput);
|
updateInput.setTableName(queryInput.getTableName());
|
||||||
|
updateInput.setRecords(recordsToUpdate);
|
||||||
|
UpdateOutput updateOutput = new UpdateAction().execute(updateInput);
|
||||||
|
}
|
||||||
|
catch(Exception e)
|
||||||
|
{
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// don't let an exception break this query - it (probably) just indicates some data that didn't get cached - so - that's generally "ok" //
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
LOG.warn("Error updating cached records", e, logPair("cacheTable", queryInput.getTableName()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// if the records were missed in the source - OR if they shouldn't be cached now, then mark them for deleting //
|
// if the records were missed in the source - OR if they shouldn't be cached now, then mark them for deleting //
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
Set<Serializable> cachedRecordIdsToDelete = new HashSet<>(missedUniqueKeyValues.stream()
|
Set<Serializable> cachedRecordIdsToDelete = missedUniqueKeyValues.stream()
|
||||||
.map(ukValues -> uniqueKeyToPrimaryKeyMap.get(ukValues)).collect(Collectors.toSet()));
|
.map(uniqueKeyToPrimaryKeyMap::get)
|
||||||
|
.collect(Collectors.toSet());
|
||||||
|
|
||||||
cachedRecordIdsToDelete.addAll(refreshedRecordsToReturn.stream()
|
cachedRecordIdsToDelete.addAll(refreshedRecordsToReturn.stream()
|
||||||
.filter(r -> !CacheUtils.shouldCacheRecord(table, r))
|
.filter(r -> !CacheUtils.shouldCacheRecord(table, r))
|
||||||
@ -242,10 +264,21 @@ public class QueryActionCacheHelper
|
|||||||
/////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
// if the records are no longer in the source, then remove them from the cache //
|
// if the records are no longer in the source, then remove them from the cache //
|
||||||
/////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
DeleteInput deleteInput = new DeleteInput();
|
try
|
||||||
deleteInput.setTableName(queryInput.getTableName());
|
{
|
||||||
deleteInput.setPrimaryKeys(new ArrayList<>(cachedRecordIdsToDelete));
|
DeleteInput deleteInput = new DeleteInput();
|
||||||
new DeleteAction().execute(deleteInput);
|
deleteInput.setTableName(queryInput.getTableName());
|
||||||
|
deleteInput.setPrimaryKeys(new ArrayList<>(cachedRecordIdsToDelete));
|
||||||
|
new DeleteAction().execute(deleteInput);
|
||||||
|
|
||||||
|
}
|
||||||
|
catch(Exception e)
|
||||||
|
{
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// don't let an exception break this query - it (probably) just indicates some data that didn't get uncached - so - that's generally "ok" //
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
LOG.warn("Error deleting cached records", e, logPair("cacheTable", queryInput.getTableName()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user