soullkk opened a new issue, #17489:
URL: https://github.com/apache/druid/issues/17489

   Indexer errors when using PeriodGranity in the groupBy query
   
   ### Affected Version
   
   Apache Druid 28.0.1.
   
   ### Description
   
   Please include as much detailed information about the problem as possible.
   - Steps to reproduce the problem
   1、Create a datasource(like ODAEDATASET__DEFAULT_lkk_person_olap__DEFAULT) 
and ingest data with timestamps greater than 2024-11-18T12:00:00 and less than 
2024-11-18T13:00:00
   2、Use the "/druid/v2" to perform the following query :
   ```
   {
       "queryType": "groupBy",
       "dataSource": "ODAEDATASET__DEFAULT_lkk_person_olap__DEFAULT",
       "granularity": {
           "type": "period",
           "period": "PT5H",
           "timeZone": "Asia/Singapore"
       },
       "dimensions": [{
               "type": "default",
               "dimension": "address",
               "outputName": "address",
               "outputType": "STRING"
           }
       ],
       "limitSpec": {
           "type": "default",
           "limit": 14400,
           "columns": []
       },
       "intervals": ["2024-11-18T12:05:00.000Z/2024-11-18T12:15:00.000Z"],
       "context": {
           "timeout": 30000,
           "maxRowsQueuedForOrdering": 128575
       }
   }
   ```
   - The error message or stack traces encountered. Providing more context, 
such as nearby log messages or even entire logs, can be helpful.
   The error stack of the historical node is as follows :
   ```
   2024-11-19 03:21:31,097 ERROR 
[processing-4][][org.apache.druid.query.groupby.epinephelinae.GroupByMergingQueryRunnerV2]
 Exception with one of the sequences!
   java.lang.IllegalArgumentException: The end instant must be greater than the 
start instant
        at 
org.joda.time.base.AbstractInterval.checkInterval(AbstractInterval.java:63) 
~[joda-time-2.12.5.jar:2.12.5]
        at org.joda.time.base.BaseInterval.<init>(BaseInterval.java:94) 
~[joda-time-2.12.5.jar:2.12.5]
        at org.joda.time.Interval.<init>(Interval.java:201) 
~[joda-time-2.12.5.jar:2.12.5]
        at 
org.apache.druid.query.vector.VectorCursorGranularizer.create(VectorCursorGranularizer.java:82)
 ~[druid-processing-28.0.1-htrunk15.jar:?]
        at 
org.apache.druid.query.groupby.epinephelinae.vector.VectorGroupByEngine$VectorGroupByEngineIterator.<init>(VectorGroupByEngine.java:286)
 ~[druid-processing-28.0.1-htrunk15.jar:?]
        at 
org.apache.druid.query.groupby.epinephelinae.vector.VectorGroupByEngine$1.make(VectorGroupByEngine.java:192)
 ~[druid-processing-28.0.1-htrunk15.jar:?]
        at 
org.apache.druid.query.groupby.epinephelinae.vector.VectorGroupByEngine$1.make(VectorGroupByEngine.java:144)
 ~[druid-processing-28.0.1-htrunk15.jar:?]
        at 
org.apache.druid.java.util.common.guava.BaseSequence.accumulate(BaseSequence.java:39)
 ~[druid-processing-28.0.1-htrunk15.jar:?]
        at 
org.apache.druid.java.util.common.guava.WrappingSequence$1.get(WrappingSequence.java:50)
 ~[druid-processing-28.0.1-htrunk15.jar:?]
        at 
org.apache.druid.java.util.common.guava.SequenceWrapper.wrap(SequenceWrapper.java:55)
 ~[druid-processing-28.0.1-htrunk15.jar:?]
        at 
org.apache.druid.java.util.common.guava.WrappingSequence.accumulate(WrappingSequence.java:45)
 ~[druid-processing-28.0.1-htrunk15.jar:?]
        at 
org.apache.druid.java.util.common.guava.WrappingSequence$1.get(WrappingSequence.java:50)
 ~[druid-processing-28.0.1-htrunk15.jar:?]
        at 
org.apache.druid.java.util.common.guava.SequenceWrapper.wrap(SequenceWrapper.java:55)
 ~[druid-processing-28.0.1-htrunk15.jar:?]
        at 
org.apache.druid.java.util.common.guava.WrappingSequence.accumulate(WrappingSequence.java:45)
 ~[druid-processing-28.0.1-htrunk15.jar:?]
        at 
org.apache.druid.java.util.common.guava.LazySequence.accumulate(LazySequence.java:40)
 ~[druid-processing-28.0.1-htrunk15.jar:?]
        at 
org.apache.druid.java.util.common.guava.WrappingSequence$1.get(WrappingSequence.java:50)
 ~[druid-processing-28.0.1-htrunk15.jar:?]
        at 
org.apache.druid.java.util.common.guava.SequenceWrapper.wrap(SequenceWrapper.java:55)
 ~[druid-processing-28.0.1-htrunk15.jar:?]
        at 
org.apache.druid.java.util.common.guava.WrappingSequence.accumulate(WrappingSequence.java:45)
 ~[druid-processing-28.0.1-htrunk15.jar:?]
        at 
org.apache.druid.java.util.common.guava.MappedSequence.accumulate(MappedSequence.java:43)
 ~[druid-processing-28.0.1-htrunk15.jar:?]
        at 
org.apache.druid.java.util.common.guava.WrappingSequence$1.get(WrappingSequence.java:50)
 ~[druid-processing-28.0.1-htrunk15.jar:?]
        at 
org.apache.druid.java.util.common.guava.SequenceWrapper.wrap(SequenceWrapper.java:55)
 ~[druid-processing-28.0.1-htrunk15.jar:?]
        at 
org.apache.druid.java.util.common.guava.WrappingSequence.accumulate(WrappingSequence.java:45)
 ~[druid-processing-28.0.1-htrunk15.jar:?]
        at 
org.apache.druid.java.util.common.guava.LazySequence.accumulate(LazySequence.java:40)
 ~[druid-processing-28.0.1-htrunk15.jar:?]
        at 
org.apache.druid.java.util.common.guava.WrappingSequence$1.get(WrappingSequence.java:50)
 ~[druid-processing-28.0.1-htrunk15.jar:?]
        at 
org.apache.druid.java.util.common.guava.SequenceWrapper.wrap(SequenceWrapper.java:55)
 ~[druid-processing-28.0.1-htrunk15.jar:?]
        at 
org.apache.druid.java.util.common.guava.WrappingSequence.accumulate(WrappingSequence.java:45)
 ~[druid-processing-28.0.1-htrunk15.jar:?]
        at 
org.apache.druid.query.spec.SpecificSegmentQueryRunner$1.accumulate(SpecificSegmentQueryRunner.java:98)
 ~[druid-processing-28.0.1-htrunk15.jar:?]
        at 
org.apache.druid.java.util.common.guava.WrappingSequence$1.get(WrappingSequence.java:50)
 ~[druid-processing-28.0.1-htrunk15.jar:?]
        at 
org.apache.druid.query.spec.SpecificSegmentQueryRunner.doNamed(SpecificSegmentQueryRunner.java:185)
 ~[druid-processing-28.0.1-htrunk15.jar:?]
        at 
org.apache.druid.query.spec.SpecificSegmentQueryRunner.access$100(SpecificSegmentQueryRunner.java:44)
 ~[druid-processing-28.0.1-htrunk15.jar:?]
        at 
org.apache.druid.query.spec.SpecificSegmentQueryRunner$2.wrap(SpecificSegmentQueryRunner.java:165)
 ~[druid-processing-28.0.1-htrunk15.jar:?]
        at 
org.apache.druid.java.util.common.guava.WrappingSequence.accumulate(WrappingSequence.java:45)
 ~[druid-processing-28.0.1-htrunk15.jar:?]
        at 
org.apache.druid.java.util.common.guava.WrappingSequence$1.get(WrappingSequence.java:50)
 ~[druid-processing-28.0.1-htrunk15.jar:?]
        at 
org.apache.druid.query.CPUTimeMetricQueryRunner$1.wrap(CPUTimeMetricQueryRunner.java:77)
 ~[druid-processing-28.0.1-htrunk15.jar:?]
        at 
org.apache.druid.java.util.common.guava.WrappingSequence.accumulate(WrappingSequence.java:45)
 ~[druid-processing-28.0.1-htrunk15.jar:?]
        at 
org.apache.druid.query.groupby.epinephelinae.GroupByMergingQueryRunnerV2$1$1$1.call(GroupByMergingQueryRunnerV2.java:252)
 ~[druid-processing-28.0.1-htrunk15.jar:?]
        at 
org.apache.druid.query.groupby.epinephelinae.GroupByMergingQueryRunnerV2$1$1$1.call(GroupByMergingQueryRunnerV2.java:239)
 ~[druid-processing-28.0.1-htrunk15.jar:?]
        at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
~[?:1.8.0_432]
        at 
org.apache.druid.query.PrioritizedListenableFutureTask.run(PrioritizedExecutorService.java:259)
 ~[druid-processing-28.0.1-htrunk15.jar:?]
        at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 
~[?:1.8.0_432]
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 
~[?:1.8.0_432]
        at java.lang.Thread.run(Thread.java:750) ~[?:1.8.0_432]
   
   ```
   - Any debugging that you have already done
   If the interval of a segment is like this:2024-11-18T12:10:00.000  --- 
2024-11-18T12:15:00.000
   The result of  granularity.bucketEnd(maxTime) will be less than minTime when 
using the query mentioned earlier.
   ```
     @Nullable
     public static VectorCursorGranularizer create(
         final StorageAdapter storageAdapter,
         final VectorCursor cursor,
         final Granularity granularity,
         final Interval queryInterval
     )
     {
       final DateTime minTime = storageAdapter.getMinTime();
       final DateTime maxTime = storageAdapter.getMaxTime();
   
       final Interval storageAdapterInterval = new Interval(minTime, 
granularity.bucketEnd(maxTime));
   ```
    PeriodGranularity.truncate(long t):
    period = "PT5H"
    t = 2024-11-18T12:15:00.000
    timeZone = "Asia/Singapore"
    origin = -27000000
   ```
       final int hours = period.getHours();
       if (hours > 0) {
         if (hours > 1 || hasOrigin) {
           // align on multiples from origin
           long h = chronology.hours().getDifferenceAsLong(t, origin);
           h -= h % hours;
           long tt = chronology.hours().add(origin, h);
           // always round down to the previous period (for timestamps prior to 
origin)
           if (t < tt && origin > 0) {
             t = chronology.hours().add(tt, -hours);
           } else if (t > tt && origin < 0) {
             t = chronology.minuteOfHour().roundFloor(tt);
             t = chronology.minuteOfHour().set(t, 0);
           } else {
             t = tt;
           }
           return t;
         } else {
           return chronology.hourOfDay().roundFloor(t);
         }
       }
   ```
    The result of "long tt = chronology.hours().add(origin, h)" will be 
"2024-11-18T07:30:00.000Z"
    "t > tt && origin < 0 " is valid.
    so "t = chronology.minuteOfHour().set(t, 0)"  will be executed
    the return will be t = "2024-11-18T07:00:00.000Z"
    so granularity.bucketEnd(maxTime) =  "2024-11-18T12:00:00.000Z", it is less 
than 2024-11-18T12:10:00.000 (the start time of interval)


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to