Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 16 additions & 8 deletions src/datastore/src/Server/Modules/DataStoreStage.lua
Original file line number Diff line number Diff line change
Expand Up @@ -514,23 +514,31 @@ 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
newSaveSnapshot[key] = value
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)
Expand Down Expand Up @@ -1021,4 +1029,4 @@ function DataStoreStage:_checkIntegrity()
end


return DataStoreStage
return DataStoreStage
Loading