From ea32c54f57cd700a87dac91081d3c4903bd33489 Mon Sep 17 00:00:00 2001 From: Stefan Zermatten Date: Mon, 25 Apr 2022 13:57:39 +0200 Subject: [PATCH] Fixed massive writes to creature.variables on calc Now only writes changed variables, preventing oplog from being polluted with massive updates --- .../engine/computation/CreatureComputation.js | 3 ++- .../computation/buildCreatureComputation.js | 2 +- .../writeComputation/writeScope.js | 27 ++++++++++++++++--- app/imports/api/engine/computeCreature.js | 2 +- 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/app/imports/api/engine/computation/CreatureComputation.js b/app/imports/api/engine/computation/CreatureComputation.js index 90e28f44..278b3276 100644 --- a/app/imports/api/engine/computation/CreatureComputation.js +++ b/app/imports/api/engine/computation/CreatureComputation.js @@ -2,7 +2,7 @@ import { EJSON } from 'meteor/ejson'; import createGraph from 'ngraph.graph'; export default class CreatureComputation { - constructor(properties){ + constructor(properties, creature){ // Set up fields this.originalPropsById = {}; this.propsById = {}; @@ -11,6 +11,7 @@ export default class CreatureComputation { this.props = properties; this.dependencyGraph = createGraph(); this.errors = []; + this.creature = creature; // Store properties for easy access later properties.forEach(prop => { diff --git a/app/imports/api/engine/computation/buildCreatureComputation.js b/app/imports/api/engine/computation/buildCreatureComputation.js index 8e81e314..ebf06518 100644 --- a/app/imports/api/engine/computation/buildCreatureComputation.js +++ b/app/imports/api/engine/computation/buildCreatureComputation.js @@ -54,7 +54,7 @@ function getCreature(creatureId){ export function buildComputationFromProps(properties, creature){ - const computation = new CreatureComputation(properties); + const computation = new CreatureComputation(properties, creature); // Dependency graph where edge(a, b) means a depends on b // The graph includes all dependencies even of inactive properties // such that any properties changing without changing their dependencies diff --git a/app/imports/api/engine/computation/writeComputation/writeScope.js b/app/imports/api/engine/computation/writeComputation/writeScope.js index 3661df4a..c318fb9e 100644 --- a/app/imports/api/engine/computation/writeComputation/writeScope.js +++ b/app/imports/api/engine/computation/writeComputation/writeScope.js @@ -1,10 +1,31 @@ import Creatures from '/imports/api/creature/creatures/Creatures.js'; +import { EJSON } from 'meteor/ejson'; -export default function writeScope(creatureId, scope){ - // Remove large properties that aren't likely to be accessed +export default function writeScope(creatureId, computation) { + const scope = computation.scope; + const variables = computation.creature.variables || {}; + let $set; for (const key in scope){ + // Remove large properties that aren't likely to be accessed delete scope[key].parent; delete scope[key].ancestors; + + // Remove empty keys + for (const subKey in scope[key]) { + if (scope[key][subKey] === undefined) { + delete scope[key][subKey] + } + } + + // Only update changed fields + if (!EJSON.equals(variables[key], scope[key])) { + if (!$set) $set = {}; + + // Set the changed key in the creature variables + $set[`variables.${key}`] = scope[key]; + } + } + if ($set) { + Creatures.update(creatureId, {$set}); } - Creatures.update(creatureId, {$set: {variables: scope}}); } diff --git a/app/imports/api/engine/computeCreature.js b/app/imports/api/engine/computeCreature.js index a45188bf..cc3c0da9 100644 --- a/app/imports/api/engine/computeCreature.js +++ b/app/imports/api/engine/computeCreature.js @@ -10,7 +10,7 @@ export default function computeCreature(creatureId){ try { computeCreatureComputation(computation); writeAlteredProperties(computation); - writeScope(creatureId, computation.scope); + writeScope(creatureId, computation); } catch (e){ const errorText = e.reason || e.message || e.toString(); computation.errors.push({