From b3c68bf16d2020ba340d5323a52fee83de0d5494 Mon Sep 17 00:00:00 2001 From: OttoHatt <68089630+OttoHatt@users.noreply.github.com> Date: Mon, 22 Apr 2024 00:17:11 +0100 Subject: [PATCH 1/2] fix: DataStoreStage doesn't delete keys when overwritten with a table --- .../src/Server/Modules/DataStoreStage.lua | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/datastore/src/Server/Modules/DataStoreStage.lua b/src/datastore/src/Server/Modules/DataStoreStage.lua index 8e1dfeafdd..e90eeedf40 100644 --- a/src/datastore/src/Server/Modules/DataStoreStage.lua +++ b/src/datastore/src/Server/Modules/DataStoreStage.lua @@ -514,12 +514,19 @@ function DataStoreStage:Overwrite(data) if type(data) == "table" then local newSaveSnapshot = {} - local remaining = Set.fromKeys(self._stores) for key, store in pairs(self._stores) do -- Update each store store:Overwrite(data[key]) end + local remaining = Set.fromKeys(self._stores) + if typeof(self._saveDataSnapshot) == "table" then + Set.unionUpdate(remaining, Set.fromKeys(self._saveDataSnapshot)) + end + if typeof(self._baseDataSnapshot) == "table" then + Set.unionUpdate(remaining, Set.fromKeys(self._baseDataSnapshot)) + end + for key, value in pairs(data) do remaining[key] = nil if self._stores[key] then @@ -530,7 +537,11 @@ function DataStoreStage:Overwrite(data) end for key, _ in pairs(remaining) do - self._stores[key]:Overwrite(DataStoreDeleteToken) + if self._stores[key] then + self._stores[key]:Overwrite(DataStoreDeleteToken) + else + newSaveSnapshot[key] = DataStoreDeleteToken + end end self._saveDataSnapshot = table.freeze(newSaveSnapshot) @@ -1021,4 +1032,4 @@ function DataStoreStage:_checkIntegrity() end -return DataStoreStage \ No newline at end of file +return DataStoreStage From f8db7e8b94daf8881e0d3867a80cd4b7dc5c0e03 Mon Sep 17 00:00:00 2001 From: James Onnen Date: Wed, 25 Sep 2024 11:01:08 -0700 Subject: [PATCH 2/2] Update DataStoreStage.lua readjust code to remove extra deletion logic at top --- .../src/Server/Modules/DataStoreStage.lua | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/datastore/src/Server/Modules/DataStoreStage.lua b/src/datastore/src/Server/Modules/DataStoreStage.lua index e90eeedf40..881c5e72f4 100644 --- a/src/datastore/src/Server/Modules/DataStoreStage.lua +++ b/src/datastore/src/Server/Modules/DataStoreStage.lua @@ -514,21 +514,18 @@ function DataStoreStage:Overwrite(data) if type(data) == "table" then local newSaveSnapshot = {} - for key, store in pairs(self._stores) do - -- Update each store - store:Overwrite(data[key]) - end - - local remaining = Set.fromKeys(self._stores) + -- Capture all keys + local remainingKeys = Set.fromKeys(self._stores) if typeof(self._saveDataSnapshot) == "table" then - Set.unionUpdate(remaining, Set.fromKeys(self._saveDataSnapshot)) + Set.unionUpdate(remainingKeys, Set.fromKeys(self._saveDataSnapshot)) end if typeof(self._baseDataSnapshot) == "table" then - Set.unionUpdate(remaining, Set.fromKeys(self._baseDataSnapshot)) + Set.unionUpdate(remainingKeys, Set.fromKeys(self._baseDataSnapshot)) end + -- TODO: Overwriting stores is non-atomic and fires off multiple changes. Re-entrance could break our stuff. for key, value in pairs(data) do - remaining[key] = nil + remainingKeys[key] = nil if self._stores[key] then self._stores[key]:Overwrite(value) else @@ -536,7 +533,7 @@ function DataStoreStage:Overwrite(data) end end - for key, _ in pairs(remaining) do + for key, _ in pairs(remainingKeys) do if self._stores[key] then self._stores[key]:Overwrite(DataStoreDeleteToken) else