-
Type:
Bug
-
Resolution: Fixed
-
Priority:
High
-
None
-
Affects Version/s: 8.20.10
-
Component/s: Data Center - Apps
-
None
-
8.2
-
38
-
Severity 3 - Minor
-
229
Issue Summary
Jira Server for Slack (Official) app started to send duplicate notifications after 2022-10-14 without any configuration changes made.
This is reproducible on Data Center: yes
Steps to Reproduce
- Have Jira send a Slack notification.
Expected Results
A single Slack notification is shown.
Actual Results
Duplicated Slack notifications are shown.
The application logs will show the following errors:
2022-10-14 10:22:38,231+0000 jira-slack-plugin:thread-5 WARN xxxxxx 578x6850920x11 quxdfr xxxxxxxxxxxxxx /secure/AjaxIssueAction.jspa [c.a.p.slack.util.ResponseMapper] Error when performing request to Slack: chat.postMessage/G0186MULC7R
com.google.gson.JsonParseException: Unsupported layout block type: rich_text
at com.github.seratch.jslack.common.json.GsonLayoutBlockFactory.getLayoutClassInstance(GsonLayoutBlockFactory.java:36)
at com.github.seratch.jslack.common.json.GsonLayoutBlockFactory.deserialize(GsonLayoutBlockFactory.java:19)
at com.github.seratch.jslack.common.json.GsonLayoutBlockFactory.deserialize(GsonLayoutBlockFactory.java:12)
at com.google.gson.internal.bind.TreeTypeAdapter.read(TreeTypeAdapter.java:69)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:82)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:131)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:222)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:131)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:222)
at com.google.gson.Gson.fromJson(Gson.java:963)
at com.google.gson.Gson.fromJson(Gson.java:928)
at com.google.gson.Gson.fromJson(Gson.java:877)
at com.google.gson.Gson.fromJson(Gson.java:848)
at com.github.seratch.jslack.common.http.SlackHttpClient.parseJsonResponse(SlackHttpClient.java:81)
at com.github.seratch.jslack.api.methods.impl.MethodsClientImpl.doPostFormWithToken(MethodsClientImpl.java:913)
at com.github.seratch.jslack.api.methods.impl.MethodsClientImpl.chatPostMessage(MethodsClientImpl.java:304)
at com.atlassian.plugins.slack.api.client.DefaultSlackClient.lambda$postMessage$23(DefaultSlackClient.java:494)
at com.atlassian.plugins.slack.util.ResponseMapper.toEither(ResponseMapper.java:25)
at com.atlassian.plugins.slack.api.client.DefaultSlackClient.postMessage(DefaultSlackClient.java:492)
at com.atlassian.jira.plugins.slack.service.task.impl.SendNotificationTask.lambda$null$0(SendNotificationTask.java:89)
at java.base/java.util.Optional.flatMap(Optional.java:294)
at com.atlassian.plugins.slack.api.client.RetryLoaderHelper.lambda$retryWithUserTokens$1(RetryLoaderHelper.java:25)
at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:271)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
at java.base/java.util.Spliterators$ArraySpliterator.tryAdvance(Spliterators.java:958)
at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:127)
at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:502)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:488)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
at java.base/java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:150)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:543)
at com.atlassian.plugins.slack.api.client.RetryLoaderHelper.retryWithUserTokens(RetryLoaderHelper.java:26)
at com.atlassian.jira.plugins.slack.service.task.impl.SendNotificationTask.lambda$call$1(SendNotificationTask.java:87)
at com.atlassian.jira.plugins.slack.service.task.impl.DefaultTaskExecutorService.lambda$submitTask$1(DefaultTaskExecutorService.java:94)
at com.google.common.util.concurrent.TrustedListenableFutureTask$TrustedFutureInterruptibleTask.runInterruptibly(TrustedListenableFutureTask.java:125)
at com.google.common.util.concurrent.InterruptibleTask.run(InterruptibleTask.java:57)
at com.google.common.util.concurrent.TrustedListenableFutureTask.run(TrustedListenableFutureTask.java:78)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:829)
Workaround
A new version of the Jira Server for Slack (Official) was released with a hotfix for this issue (version 3.0.2)
Note that this version will still show errors in the logs but it will prevent duplicate messages until a permanent fix is delivered.
Notes
Investigation done by the development team shows Slack's chat.postMessage REST method suddenly started returning blocks that include rich_text, which is undocumented and not properly handled by the Jira Server for Slack app, causing duplicate notifications.