Description

For example, if you have the engine in a different stream and specify an exact CL to use on the import path, you then update that import path to a later change with a higher CL number than that of the stream the path is contained within. Agent workspaces will not sync to that newer stream spec until horde is restarted, or a newer CL is created on the stream.

 

[Link Removed]

 
After some initial noodling with CC, this seems to be a legitimate bug, caused by us not resetting the MaxChange when a stream definition changes. We do reset the per steam MinChange:
 
// If the hash of any stream definition has changed, invalidate the replicated changes. bool modified = false; foreach (StreamInfo streamInfo in streamInfos) { IoHash prevHash; if (state.Streams.TryGetValue(streamInfo.StreamConfig.Id, out prevHash) && prevHash != streamInfo.Hash) { _logger.LogInformation("Invalidating cached commits for stream

{StreamId}

due to definition change ({OldHash} -> {NewHash})", streamInfo.StreamConfig.Id, prevHash, streamInfo.Hash); state.MinChanges.Remove(streamInfo.StreamConfig.Id); modified = true; } }
but never MaxChange, and thus end up using a stale MaxChange value in{{ CachedCommitSource.FindAsync()}}
 
if (maxChange != null) { filter &= Builders<CachedCommitDoc>.Filter.Lte(x => x.Number, Math.Min(maxChange.Value, clusterState.MaxChange)); } else { filter &= Builders<CachedCommitDoc>.Filter.Lte(x => x.Number, clusterState.MaxChange); }
and thinking we have all the necessary changes in the cache.
 
 
I think it should be safe to reset that MaxChange value as well, since it's a one time cost per stream definition change and we cap it at 250 CLs and lazy backfill the rest. But wanted to open it up for discussion in case there's some reason or performance concern I'm overlooking!
 
I'm also a bit surprised we don't seem to see this internally, but I'm not sure if we use ChangeView regularly.
 
The licensee also already has a workaround of restarting the Horde server, so this isn't all that urgent
 

Steps to Reproduce
  • Create two streaming depots to mimic a project depot, and an engine depot
  • Create a branch in each
  • Create a dummy commit in the engine stream of a single file. CL 1
  • Create a dummy commit in the project stream of a single file CL 2
    Create another dummy commit in the engine stream of a new file, CL 3, such that the engine stream has a larger CL then that of the Project Stream
  • In the project Stream, configure the paths to import the engine stream at CL 1 (i.e. import+ Engine/... //UnrealEngine/engine-main/...@1 or the actual first commit CL)
  • Create a dummy horde project to pull the repo
  • Check the workspace on the agent, observe the change as expected on @CL1
  • Change the project stream path to now use CL3 for the engine
  • Do another horde build from the latest change
  • Observe it does not sync the engine to the latest build number

Work Arounds:
Create a dummy commit on the project stream
Or
Restart horde
It will then sync the agents to the correct stream view.

Have Comments or More Details?

There's no existing public thread on this issue, so head over to Questions & Answers just mention UE-357271 in the post.

0
Login to Vote

Backlogged
ComponentUE - Foundation - Horde
Affects Versions5.7.1
CreatedDec 9, 2025
UpdatedDec 9, 2025
View Jira Issue