octokit / octokit.graphql.net

A GitHub GraphQL client library for .NET

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

NullReferenceException when API quota is exceeded

terrajobst opened this issue · comments

Update: The issue seems to be independent of the query and occurs when the API rate limit is exceeded.

When executing this query:

            var query = new Query()
                .Organization(orgName)
                .Team(Var("teamSlug"))
                .Repositories(first: 100, after: Var("after"))
                .Select(connection => new
                {
                    connection.PageInfo.EndCursor,
                    connection.PageInfo.HasNextPage,
                    connection.TotalCount,
                    Items = connection.Edges.Select(e => new
                    {
                        e.Node.Name,
                        e.Permission
                    }).ToList(),
                }).Compile();

            var result = new List<CachedTeamAccess>();

            foreach (var teamSlug in teamSlugs)
            {
                var vars = new Dictionary<string, object>
                {
                    { "after", null },
                    { "teamSlug", teamSlug },
                };

                var current = await Connection.Run(query, vars);
                vars["after"] = current.HasNextPage ? current.EndCursor : null;

                while (vars["after"] != null)
                {
                    var page = await Connection.Run(query, vars);
                    current.Items.AddRange(page.Items);
                    vars["after"] = page.HasNextPage
                                        ? page.EndCursor
                                        : null;
                }

I sometimes get the following exceptions:

Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object.
   at Octokit.GraphQL.Core.Deserializers.ResponseDeserializer.DeserializeException(JToken error)
   at Octokit.GraphQL.Core.Deserializers.ResponseDeserializer.Deserialize[TResult](Func`2 deserialize, JObject data)
   at Octokit.GraphQL.Core.SimpleQuery`1.Runner.<RunPage>d__10.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at Octokit.GraphQL.ConnectionExtensions.<Run>d__2`1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at Microsoft.DotnetOrg.GitHubCaching.CacheLoader.<GetCachedTeamAccessAsync>d__15.MoveNext() in D:\a\1\s\src\Microsoft.DotnetOrg.GitHubCaching\CacheLoader.cs:line 260
Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object.
   at Octokit.GraphQL.Core.Deserializers.ResponseDeserializer.DeserializeException(JToken error)
   at Octokit.GraphQL.Core.Deserializers.ResponseDeserializer.Deserialize[TResult](Func`2 deserialize, JObject data)
   at Octokit.GraphQL.Core.SimpleQuery`1.Runner.<RunPage>d__10.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at Octokit.GraphQL.ConnectionExtensions.<Run>d__2`1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at Microsoft.DotnetOrg.GitHubCaching.CacheLoader.<GetCachedMembersAsync>d__16.MoveNext() in D:\a\1\s\src\Microsoft.DotnetOrg.GitHubCaching\CacheLoader.cs:line 309
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at Microsoft.DotnetOrg.GitHubCaching.CacheLoader.<LoadAsync>d__10.MoveNext() in D:\a\1\s\src\Microsoft.DotnetOrg.GitHubCaching\CacheLoader.cs:line 43
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at Microsoft.DotnetOrg.PolicyCop.Commands.CacheOrgCommand.<ExecuteAsync>d__7.MoveNext() in D:\a\1\s\src\policop\Commands\CacheOrgCommand.cs:line 38
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
   at Microsoft.DotnetOrg.PolicyCop.Program.<Main>d__0.MoveNext() in D:\a\1\s\src\policop\Program.cs:line 73
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
   at Microsoft.DotnetOrg.PolicyCop.Program.<Main>(String[] args)

Any ideas?

@terrajobst,

Any idea which element is coming up null? You could try adding some guards like this:

Items = connection.Edges.Select(e => new
                    {
                        Name = e.Node != null ? e.Node.Name : null,
                        e.Permission
                    }).ToList(),

I don't think we can use e.Node?.Name because it's an expression.

No, I've got zero idea and it very much nether repros locally :(

But by looking at the stack trace I'm inclined to say that bug isn't the schema but somewhere in your deserializer...

Update: The issue seems to be independent of the query and occurs when the API rate limit is exceeded.

👋 Hey Friends, this issue has been automatically marked as stale because it has no recent activity. It will be closed if no further activity occurs. Please add the Status: Pinned label if you feel that this issue needs to remain open/active. Thank you for your contributions and help in keeping things tidy!