mirror of
https://github.com/chanzuckerberg/cellxgene.git
synced 2026-09-20 11:28:47 +08:00
* revert all commits to before Typescript migration * update compat workflow to match latest deps (#2335) * update compat workflow to match latest deps * attempt to debug * attempt to debug * remove debugging code * typo * update deps to match desktop (#2340) * fix: don't run lint with `--fix` on push tests (#2273) * fix: don't run lint with `--fix` on push tests * npx Co-authored-by: maniarathi <mani.arathi@gmail.com> Co-authored-by: Madison Dunitz <madison.dunitz@chanzuckerberg.com> * rename X_approx_distribution to X_approximate_distribution (#2337) * Correctly handle non-finite numbers in heuristic determination of X distribution (#2342) * handle non-finites explicitly * improve and test edge case handling for distribution estimation * revert debugging changes * code readability * clean up type inferencing (#2332) * unit tests for 64 bit conversion * clean up type handling * type inference tests * more type inference fixes * use schema to determine user intent for data typing * stop using deprecated API * fbs type encoding test * add missing test * add more tests * correctly infer X type for CXG adaptor * lint * fix typo * ts migration * cleanup from PR review * lint * PR review changes * remove unused packages from client (#2359) * remove unused packages from client * add missing peer dep * fix: disable FE auth testing on compatibility tests (#2377) * update: release process (#2277) Co-authored-by: maniarathi <mani.arathi@gmail.com> * fix: remove spaces in param setup (#2380) * delete deploy workflow (#2396) * undo reformatting which now does not pass lint * fix snapshots which changed due to npm dep changes * add missing quoting to snapshot * another snapshot typo fix * TS Revert (2) - replay PR #2347 and #2354 (#2403) * replay edits from PR 2347 * TS Revert (3) - replay edits in PR #2327 (#2404) * replay edits in PR 2327 * TS Revert (4) - replay PR #2355 (#2405) * replay edits in PR 2355 * add additional babel config * reformat with new prettier config Co-authored-by: Severiano Badajoz <sbadajoz@chanzuckerberg.com> Co-authored-by: maniarathi <mani.arathi@gmail.com> Co-authored-by: Madison Dunitz <madison.dunitz@chanzuckerberg.com>
67 lines
1.8 KiB
JavaScript
67 lines
1.8 KiB
JavaScript
/*
|
|
Garbage collection / cache management support
|
|
|
|
Middleware that knows how to pull annoMatrix from the undoable state,
|
|
and pass it along to the AnnoMatrix class for possible cache GC.
|
|
|
|
Private interface.
|
|
|
|
Future work item: this middleware knows internal details of both the
|
|
Undoable metareducer and the AnnoMatrix private API. It would be helpful
|
|
to make the Undoable interface better factored.
|
|
*/
|
|
|
|
const annoMatrixGC = (store) => (next) => (action) => {
|
|
if (_itIsTimeForGC()) {
|
|
_doGC(store);
|
|
}
|
|
return next(action);
|
|
};
|
|
|
|
let lastGCTime = 0;
|
|
const InterGCDelayMS = 30 * 1000; // 30 seconds
|
|
function _itIsTimeForGC() {
|
|
/*
|
|
we don't want to run GC on every dispatch, so throttle it a bit.
|
|
|
|
Runs every InterGCDelay period
|
|
*/
|
|
const now = Date.now();
|
|
if (now - lastGCTime > InterGCDelayMS) {
|
|
lastGCTime = now;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function _doGC(store) {
|
|
const state = store.getState();
|
|
|
|
// these should probably be a function imported from undoable.js, etc, as
|
|
// they have overly intimiate knowledge of our reducers.
|
|
const undoablePast = state["@@undoable/past"];
|
|
const undoableFuture = state["@@undoable/future"];
|
|
const undoableStack = undoablePast
|
|
.concat(undoableFuture)
|
|
.flatMap((snapshot) =>
|
|
snapshot.filter((v) => v[0] === "annoMatrix").map((v) => v[1])
|
|
);
|
|
const currentAnnoMatrix = state.annoMatrix;
|
|
|
|
/*
|
|
We want to identify those matrixes currently "hot", ie, linked from the current annoMatrix,
|
|
as our current gc algo is more aggressive with those not hot.
|
|
*/
|
|
const allAnnoMatrices = new Map(
|
|
undoableStack.map((m) => [m, { isHot: false }])
|
|
);
|
|
let am = currentAnnoMatrix;
|
|
while (am) {
|
|
allAnnoMatrices.set(am, { isHot: true });
|
|
am = am.viewOf;
|
|
}
|
|
allAnnoMatrices.forEach((hints, annoMatrix) => annoMatrix._gc(hints));
|
|
}
|
|
|
|
export default annoMatrixGC;
|