Graylog2 / Graylog2/graylog2-server

Content pack installation does not rollback on failure

Open
#5,584 1 comment 0 reactions 0 assignees View on GitHub
bug content-packs triaged
Dominant language
Java
Stars
8.1k
Forks
1.1k
Avg merge
1d 20h
Merged PRs (30d)
217

Description

## Expected Behavior
After a failure during content pack installation, the installation should rollback all created entities, so the system is exactly as it was before trying to install the content pack.

## Current Behavior
A failure during content pack installation leaves some entities behind. On this case a dashboard.

Server stack trace

```
2019-01-23 17:35:04,383 ERROR: org.graylog2.shared.rest.exceptionmappers.AnyExceptionClassMapper - Unhandled exception in REST resource [3/1941]
org.graylog2.contentpacks.exceptions.ContentPackException: Failed to install content pack <9136f1bb-5d5f-49cb-bc49-9551f28c143a/1>
at org.graylog2.contentpacks.ContentPackService.installContentPack(ContentPackService.java:158) ~[graylog.jar:?]
at org.graylog2.contentpacks.ContentPackService.installContentPack(ContentPackService.java:99) ~[graylog.jar:?]
at org.graylog2.rest.resources.system.contentpacks.ContentPackResource.installContentPack(ContentPackResource.java:294) ~[graylog.jar:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_191]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_191]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_191]
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_191]
at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81) ~[graylog.jar:?]
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:144) ~[graylog.jar:?]
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:161) ~[graylog.jar:?]
at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:205) ~[graylog.jar:?]
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:99) ~[graylog.jar:?]
at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389) ~[graylog.jar:?]
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347) ~[graylog.jar:?]
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102) ~[graylog.jar:?]
at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:326) [graylog.jar:?]
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) [graylog.jar:?]
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) [graylog.jar:?]
at org.glassfish.jersey.internal.Errors.process(Errors.java:315) [graylog.jar:?]
at org.glassfish.jersey.internal.Errors.process(Errors.java:297) [graylog.jar:?]
at org.glassfish.jersey.internal.Errors.process(Errors.java:267) [graylog.jar:?]
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317) [graylog.jar:?]
at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305) [graylog.jar:?]
at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154) [graylog.jar:?]
at org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpContainer.service(GrizzlyHttpContainer.java:384) [graylog.jar:?]
at org.glassfish.grizzly.http.server.HttpHandler$1.run(HttpHandler.java:224) [graylog.jar:?]
at com.codahale.metrics.InstrumentedExecutorService$InstrumentedRunnable.run(InstrumentedExecutorService.java:181) [graylog.jar:?]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_191]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_191]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_191]
Caused by: org.graylog2.contentpacks.exceptions.ContentPackException: Couldn't create dashboard
at org.graylog2.contentpacks.facades.DashboardFacade.decode(DashboardFacade.java:163) ~[graylog.jar:?]
at org.graylog2.contentpacks.facades.DashboardFacade.createNativeEntity(DashboardFacade.java:141) ~[graylog.jar:?]
at org.graylog2.contentpacks.ContentPackService.installContentPack(ContentPackService.java:149) ~[graylog.jar:?]
... 29 more
Caused by: org.graylog2.contentpacks.exceptions.ContentPackException: Missing stream for dashboard widget "Security exceptions": EntityDescriptor{id=5c474805e0015c16e50bc32e, type=ModelType{name=stream, version=1}}
at org.graylog2.contentpacks.facades.DashboardFacade.createDashboardWidget(DashboardFacade.java:241) ~[graylog.jar:?]
at org.graylog2.contentpacks.facades.DashboardFacade.createDashboard(DashboardFacade.java:189) ~[graylog.jar:?]
at org.graylog2.contentpacks.facades.DashboardFacade.decode(DashboardFacade.java:154) ~[graylog.jar:?]
at org.graylog2.contentpacks.facades.DashboardFacade.createNativeEntity(DashboardFacade.java:141) ~[graylog.jar:?]
at org.graylog2.contentpacks.ContentPackService.installContentPack(ContentPackService.java:149) ~[graylog.jar:?]
(...)
```

Half-created dashboard left behind

```
{
"_id" : ObjectId("5c4897b8e0015c3b11556db5"),
"creator_user_id" : "hans",
"description" : "test",
"created_at" : ISODate("2019-01-23T16:35:04.380Z"),
"title" : "Test dashboard",
"widgets" : [
{
"creator_user_id" : "hans",
"cache_time" : 10,
"description" : "Map",
"id" : "933a5f44-bca8-489a-8740-c45db3edb236",
"type" : "org.graylog.plugins.map.widget.strategy.MapWidgetStrategy",
"config" : {
"timerange" : {
"type" : "relative",
"range" : 300
},
"field" : "src_ip_geolocation",
"query" : ""
}
},
{
"creator_user_id" : "hans",
"cache_time" : 10,
"description" : "Top programs",
"id" : "373f2c7c-6c1c-4610-8090-04e93e40019b",
"type" : "QUICKVALUES",
"config" : {
"timerange" : {
"type" : "relative",
"range" : 300
},
"field" : "program",
"query" : "",
"show_data_table" : true,
"limit" : 5,
"show_pie_chart" : true,
"sort_order" : "desc",
"stacked_fields" : "",
"data_table_limit" : 10
}
},
{
"creator_user_id" : "hans",
"cache_time" : 10,
"description" : "Quick values histogram",
"id" : "58f1ce59-777f-42b7-8ec1-1b13cc933839",
"type" : "QUICKVALUES_HISTOGRAM",
"config" : {
"timerange" : {
"type" : "relative",
"range" : 300
},
"field" : "system",
"query" : "",
"limit" : 5,
"sort_order" : "desc",
"stacked_fields" : ""
}
}
]
}
```

Affected content pack. It was installed on a system where the original entities still existed. I had to use `.log` as extension so Github is happy about it.
[download.log](https://github.com/Graylog2/graylog2-server/files/2788323/download.log)

## Steps to Reproduce (for bugs)
1. Install provided content pack
2. Error occurs during install
3. Go to dashboards page and see the duplicated entity
4. Content pack installation shows "No data available"

## Your Environment
* Graylog Version: Graylog 3.0.0-beta.4-SNAPSHOT (87afab1)

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.