diff --git a/src/datastore/src/Server/Modules/DataStoreStage.lua b/src/datastore/src/Server/Modules/DataStoreStage.lua index 8e1dfeafdd6..881c5e72f40 100644 --- a/src/datastore/src/Server/Modules/DataStoreStage.lua +++ b/src/datastore/src/Server/Modules/DataStoreStage.lua @@ -514,14 +514,18 @@ 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]) + -- Capture all keys + local remainingKeys = Set.fromKeys(self._stores) + if typeof(self._saveDataSnapshot) == "table" then + Set.unionUpdate(remainingKeys, Set.fromKeys(self._saveDataSnapshot)) + end + if typeof(self._baseDataSnapshot) == "table" then + 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 @@ -529,8 +533,12 @@ function DataStoreStage:Overwrite(data) end end - for key, _ in pairs(remaining) do - self._stores[key]:Overwrite(DataStoreDeleteToken) + for key, _ in pairs(remainingKeys) do + if self._stores[key] then + self._stores[key]:Overwrite(DataStoreDeleteToken) + else + newSaveSnapshot[key] = DataStoreDeleteToken + end end self._saveDataSnapshot = table.freeze(newSaveSnapshot) @@ -1021,4 +1029,4 @@ function DataStoreStage:_checkIntegrity() end -return DataStoreStage \ No newline at end of file +return DataStoreStage