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

Fix NPE when partionNumber 0 does not exist. #1190

Merged
merged 1 commit into from
Mar 26, 2015
Merged

Conversation

msprunck
Copy link
Contributor

As described in #1053 and in the google group (https://groups.google.com/forum/#!msg/druid-development/k-Q-Rj52czk/AOLtNu0Dr1kJ), when using the IngestSegmentFirehose, a NPE is thrown when there is no partionNumber 0 in a segment due to a misconfiguration. I replaced getChunk(0) by iterator().next().

@nishantmonu51
Copy link
Member

can you also add a unit test for this fix ?

@drcrallen
Copy link
Contributor

Let me make sure I understand this fix correctly. Essentially you are taking away the assumption that the chunk is chunk 0, but retaining the assumption that there is only 1 chunk. Is that correct?

import com.google.common.collect.Lists;
import com.google.common.collect.Ordering;
import com.google.common.collect.Sets;
import com.google.common.collect.*;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Convention is to have all the imports spelled out explicitly.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok I will fix it

@msprunck
Copy link
Contributor Author

Instead of getting the partition 0, I just try to get the first one using the iterator. For the IndexerSQLMetadataStorageCoordinator it does not work, I iterate over all partitions.

@drcrallen
Copy link
Contributor

@msprunck : I submitted a PR to your branch which completely removes chunk count assumptions, though I have very limited capacity to test it:

vigiglobe#1

@msprunck
Copy link
Contributor Author

@drcrallen : Thank you. I will test it on my index task as soon as possible.

@@ -267,7 +267,7 @@ public Sink getSink(long timestamp)
throw new ISE("No timeline entry at all!");
}

final Sink theSink = holder.getObject().getChunk(0).getObject();
final Sink theSink = holder.getObject().iterator().next().getObject();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I missed one >.<

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have no idea how to manage this case.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The realtime plumber always uses SingleElementPartitionChunk, so there actually is no bug here to fix.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@msprunck : Can you please add a comment here about what @gianm noted, and revert this change.

Then would you mind squashing the commits in this PR?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gianm, @dcrallen I removed the fix from the PR.

@drcrallen
Copy link
Contributor

@nishantmonu51 : I was able to get a unit test up at:
vigiglobe#2

The test fails in master but passes with the changes in this branch.
I'm not quite sure a good way to test the "missing chunk 0" thing, but the above PR at least adds some coverage for this functionality.

@drcrallen
Copy link
Contributor

final List<TimelineObjectHolder<String, DataSegment>> timeLineSegments = timeline.lookup(interval);

Will return an empty list if the timeline does not find all chunks. So currently the IngestSegmentFirehoseFactory should either yield ALL segments or NO segments.
If chunk 0 (or any other chunk) cannot be found, then the fetching of data should yield nothing in the current logic.

@msprunck
Copy link
Contributor Author

I got the following injection error :

  1. No implementation for io.druid.segment.loading.DataSegmentArchiver was bound.
    while locating io.druid.segment.loading.DataSegmentArchiver
    for parameter 6 at io.druid.indexing.common.TaskToolboxFactory.(TaskToolboxFactory.java:76)
    while locating io.druid.indexing.common.TaskToolboxFactory

  2. No implementation for io.druid.segment.loading.DataSegmentKiller was bound.
    while locating io.druid.segment.loading.DataSegmentKiller
    for parameter 4 at io.druid.indexing.common.TaskToolboxFactory.(TaskToolboxFactory.java:76)
    while locating io.druid.indexing.common.TaskToolboxFactory

  3. No implementation for io.druid.segment.loading.DataSegmentMover was bound.
    while locating io.druid.segment.loading.DataSegmentMover
    for parameter 5 at io.druid.indexing.common.TaskToolboxFactory.(TaskToolboxFactory.java:76)
    while locating io.druid.indexing.common.TaskToolboxFactory

@msprunck
Copy link
Contributor Author

To test the missing chunk 0, you could start from partition num 1 your segment list in the IngestSegmentFirehoseFactoryTest::setUpStatic method.

@drcrallen
Copy link
Contributor

Hmm would you mind sharing the load json you are using? Please sanitize
against proprietary information and either post it here or send it directly
to my email
On Mar 12, 2015 1:13 AM, "msprunck" notifications@github.com wrote:

I get the following injection error :

  1. No implementation for io.druid.segment.loading.DataSegmentArchiver was
    bound.
    while locating io.druid.segment.loading.DataSegmentArchiver
    for parameter 6 at
    io.druid.indexing.common.TaskToolboxFactory.(TaskToolboxFactory.java:76)
    while locating io.druid.indexing.common.TaskToolboxFactory

  2. No implementation for io.druid.segment.loading.DataSegmentKiller was
    bound.
    while locating io.druid.segment.loading.DataSegmentKiller
    for parameter 4 at
    io.druid.indexing.common.TaskToolboxFactory.(TaskToolboxFactory.java:76)
    while locating io.druid.indexing.common.TaskToolboxFactory

  3. No implementation for io.druid.segment.loading.DataSegmentMover was
    bound.
    while locating io.druid.segment.loading.DataSegmentMover
    for parameter 5 at
    io.druid.indexing.common.TaskToolboxFactory.(TaskToolboxFactory.java:76)
    while locating io.druid.indexing.common.TaskToolboxFactory

3 errors
at
com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:1031)
~[guice-4.0-beta.jar:?]
at
com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1036)
~[guice-4.0-beta.jar:?]
at
com.fasterxml.jackson.databind.introspect.GuiceInjectableValues.findInjectableValue(GuiceInjectableValues.java:39)
~[druid-common-0.7.1-SNAPSHOT.jar:0.7.1-SNAPSHOT]
at
com.fasterxml.jackson.databind.DeserializationContext.findInjectableValue(DeserializationContext.java:293)
~[jackson-databind-2.4.4.jar:2.4.4]
at
com.fasterxml.jackson.databind.deser.impl.PropertyValueBuffer.inject(PropertyValueBuffer.java:66)
~[jackson-databind-2.4.4.jar:2.4.4]
at
com.fasterxml.jackson.databind.deser.impl.PropertyBasedCreator.startBuilding(PropertyBasedCreator.java:160)
~[jackson-databind-2.4.4.jar:2.4.4]
at
com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:331)
~[jackson-databind-2.4.4.jar:2.4.4]
at
com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1064)
~[jackson-databind-2.4.4.jar:2.4.4]
at
com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:264)
~[jackson-databind-2.4.4.jar:2.4.4]
at
com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:156)
~[jackson-databind-2.4.4.jar:2.4.4]
at
com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:126)
~[jackson-databind-2.4.4.jar:2.4.4]
at
com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer._deserializeTypedForId(AsPropertyTypeDeserializer.java:113)
~[jackson-databind-2.4.4.jar:2.4.4]
at
com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromObject(AsPropertyTypeDeserializer.java:84)
~[jackson-databind-2.4.4.jar:2.4.4]
at
com.fasterxml.jackson.databind.deser.AbstractDeserializer.deserializeWithType(AbstractDeserializer.java:132)
~[jackson-databind-2.4.4.jar:2.4.4]
at
com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:536)
~[jackson-databind-2.4.4.jar:2.4.4]
at
com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:344)
~[jackson-databind-2.4.4.jar:2.4.4]
at
com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1064)
~[jackson-databind-2.4.4.jar:2.4.4]
at
com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:264)
~[jackson-databind-2.4.4.jar:2.4.4]
at
com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:156)
~[jackson-databind-2.4.4.jar:2.4.4]
at
com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:126)
~[jackson-databind-2.4.4.jar:2.4.4]
at
com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer._deserializeTypedForId(AsPropertyTypeDeserializer.java:113)
~[jackson-databind-2.4.4.jar:2.4.4]
at
com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromObject(AsPropertyTypeDeserializer.java:84)
~[jackson-databind-2.4.4.jar:2.4.4]
at
com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeWithType(BeanDeserializerBase.java:956)
~[jackson-databind-2.4.4.jar:2.4.4]
at
com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:536)
~[jackson-databind-2.4.4.jar:2.4.4]
at
com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:344)
~[jackson-databind-2.4.4.jar:2.4.4]
at
com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1064)
~[jackson-databind-2.4.4.jar:2.4.4]
at
com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:264)
~[jackson-databind-2.4.4.jar:2.4.4]
at
com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:124)
~[jackson-databind-2.4.4.jar:2.4.4]
at
com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:538)
~[jackson-databind-2.4.4.jar:2.4.4]
at
com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:344)
~[jackson-databind-2.4.4.jar:2.4.4]
at
com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1064)
~[jackson-databind-2.4.4.jar:2.4.4]
at
com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:264)
~[jackson-databind-2.4.4.jar:2.4.4]
at
com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:156)
~[jackson-databind-2.4.4.jar:2.4.4]
at
com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:126)
~[jackson-databind-2.4.4.jar:2.4.4]
at
com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer._deserializeTypedForId(AsPropertyTypeDeserializer.java:113)
~[jackson-databind-2.4.4.jar:2.4.4]
at
com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromObject(AsPropertyTypeDeserializer.java:84)
~[jackson-databind-2.4.4.jar:2.4.4]
at
com.fasterxml.jackson.databind.deser.AbstractDeserializer.deserializeWithType(AbstractDeserializer.java:132)
~[jackson-databind-2.4.4.jar:2.4.4]
at
com.fasterxml.jackson.databind.deser.impl.TypeWrappedDeserializer.deserialize(TypeWrappedDeserializer.java:41)
~[jackson-databind-2.4.4.jar:2.4.4]
at
com.fasterxml.jackson.databind.ObjectReader._bind(ObjectReader.java:1232)
~[jackson-databind-2.4.4.jar:2.4.4]
at
com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:676)
~[jackson-databind-2.4.4.jar:2.4.4]
at
com.fasterxml.jackson.jaxrs.base.ProviderBase.readFrom(ProviderBase.java:808)
~[jackson-jaxrs-base-2.4.4.jar:2.4.4]
at
com.sun.jersey.spi.container.ContainerRequest.getEntity(ContainerRequest.java:488)
~[jersey-server-1.17.1.jar:1.17.1]
at
com.sun.jersey.server.impl.model.method.dispatch.EntityParamDispatchProvider$EntityInjectable.getValue(EntityParamDispatchProvider.java:123)
~[jersey-server-1.17.1.jar:1.17.1]
at
com.sun.jersey.server.impl.inject.InjectableValuesProvider.getInjectableValues(InjectableValuesProvider.java:46)
~[jersey-server-1.17.1.jar:1.17.1]
at
com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$EntityParamInInvoker.getParams(AbstractResourceMethodDispatchProvider.java:153)
~[jersey-server-1.17.1.jar:1.17.1]
at
com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:203)
~[jersey-server-1.17.1.jar:1.17.1]
at
com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
~[jersey-server-1.17.1.jar:1.17.1]
at
com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:302)
~[jersey-server-1.17.1.jar:1.17.1]
at
com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
~[jersey-server-1.17.1.jar:1.17.1]
at
com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
~[jersey-server-1.17.1.jar:1.17.1]
at
com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
~[jersey-server-1.17.1.jar:1.17.1]
at
com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
~[jersey-server-1.17.1.jar:1.17.1]
at
com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1511)
~[jersey-server-1.17.1.jar:1.17.1]
at
com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1442)
~[jersey-server-1.17.1.jar:1.17.1]
at
com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1391)
~[jersey-server-1.17.1.jar:1.17.1]
at
com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1381)
~[jersey-server-1.17.1.jar:1.17.1]
at
com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
~[jersey-servlet-1.17.1.jar:1.17.1]
at
com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:538)
~[jersey-servlet-1.17.1.jar:1.17.1]
at
com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:716)
~[jersey-servlet-1.17.1.jar:1.17.1]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
~[javax.servlet-api-3.1.0.jar:3.1.0]
at
com.google.inject.servlet.ServletDefinition.doServiceImpl(ServletDefinition.java:278)
~[guice-servlet-4.0-beta.jar:?]
at
com.google.inject.servlet.ServletDefinition.doService(ServletDefinition.java:268)
~[guice-servlet-4.0-beta.jar:?]
at
com.google.inject.servlet.ServletDefinition.service(ServletDefinition.java:180)
~[guice-servlet-4.0-beta.jar:?]
at
com.google.inject.servlet.ManagedServletPipeline.service(ManagedServletPipeline.java:93)
~[guice-servlet-4.0-beta.jar:?]
at
com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:120)
~[guice-servlet-4.0-beta.jar:?]
at com.google.inject.servlet.GuiceFilter$1.call(GuiceFilter.java:132)
~[guice-servlet-4.0-beta.jar:?]
at com.google.inject.servlet.GuiceFilter$1.call(GuiceFilter.java:129)
~[guice-servlet-4.0-beta.jar:?]
at
com.google.inject.servlet.GuiceFilter$Context.call(GuiceFilter.java:206)
~[guice-servlet-4.0-beta.jar:?]
at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:129)
~[guice-servlet-4.0-beta.jar:?]
at
org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652)
~[jetty-servlet-9.2.5.v20141112.jar:9.2.5.v20141112]
at io.druid.server.http.RedirectFilter.doFilter(RedirectFilter.java:69)
~[druid-server-0.7.1-SNAPSHOT.jar:0.7.1-SNAPSHOT]
at
org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652)
~[jetty-servlet-9.2.5.v20141112.jar:9.2.5.v20141112]
at
org.eclipse.jetty.servlets.UserAgentFilter.doFilter(UserAgentFilter.java:83)
~[jetty-servlets-9.2.5.v20141112.jar:9.2.5.v20141112]
at org.eclipse.jetty.servlets.GzipFilter.doFilter(GzipFilter.java:364)
~[jetty-servlets-9.2.5.v20141112.jar:9.2.5.v20141112]
at
org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652)
~[jetty-servlet-9.2.5.v20141112.jar:9.2.5.v20141112]
at
org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:585)
[jetty-servlet-9.2.5.v20141112.jar:9.2.5.v20141112]
at
org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:221)
[jetty-server-9.2.5.v20141112.jar:9.2.5.v20141112]
at
org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1125)
[jetty-server-9.2.5.v20141112.jar:9.2.5.v20141112]
at
org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515)
[jetty-servlet-9.2.5.v20141112.jar:9.2.5.v20141112]
at
org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
[jetty-server-9.2.5.v20141112.jar:9.2.5.v20141112]
at
org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1059)
[jetty-server-9.2.5.v20141112.jar:9.2.5.v20141112]
at
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
[jetty-server-9.2.5.v20141112.jar:9.2.5.v20141112]
at
org.eclipse.jetty.server.handler.HandlerList.handle(HandlerList.java:52)
[jetty-server-9.2.5.v20141112.jar:9.2.5.v20141112]
at
org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
[jetty-server-9.2.5.v20141112.jar:9.2.5.v20141112]
at org.eclipse.jetty.server.Server.handle(Server.java:497)
[jetty-server-9.2.5.v20141112.jar:9.2.5.v20141112]
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:310)
[jetty-server-9.2.5.v20141112.jar:9.2.5.v20141112]
at
org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:248)
[jetty-server-9.2.5.v20141112.jar:9.2.5.v20141112]
at
org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540)
[jetty-io-9.2.5.v20141112.jar:9.2.5.v20141112]
at
org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:620)
[jetty-util-9.2.5.v20141112.jar:9.2.5.v20141112]
at
org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:540)
[jetty-util-9.2.5.v20141112.jar:9.2.5.v20141112]
at java.lang.Thread.run(Thread.java:745) [?:1.7.0_75]


Reply to this email directly or view it on GitHub
#1190 (comment).

@msprunck
Copy link
Contributor Author

The json of the task :
{
"type" : "index",
"spec" : {
"dataSchema":{
"dataSource" : "dev2",
"parser" : {
"type" : "string",
"parseSpec" : {
"format" : "json",
"timestampSpec" : {
"column" : "timestamp",
"format" : "auto"
},
"dimensionsSpec" : {
"dimensions": null,
"dimensionExclusions" : [],
"spatialDimensions" : []
}
}
},
"metricsSpec":[
{
"fieldName": "count",
"name": "count",
"type": "doubleSum"
}
],
"granularitySpec" : {
"type" : "uniform",
"segmentGranularity" : "DAY",
"queryGranularity" : "MINUTE",
"intervals" : [ "2014-01-01T00:00:00.000Z/2015-03-11T08:00:00.000Z"
]
}
},
"ioConfig":{
"type":"index",
"firehose":{
"type":"ingestSegment",
"dataSource":"dev",
"interval":"2014-01-01T00:00:00.000Z/2015-03-11T08:00:00.000Z"
}
},
"tuningConfig":{
"type":"index",
"targetPartitionSize":-1,
"rowFlushBoundary":0,
"numShards":1
}
}
}

On Thu, Mar 12, 2015 at 4:19 PM Charles Allen notifications@github.com
wrote:

Hmm would you mind sharing the load json you are using? Please sanitize
against proprietary information and either post it here or send it directly
to my email
On Mar 12, 2015 1:13 AM, "msprunck" notifications@github.com wrote:

I get the following injection error :

  1. No implementation for io.druid.segment.loading.DataSegmentArchiver was
    bound.
    while locating io.druid.segment.loading.DataSegmentArchiver
    for parameter 6 at
    io.druid.indexing.common.TaskToolboxFactory.(TaskToolboxFactory.java:76)
    while locating io.druid.indexing.common.TaskToolboxFactory

  2. No implementation for io.druid.segment.loading.DataSegmentKiller was
    bound.
    while locating io.druid.segment.loading.DataSegmentKiller
    for parameter 4 at
    io.druid.indexing.common.TaskToolboxFactory.(TaskToolboxFactory.java:76)
    while locating io.druid.indexing.common.TaskToolboxFactory

  3. No implementation for io.druid.segment.loading.DataSegmentMover was
    bound.
    while locating io.druid.segment.loading.DataSegmentMover
    for parameter 5 at
    io.druid.indexing.common.TaskToolboxFactory.(TaskToolboxFactory.java:76)
    while locating io.druid.indexing.common.TaskToolboxFactory

3 errors
at

com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:1031)
~[guice-4.0-beta.jar:?]
at

com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1036)
~[guice-4.0-beta.jar:?]
at

com.fasterxml.jackson.databind.introspect.GuiceInjectableValues.findInjectableValue(GuiceInjectableValues.java:39)
~[druid-common-0.7.1-SNAPSHOT.jar:0.7.1-SNAPSHOT]
at

com.fasterxml.jackson.databind.DeserializationContext.findInjectableValue(DeserializationContext.java:293)
~[jackson-databind-2.4.4.jar:2.4.4]
at

com.fasterxml.jackson.databind.deser.impl.PropertyValueBuffer.inject(PropertyValueBuffer.java:66)
~[jackson-databind-2.4.4.jar:2.4.4]
at

com.fasterxml.jackson.databind.deser.impl.PropertyBasedCreator.startBuilding(PropertyBasedCreator.java:160)
~[jackson-databind-2.4.4.jar:2.4.4]
at

com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:331)
~[jackson-databind-2.4.4.jar:2.4.4]
at

com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1064)
~[jackson-databind-2.4.4.jar:2.4.4]
at

com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:264)
~[jackson-databind-2.4.4.jar:2.4.4]
at

com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:156)
~[jackson-databind-2.4.4.jar:2.4.4]
at

com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:126)
~[jackson-databind-2.4.4.jar:2.4.4]
at

com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer._deserializeTypedForId(AsPropertyTypeDeserializer.java:113)
~[jackson-databind-2.4.4.jar:2.4.4]
at

com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromObject(AsPropertyTypeDeserializer.java:84)
~[jackson-databind-2.4.4.jar:2.4.4]
at

com.fasterxml.jackson.databind.deser.AbstractDeserializer.deserializeWithType(AbstractDeserializer.java:132)
~[jackson-databind-2.4.4.jar:2.4.4]
at

com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:536)
~[jackson-databind-2.4.4.jar:2.4.4]
at

com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:344)
~[jackson-databind-2.4.4.jar:2.4.4]
at

com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1064)
~[jackson-databind-2.4.4.jar:2.4.4]
at

com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:264)
~[jackson-databind-2.4.4.jar:2.4.4]
at

com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:156)
~[jackson-databind-2.4.4.jar:2.4.4]
at

com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:126)
~[jackson-databind-2.4.4.jar:2.4.4]
at

com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer._deserializeTypedForId(AsPropertyTypeDeserializer.java:113)
~[jackson-databind-2.4.4.jar:2.4.4]
at

com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromObject(AsPropertyTypeDeserializer.java:84)
~[jackson-databind-2.4.4.jar:2.4.4]
at

com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeWithType(BeanDeserializerBase.java:956)
~[jackson-databind-2.4.4.jar:2.4.4]
at

com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:536)
~[jackson-databind-2.4.4.jar:2.4.4]
at

com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:344)
~[jackson-databind-2.4.4.jar:2.4.4]
at

com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1064)
~[jackson-databind-2.4.4.jar:2.4.4]
at

com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:264)
~[jackson-databind-2.4.4.jar:2.4.4]
at

com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:124)
~[jackson-databind-2.4.4.jar:2.4.4]
at

com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:538)
~[jackson-databind-2.4.4.jar:2.4.4]
at

com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:344)
~[jackson-databind-2.4.4.jar:2.4.4]
at

com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1064)
~[jackson-databind-2.4.4.jar:2.4.4]
at

com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:264)
~[jackson-databind-2.4.4.jar:2.4.4]
at

com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:156)
~[jackson-databind-2.4.4.jar:2.4.4]
at

com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:126)
~[jackson-databind-2.4.4.jar:2.4.4]
at

com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer._deserializeTypedForId(AsPropertyTypeDeserializer.java:113)
~[jackson-databind-2.4.4.jar:2.4.4]
at

com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromObject(AsPropertyTypeDeserializer.java:84)
~[jackson-databind-2.4.4.jar:2.4.4]
at

com.fasterxml.jackson.databind.deser.AbstractDeserializer.deserializeWithType(AbstractDeserializer.java:132)
~[jackson-databind-2.4.4.jar:2.4.4]
at

com.fasterxml.jackson.databind.deser.impl.TypeWrappedDeserializer.deserialize(TypeWrappedDeserializer.java:41)
~[jackson-databind-2.4.4.jar:2.4.4]
at
com.fasterxml.jackson.databind.ObjectReader._bind(ObjectReader.java:1232)
~[jackson-databind-2.4.4.jar:2.4.4]
at

com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:676)
~[jackson-databind-2.4.4.jar:2.4.4]
at

com.fasterxml.jackson.jaxrs.base.ProviderBase.readFrom(ProviderBase.java:808)
~[jackson-jaxrs-base-2.4.4.jar:2.4.4]
at

com.sun.jersey.spi.container.ContainerRequest.getEntity(ContainerRequest.java:488)
~[jersey-server-1.17.1.jar:1.17.1]
at

com.sun.jersey.server.impl.model.method.dispatch.EntityParamDispatchProvider$EntityInjectable.getValue(EntityParamDispatchProvider.java:123)
~[jersey-server-1.17.1.jar:1.17.1]
at

com.sun.jersey.server.impl.inject.InjectableValuesProvider.getInjectableValues(InjectableValuesProvider.java:46)
~[jersey-server-1.17.1.jar:1.17.1]
at

com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$EntityParamInInvoker.getParams(AbstractResourceMethodDispatchProvider.java:153)
~[jersey-server-1.17.1.jar:1.17.1]
at

com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:203)
~[jersey-server-1.17.1.jar:1.17.1]
at

com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
~[jersey-server-1.17.1.jar:1.17.1]
at

com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:302)
~[jersey-server-1.17.1.jar:1.17.1]
at

com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
~[jersey-server-1.17.1.jar:1.17.1]
at

com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
~[jersey-server-1.17.1.jar:1.17.1]
at

com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
~[jersey-server-1.17.1.jar:1.17.1]
at

com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
~[jersey-server-1.17.1.jar:1.17.1]
at

com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1511)
~[jersey-server-1.17.1.jar:1.17.1]
at

com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1442)
~[jersey-server-1.17.1.jar:1.17.1]
at

com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1391)
~[jersey-server-1.17.1.jar:1.17.1]
at

com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1381)
~[jersey-server-1.17.1.jar:1.17.1]
at

com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
~[jersey-servlet-1.17.1.jar:1.17.1]
at

com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:538)
~[jersey-servlet-1.17.1.jar:1.17.1]
at

com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:716)
~[jersey-servlet-1.17.1.jar:1.17.1]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
~[javax.servlet-api-3.1.0.jar:3.1.0]
at

com.google.inject.servlet.ServletDefinition.doServiceImpl(ServletDefinition.java:278)
~[guice-servlet-4.0-beta.jar:?]
at

com.google.inject.servlet.ServletDefinition.doService(ServletDefinition.java:268)
~[guice-servlet-4.0-beta.jar:?]
at

com.google.inject.servlet.ServletDefinition.service(ServletDefinition.java:180)
~[guice-servlet-4.0-beta.jar:?]
at

com.google.inject.servlet.ManagedServletPipeline.service(ManagedServletPipeline.java:93)
~[guice-servlet-4.0-beta.jar:?]
at

com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:120)
~[guice-servlet-4.0-beta.jar:?]
at com.google.inject.servlet.GuiceFilter$1.call(GuiceFilter.java:132)
~[guice-servlet-4.0-beta.jar:?]
at com.google.inject.servlet.GuiceFilter$1.call(GuiceFilter.java:129)
~[guice-servlet-4.0-beta.jar:?]
at
com.google.inject.servlet.GuiceFilter$Context.call(GuiceFilter.java:206)
~[guice-servlet-4.0-beta.jar:?]
at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:129)
~[guice-servlet-4.0-beta.jar:?]
at

org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652)
~[jetty-servlet-9.2.5.v20141112.jar:9.2.5.v20141112]
at io.druid.server.http.RedirectFilter.doFilter(RedirectFilter.java:69)
~[druid-server-0.7.1-SNAPSHOT.jar:0.7.1-SNAPSHOT]
at

org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652)
~[jetty-servlet-9.2.5.v20141112.jar:9.2.5.v20141112]
at

org.eclipse.jetty.servlets.UserAgentFilter.doFilter(UserAgentFilter.java:83)
~[jetty-servlets-9.2.5.v20141112.jar:9.2.5.v20141112]
at org.eclipse.jetty.servlets.GzipFilter.doFilter(GzipFilter.java:364)
~[jetty-servlets-9.2.5.v20141112.jar:9.2.5.v20141112]
at

org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652)
~[jetty-servlet-9.2.5.v20141112.jar:9.2.5.v20141112]
at

org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:585)
[jetty-servlet-9.2.5.v20141112.jar:9.2.5.v20141112]
at

org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:221)
[jetty-server-9.2.5.v20141112.jar:9.2.5.v20141112]
at

org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1125)
[jetty-server-9.2.5.v20141112.jar:9.2.5.v20141112]
at
org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515)
[jetty-servlet-9.2.5.v20141112.jar:9.2.5.v20141112]
at

org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
[jetty-server-9.2.5.v20141112.jar:9.2.5.v20141112]
at

org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1059)
[jetty-server-9.2.5.v20141112.jar:9.2.5.v20141112]
at

org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
[jetty-server-9.2.5.v20141112.jar:9.2.5.v20141112]
at
org.eclipse.jetty.server.handler.HandlerList.handle(HandlerList.java:52)
[jetty-server-9.2.5.v20141112.jar:9.2.5.v20141112]
at

org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
[jetty-server-9.2.5.v20141112.jar:9.2.5.v20141112]
at org.eclipse.jetty.server.Server.handle(Server.java:497)
[jetty-server-9.2.5.v20141112.jar:9.2.5.v20141112]
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:310)
[jetty-server-9.2.5.v20141112.jar:9.2.5.v20141112]
at

org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:248)
[jetty-server-9.2.5.v20141112.jar:9.2.5.v20141112]
at

org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540)
[jetty-io-9.2.5.v20141112.jar:9.2.5.v20141112]
at

org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:620)
[jetty-util-9.2.5.v20141112.jar:9.2.5.v20141112]
at

org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:540)
[jetty-util-9.2.5.v20141112.jar:9.2.5.v20141112]
at java.lang.Thread.run(Thread.java:745) [?:1.7.0_75]

Reply to this email directly or view it on GitHub
#1190 (comment).

Reply to this email directly or view it on GitHub
#1190 (comment).

@msprunck
Copy link
Contributor Author

This error seems to come directly from overlord. I receive it as http response when submitting the job. There is no binding for TaskToolboxFactory in CliOverlord like CliPeon. It seems linked to the change you did in IngestSegmentFirehoseFactory.java vigiglobe@853f1c2

@drcrallen
Copy link
Contributor

Yes, that's what I was thinking. Once im in the office I'll get a new patch
in
On Mar 12, 2015 8:48 AM, "msprunck" notifications@github.com wrote:

This error seems to come directly from overlord. I receive it as http
response when submitting the job. There is no binding for
TaskToolboxFactory in CliOverlord like CliPeon. It seems linked to the
change you did in IngestSegmentFirehoseFactory.java vigiglobe/druid@853f1c2
vigiglobe@853f1c2


Reply to this email directly or view it on GitHub
#1190 (comment).

@drcrallen
Copy link
Contributor

The less-obvious problem is that injecting an injector is "something we try
not to do"
On Mar 12, 2015 8:51 AM, "Charles Allen" charles.allen@metamarkets.com
wrote:

Yes, that's what I was thinking. Once im in the office I'll get a new
patch in
On Mar 12, 2015 8:48 AM, "msprunck" notifications@github.com wrote:

This error seems to come directly from overlord. I receive it as http
response when submitting the job. There is no binding for
TaskToolboxFactory in CliOverlord like CliPeon. It seems linked to the
change you did in IngestSegmentFirehoseFactory.java vigiglobe/druid@853f1c2
vigiglobe@853f1c2


Reply to this email directly or view it on GitHub
#1190 (comment).

@drcrallen
Copy link
Contributor

@msprunck : as a sanity check, can you please confirm that all the segments load properly on historical nodes?

@drcrallen
Copy link
Contributor

I'm running locally with the following config and it is going fine so far:

{
  "type" : "index",
  "spec" : {
    "dataSchema":{
      "dataSource" : "tpch_year2",
      "granularitySpec": {
                "intervals": [
                    "1990-01-01T00:00:00.000Z/2000-01-01T00:00:00.000Z"
                ],
                "segmentGranularity":"YEAR",
                "type": "uniform"
            },
      "parser" : {
        "type" : "string",
        "parseSpec" : {
          "format" : "json",
          "timestampSpec" : {
            "column" : "__time",
            "format" : "auto"
          },
          "dimensionsSpec" : {
            "dimensions": null,
            "dimensionExclusions" : [],
            "spatialDimensions" : []
          }
        }
      },
      "metricsSpec":[
        {
            "name" : "COUNT",
            "type" : "count"
        },
        {
            "fieldName" : "l_quantity",
            "name" : "L_QUANTITY_longSum",
            "type" : "longSum"
        },
        {
            "fieldName" : "l_extendedprice",
            "name" : "L_EXTENDEDPRICE_doubleSum",
            "type" : "doubleSum"
        },
        {
            "fieldName" : "l_discount",
            "name" : "L_DISCOUNT_doubleSum",
            "type" : "doubleSum"
        },
        {
            "fieldName" : "l_tax",
            "name" : "L_TAX_doubleSum",
            "type" : "doubleSum"
        },
        {
            "fieldName":"l_comment",
            "name" : "L_COMMENT_HLL",
            "type" : "hyperUnique"
        },
        {
            "fieldName":"l_orderkey",
            "name" : "L_ORDERKEY_HLL",
            "type" : "hyperUnique"
        }
      ]
    },
    "ioConfig":{
      "type":"index",
      "firehose":{
        "type":"ingestSegment",
        "dataSource":"tpch_year",
    "interval":"1990-01-01T00:00:00.000Z/2000-01-01T00:00:00.000Z"
      }
    },
    "tuningConfig":{
      "type":"index",
      "targetPartitionSize":-1,
      "rowFlushBoundary":0,
      "numShards":1
    }
  }
}

I'll give more info once it has completed.

@drcrallen
Copy link
Contributor

2015-03-12T18:28:52,039 INFO [task-runner-0] io.druid.indexing.worker.executor.ExecutorLifecycle - Task completed with status: {
  "id" : "index_tpch_year2_2015-03-12T18:12:05.218Z",
  "status" : "SUCCESS",
  "duration" : 987615
}

It succeeded at least.

@drcrallen
Copy link
Contributor

Well, it succeeded, but its really easy to screw up the metric naming when re-ingesting.

@msprunck
Copy link
Contributor Author

Now it seems to work, it's now running for more than 5 hours for one day of data. It's too slow. I ran a batch ingestion on the same machine and it took me 2 hours.
I will investigate batch ingestion using Indexing service with raw data. It will avoid all problems related to segment partitioning.

@drcrallen
Copy link
Contributor

I don't think Firehose ingestion has anywhere near the parallelism of
hadoop.
On Mar 13, 2015 6:56 AM, "msprunck" notifications@github.com wrote:

Now it seems to work, it's now running for more than 5 hours for one day
of data. It's too slow. I ran a batch ingestion on the same machine and it
took me 2 hours.
I will investigate batch ingestion using Indexing service with raw data.
It will avoid all problems related to partition segments.


Reply to this email directly or view it on GitHub
#1190 (comment).

@fjy
Copy link
Contributor

fjy commented Mar 17, 2015

Hi @msprunck, this pull request is not merge-able right now. Do you mind a sync with master?

Also, please sign our CLA here: http://druid.io/community/cla.html

@msprunck msprunck closed this Mar 23, 2015
@msprunck msprunck reopened this Mar 23, 2015
@drcrallen
Copy link
Contributor

@msprunck : FYI, TravisCI fixes just went in a couple mins ago, if this is failing on the AsyncQueryForwardingServletTest, it may be worth simply closing and reopening the PR.

@drcrallen
Copy link
Contributor

wait, nvmnd, I was just informed @xvrl was able to restart the PR build jobs en masse.

@drcrallen
Copy link
Contributor

@msprunck : Can you squash the commits as per https://github.com/druid-io/druid/blob/master/CONTRIBUTING.md please?

@drcrallen
Copy link
Contributor

Cool! 👍

@drcrallen
Copy link
Contributor

Since I also contributed to this we'll probably need a non-PR-contributor to also give it a review.

return new SegmentToMergeHolder(segment, input.getInterval(), file);
}
}
final List<SegmentToMergeHolder> segmentsToMerge = Lists.newArrayList(
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

segmentsToMerge can just be an iterable, no need to materialize the list.

drcrallen added a commit to metamx/druid that referenced this pull request Mar 24, 2015
@drcrallen
Copy link
Contributor

@msprunck put in a vigiglobe#4 for the comments

@drcrallen
Copy link
Contributor

@msprunck : I can carry the PR in a MMX repo if you want to take a break from the last mile of the PR :)

You'll still get credit

* Replace with generic iterables
@msprunck
Copy link
Contributor Author

I merged your PR. It should be ok now :-)

fjy added a commit that referenced this pull request Mar 26, 2015
Fix NPE when partionNumber 0 does not exist.
@fjy fjy merged commit e5653f0 into apache:master Mar 26, 2015
@nishantmonu51
Copy link
Member

fixes #1053

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

6 participants