When I migrate servers to a new update and sometimes when joining a new server, for some reason, ProfileStore:LoadProfileAsync has started to take a full minute to load. The first print here fires as the player joins, but the print("TEST1") doesn’t fire until a full minute after the first print.
local function PlayerAdded(player: Player)
print("TEST")
local profile = ProfileStore:LoadProfileAsync("Player_"..player.UserId.."_Save5")
print("TEST1")
if not profile then player:Kick(KICK_MESSAGE) return end
profile:AddUserId(player.UserId)
profile:Reconcile()
profile:ListenToRelease(function()
Manager.Profiles[player] = nil
player:Kick(KICK_MESSAGE)
end)
if player:IsDescendantOf(Players) == true then
Manager.Profiles[player] = profile
CreateDataFolder(player)
else
profile:Release()
end
end
This has only recently started happening in my game. I am not too familiar with how ProfileService works so I don’t know what would cause it to take so long to load.
Could it be that there’s just too much data? I do have about 50 different variables in my Template script for ProfileService. But it’s weird that before today it didn’t take any extra time to load at all.
This issue is likely due to the way you handle releasing the profiles when the server crashes/restarts. Do you have logic similar to the code below that attempts to release everyone’s profile when the server is about to close?
game.Players.PlayerRemoving:Connect(function(player: Player)
if Manager.Profiles[player] then
Manager.Profiles[player]:Release()
Manager.Profiles[player] = nil
end
end)
game:BindToClose(function()
for _, profile in Manager.Profiles do
profile:Release()
end
end)
Ok so I’m not sure why this fixed my problem, but it did. I had my data script create a BoolValue and parent it to each player when they join called hasLoaded. I set it to true after the profile loaded, and stopped my other scripts from doing anything until hasLoaded == true.
local function PlayerAdded(player: Player)
local hasLoaded = Instance.new("BoolValue")
hasLoaded.Name = "hasLoaded"
hasLoaded.Value = false
hasLoaded.Parent = player
local profile = ProfileStore:LoadProfileAsync("Player_"..player.UserId.."_Save5")
hasLoaded.Value = true
if not profile then player:Kick(KICK_MESSAGE) return end
profile:AddUserId(player.UserId)
profile:Reconcile()
profile:ListenToRelease(function()
Manager.Profiles[player] = nil
player:Kick(KICK_MESSAGE)
end)
if player:IsDescendantOf(Players) == true then
Manager.Profiles[player] = profile
CreateDataFolder(player)
else
profile:Release()
end
end
And here’s the script where I manage all of my client scripts:
local player = game.Players.LocalPlayer
local hasLoaded = player:WaitForChild("hasLoaded")
while hasLoaded.Value == false do
task.wait(1)
end
-- Variables for my scripts and calls to their start functions
After doing this, the load times are basically instantaneous again.