[backend/federation] Limit collection iteration
This commit is contained in:
parent
deabdc4eec
commit
e8e437b9f1
1 changed files with 19 additions and 0 deletions
|
@ -91,17 +91,36 @@ public class ObjectResolver(
|
||||||
foreach (var item in collection.Items)
|
foreach (var item in collection.Items)
|
||||||
yield return item;
|
yield return item;
|
||||||
|
|
||||||
|
// we only limit based on pages here. the consumer of this iterator may
|
||||||
|
// additionally limit per-item via System.Linq.Async Take()
|
||||||
|
var pageLimit = 50;
|
||||||
|
|
||||||
|
// some remote software (e.g. fedibird) can get in a state where page.next == page.id
|
||||||
|
var visitedPages = new HashSet<string>();
|
||||||
|
|
||||||
var page = collection.First;
|
var page = collection.First;
|
||||||
while (page != null)
|
while (page != null)
|
||||||
{
|
{
|
||||||
if (page.IsUnresolved)
|
if (page.IsUnresolved)
|
||||||
page = await ResolveObject(page, force: true) as ASCollectionPage;
|
page = await ResolveObject(page, force: true) as ASCollectionPage;
|
||||||
|
|
||||||
if (page == null) break;
|
if (page == null) break;
|
||||||
|
|
||||||
if (page.Items != null)
|
if (page.Items != null)
|
||||||
foreach (var item in page.Items)
|
foreach (var item in page.Items)
|
||||||
yield return item;
|
yield return item;
|
||||||
|
|
||||||
|
if (page.Next?.Id != null)
|
||||||
|
{
|
||||||
|
if (visitedPages.Contains(page.Next.Id))
|
||||||
|
break;
|
||||||
|
|
||||||
|
visitedPages.Add(page.Next.Id);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (--pageLimit <= 0)
|
||||||
|
break;
|
||||||
|
|
||||||
page = page.Next;
|
page = page.Next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue