Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

NPE from scheduleFeedbackSessionPublishedEmail #10974

Closed
damithc opened this issue Feb 21, 2021 · 11 comments · Fixed by #10990
Closed

NPE from scheduleFeedbackSessionPublishedEmail #10974

damithc opened this issue Feb 21, 2021 · 11 comments · Fixed by #10990
Labels
c.Task Other non-user-facing works, e.g. refactoring, adding tests p.High Significant impact; would like to do in the next few releases

Comments

@damithc
Copy link
Contributor

damithc commented Feb 21, 2021

This error happened soon after both times I deployed v7.10.0 (I rolled back both times). First time I wasn't sure if the error is caused by a change in the new version. After the second time, seems too much of a coincidence.

v7.10.0

teammates.common.util.Logger severe: NullPointerException caught by WebApiServlet: (Logger.java:52)
java.lang.NullPointerException
at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:878)
at com.google.cloud.tasks.v2.QueueName.(QueueName.java:49)
at com.google.cloud.tasks.v2.QueueName.(QueueName.java:31)
at com.google.cloud.tasks.v2.QueueName$Builder.build(QueueName.java:220)
at com.google.cloud.tasks.v2.QueueName.of(QueueName.java:74)
at teammates.logic.core.TaskQueuesLogic.addDeferredTask(TaskQueuesLogic.java:87)
at teammates.logic.core.TaskQueuesLogic.addTask(TaskQueuesLogic.java:49)
at teammates.logic.api.TaskQueuer.addTask(TaskQueuer.java:29)
at teammates.logic.api.TaskQueuer.scheduleFeedbackSessionPublishedEmail(TaskQueuer.java:107)
at teammates.ui.webapi.PublishFeedbackSessionAction.execute(PublishFeedbackSessionAction.java:43)
at teammates.ui.webapi.PublishFeedbackSessionAction.execute(PublishFeedbackSessionAction.java:15)
at teammates.ui.webapi.WebApiServlet.invokeServlet(WebApiServlet.java:93)
at teammates.ui.webapi.WebApiServlet.doPost(WebApiServlet.java:47)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:848)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1780)
at teammates.ui.webapi.OriginCheckFilter.doFilter(OriginCheckFilter.java:98)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1767)
at com.googlecode.objectify.ObjectifyFilter.doFilter(ObjectifyFilter.java:48)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1767)
at com.google.apphosting.utils.servlet.JdbcMySqlConnectionCleanupFilter.doFilter(JdbcMySqlConnectionCleanupFilter.java:60)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1767)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:583)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:524)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134)
at com.google.apphosting.runtime.jetty9.ParseBlobUploadHandler.handle(ParseBlobUploadHandler.java:111)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1182)
at com.google.apphosting.runtime.jetty9.AppEngineWebAppContext.doHandle(AppEngineWebAppContext.java:187)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:513)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1112)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at com.google.apphosting.runtime.jetty9.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:293)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134)
at org.eclipse.jetty.server.Server.handle(Server.java:539)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:333)
at com.google.apphosting.runtime.jetty9.RpcConnection.handle(RpcConnection.java:216)
at com.google.apphosting.runtime.jetty9.RpcConnector.serviceRequest(RpcConnector.java:81)
at com.google.apphosting.runtime.jetty9.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:134)
at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.dispatchServletRequest(JavaRuntime.java:772)
at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.dispatchRequest(JavaRuntime.java:735)
at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:705)
at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:261)
at java.lang.Thread.run(Thread.java:748)

Caused by [POST] https://teammatesv4.appspot.com/webapi/session/publish

Let me know you need more info.

@damithc damithc added p.High Significant impact; would like to do in the next few releases s.ToInvestigate The issue sounds complete but needs validation by a core team member labels Feb 21, 2021
@madanalogy
Copy link
Contributor

Let us know if this issue is not resolved with #10930 (comment)

@damithc
Copy link
Contributor Author

damithc commented Feb 23, 2021

After setting the region in build.properties, I did not receive any errors. Unfortunately, it's because even the error reporting mechanism (which relies on the task queue) stopped working. Only realized the problem when a few users reported not being able to send reminders to students. I rolled back to the previous version after that.

There are several errors in the log, but all mention permission issues.

teammates.common.util.Logger severe: PermissionDeniedException caught by WebApiServlet: (Logger.java:52)
com.google.api.gax.rpc.PermissionDeniedException: io.grpc.StatusRuntimeException: PERMISSION_DENIED: The principal (user or service account) lacks IAM permission "cloudtasks.tasks.create" for the resource "projects/teammatesv4/locations/us-central1/queues/feedback-session-remind-particular-users-email-queue" (or the resource may not exist).
at com.google.api.gax.rpc.ApiExceptionFactory.createException(ApiExceptionFactory.java:55)
at com.google.api.gax.grpc.GrpcApiExceptionFactory.create(GrpcApiExceptionFactory.java:72)
at com.google.api.gax.grpc.GrpcApiExceptionFactory.create(GrpcApiExceptionFactory.java:60)
at com.google.api.gax.grpc.GrpcExceptionCallable$ExceptionTransformingFuture.onFailure(GrpcExceptionCallable.java:97)
at com.google.api.core.ApiFutures$1.onFailure(ApiFutures.java:68)
at com.google.common.util.concurrent.Futures$CallbackListener.run(Futures.java:1074)
at com.google.common.util.concurrent.DirectExecutor.execute(DirectExecutor.java:30)
at com.google.common.util.concurrent.AbstractFuture.executeListener(AbstractFuture.java:1213)
at com.google.common.util.concurrent.AbstractFuture.complete(AbstractFuture.java:983)
at com.google.common.util.concurrent.AbstractFuture.setException(AbstractFuture.java:771)
at io.grpc.stub.ClientCalls$GrpcFuture.setException(ClientCalls.java:563)
at io.grpc.stub.ClientCalls$UnaryStreamToFuture.onClose(ClientCalls.java:533)
at io.grpc.internal.DelayedClientCall$DelayedListener$3.run(DelayedClientCall.java:464)
at io.grpc.internal.DelayedClientCall$DelayedListener.delayOrExecute(DelayedClientCall.java:428)
at io.grpc.internal.DelayedClientCall$DelayedListener.onClose(DelayedClientCall.java:461)
at io.grpc.internal.ClientCallImpl.closeObserver(ClientCallImpl.java:617)
at io.grpc.internal.ClientCallImpl.access$300(ClientCallImpl.java:70)
at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInternal(ClientCallImpl.java:803)
at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInContext(ClientCallImpl.java:782)
at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37)
at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:295)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Suppressed: com.google.api.gax.rpc.AsyncTaskException: Asynchronous task failed
at com.google.api.gax.rpc.ApiExceptions.callAndTranslateApiException(ApiExceptions.java:57)
at com.google.api.gax.rpc.UnaryCallable.call(UnaryCallable.java:112)
at com.google.cloud.tasks.v2.CloudTasksClient.createTask(CloudTasksClient.java:1259)
at com.google.cloud.tasks.v2.CloudTasksClient.createTask(CloudTasksClient.java:1242)
at teammates.logic.core.TaskQueuesLogic.addDeferredTask(TaskQueuesLogic.java:112)
at teammates.logic.core.TaskQueuesLogic.addTask(TaskQueuesLogic.java:49)
at teammates.logic.api.TaskQueuer.addTask(TaskQueuer.java:29)
at teammates.logic.api.TaskQueuer.scheduleFeedbackSessionRemindersForParticularUsers(TaskQueuer.java:92)
at teammates.ui.webapi.RemindFeedbackSessionSubmissionAction.execute(RemindFeedbackSessionSubmissionAction.java:47)
at teammates.ui.webapi.RemindFeedbackSessionSubmissionAction.execute(RemindFeedbackSessionSubmissionAction.java:12)
at teammates.ui.webapi.WebApiServlet.invokeServlet(WebApiServlet.java:93)
at teammates.ui.webapi.WebApiServlet.doPost(WebApiServlet.java:47)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:848)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1780)
at teammates.ui.webapi.OriginCheckFilter.doFilter(OriginCheckFilter.java:98)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1767)
at com.googlecode.objectify.ObjectifyFilter.doFilter(ObjectifyFilter.java:48)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1767)
at com.google.apphosting.utils.servlet.JdbcMySqlConnectionCleanupFilter.doFilter(JdbcMySqlConnectionCleanupFilter.java:60)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1767)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:583)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:524)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134)
at com.google.apphosting.runtime.jetty9.ParseBlobUploadHandler.handle(ParseBlobUploadHandler.java:111)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1182)
at com.google.apphosting.runtime.jetty9.AppEngineWebAppContext.doHandle(AppEngineWebAppContext.java:187)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:513)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1112)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at com.google.apphosting.runtime.jetty9.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:293)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134)
at org.eclipse.jetty.server.Server.handle(Server.java:539)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:333)
at com.google.apphosting.runtime.jetty9.RpcConnection.handle(RpcConnection.java:216)
at com.google.apphosting.runtime.jetty9.RpcConnector.serviceRequest(RpcConnector.java:81)
at com.google.apphosting.runtime.jetty9.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:134)
at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.dispatchServletRequest(JavaRuntime.java:772)
at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.dispatchRequest(JavaRuntime.java:735)
at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:705)
at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:261)
... 1 more
Caused by: io.grpc.StatusRuntimeException: PERMISSION_DENIED: The principal (user or service account) lacks IAM permission "cloudtasks.tasks.create" for the resource "projects/teammatesv4/locations/us-central1/queues/feedback-session-remind-particular-users-email-queue" (or the resource may not exist).
at io.grpc.Status.asRuntimeException(Status.java:533)
... 17 more

@damithc
Copy link
Contributor Author

damithc commented Feb 23, 2021

For the record, app info:

authDomain: gmail.com
codeBucket: staging.teammatesv4.appspot.com
databaseType: CLOUD_DATASTORE
defaultBucket: teammatesv4.appspot.com
defaultCookieExpiration: 1209600s
defaultHostname: teammatesv4.appspot.com
gcrDomain: us.gcr.io
id: teammatesv4
locationId: us-central
name: apps/teammatesv4
servingStatus: SERVING

@damithc
Copy link
Contributor Author

damithc commented Feb 23, 2021

Solved by giving 'Editor' permissions to the gserviceaccount
image

Thanks @wkurniawan07 for the solution info

@damithc damithc closed this as completed Feb 23, 2021
@damithc
Copy link
Contributor Author

damithc commented Feb 23, 2021

The 'log compilation' cron job that runs every 5 minutes still seems to have some problem.

io.grpc.internal.ManagedChannelOrphanWrapper$ManagedChannelReference cleanQueue: ~* Channel ManagedChannelImpl{logId=9, target=logging.googleapis.com:443} was not shutdown properly!!! *~ (ManagedChannelOrphanWrapper.java:159)
Make sure to call shutdown()/shutdownNow() and wait until awaitTermination() returns true.
java.lang.RuntimeException: ManagedChannel allocation site
at io.grpc.internal.ManagedChannelOrphanWrapper$ManagedChannelReference.(ManagedChannelOrphanWrapper.java:93)
at io.grpc.internal.ManagedChannelOrphanWrapper.(ManagedChannelOrphanWrapper.java:53)
at io.grpc.internal.ManagedChannelOrphanWrapper.(ManagedChannelOrphanWrapper.java:44)
at io.grpc.internal.ManagedChannelImplBuilder.build(ManagedChannelImplBuilder.java:612)
at io.grpc.internal.AbstractManagedChannelImplBuilder.build(AbstractManagedChannelImplBuilder.java:261)
at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider.createSingleChannel(InstantiatingGrpcChannelProvider.java:340)
at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider.access$1600(InstantiatingGrpcChannelProvider.java:73)
at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider$1.createSingleChannel(InstantiatingGrpcChannelProvider.java:214)
at com.google.api.gax.grpc.ChannelPool.create(ChannelPool.java:72)
at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider.createChannel(InstantiatingGrpcChannelProvider.java:221)
at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider.getTransportChannel(InstantiatingGrpcChannelProvider.java:204)
at com.google.api.gax.rpc.ClientContext.create(ClientContext.java:169)
at com.google.api.gax.rpc.ClientContext.create(ClientContext.java:132)
at com.google.cloud.logging.spi.v2.GrpcLoggingRpc.(GrpcLoggingRpc.java:142)
at com.google.cloud.logging.LoggingOptions$DefaultLoggingRpcFactory.create(LoggingOptions.java:61)
at com.google.cloud.logging.LoggingOptions$DefaultLoggingRpcFactory.create(LoggingOptions.java:55)
at com.google.cloud.ServiceOptions.getRpc(ServiceOptions.java:561)
at com.google.cloud.logging.LoggingOptions.getLoggingRpcV2(LoggingOptions.java:129)
at com.google.cloud.logging.LoggingImpl.(LoggingImpl.java:120)
at com.google.cloud.logging.LoggingOptions$DefaultLoggingFactory.create(LoggingOptions.java:46)
at com.google.cloud.logging.LoggingOptions$DefaultLoggingFactory.create(LoggingOptions.java:41)
at com.google.cloud.ServiceOptions.getService(ServiceOptions.java:541)
at teammates.ui.webapi.CompileLogsAction.getErrorLogs(CompileLogsAction.java:44)
at teammates.ui.webapi.CompileLogsAction.execute(CompileLogsAction.java:33)
at teammates.ui.webapi.CompileLogsAction.execute(CompileLogsAction.java:29)
at teammates.ui.webapi.WebApiServlet.invokeServlet(WebApiServlet.java:93)
at teammates.ui.webapi.WebApiServlet.doGet(WebApiServlet.java:42)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:848)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1780)
at com.googlecode.objectify.ObjectifyFilter.doFilter(ObjectifyFilter.java:48)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1767)
at com.google.apphosting.utils.servlet.JdbcMySqlConnectionCleanupFilter.doFilter(JdbcMySqlConnectionCleanupFilter.java:60)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1767)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:583)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:524)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134)
at com.google.apphosting.runtime.jetty9.ParseBlobUploadHandler.handle(ParseBlobUploadHandler.java:111)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1182)
at com.google.apphosting.runtime.jetty9.AppEngineWebAppContext.doHandle(AppEngineWebAppContext.java:187)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:513)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1112)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at com.google.apphosting.runtime.jetty9.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:293)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134)
at org.eclipse.jetty.server.Server.handle(Server.java:539)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:333)
at com.google.apphosting.runtime.jetty9.RpcConnection.handle(RpcConnection.java:216)
at com.google.apphosting.runtime.jetty9.RpcConnector.serviceRequest(RpcConnector.java:81)
at com.google.apphosting.runtime.jetty9.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:134)
at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.dispatchServletRequest(JavaRuntime.java:772)
at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.dispatchRequest(JavaRuntime.java:735)
at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:705)
at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:261)
at java.lang.Thread.run(Thread.java:748)

@damithc damithc reopened this Feb 23, 2021
@wkurniawan07
Copy link
Member

wkurniawan07 commented Feb 23, 2021

That is a known issue (googleapis/google-cloud-java#3693) and is not a cause of concern (at best, just some annoyance). It does not affect the logs being fetched. Can think of it as something like resource failed to be closed.

@damithc
Copy link
Contributor Author

damithc commented Feb 23, 2021

That is a known issue (googleapis/google-cloud-java#3693) and is not a cause of concern (at best, just some annoyance). It does not affect the logs being fetched. Can think of it as something like resource failed to be closed.

I see. Well, this means I'm going to receive an error log email every 5 minutes. I can't simply ignore them either, as the email can contain other error messages. So, looks like we'll have to find a way around it? Perhaps we can update the log compilation task to ignore this specific error? googleapis/google-cloud-java#3693 says it is fixed and to be released but that was more than 1 year ago.

@wkurniawan07
Copy link
Member

Page<LogEntry> entries = logging.listLogEntries(
EntryListOption.filter(logOptions.stream().collect(Collectors.joining("\n")))
);
for (LogEntry logEntry : entries.iterateAll()) {
logs.add(logEntry);
}
return logs;

@damithc can try adding this before the for block above:

        try {
            logging.close();
        } catch (Exception e) {
            // ignore exception when closing resource
        }

@damithc
Copy link
Contributor Author

damithc commented Feb 23, 2021

@damithc can try adding this before the for block above:

That seems to have done the trick. Thanks @wkurniawan07

@madanalogy madanalogy added c.Task Other non-user-facing works, e.g. refactoring, adding tests and removed s.ToInvestigate The issue sounds complete but needs validation by a core team member labels Feb 23, 2021
@madanalogy
Copy link
Contributor

@damithc can try adding this before the for block above:

I'm guessing the task now is to have this in the main code base by the next release

@damithc
Copy link
Contributor Author

damithc commented Feb 24, 2021

I'm guessing the task now is to have this in the main code base by the next release

Yes, I think so.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
c.Task Other non-user-facing works, e.g. refactoring, adding tests p.High Significant impact; would like to do in the next few releases
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants