Skip to content

Commit 14b79b2

Browse files
committed
Fixed day of year defaulting for round up parser (opensearch-project#4627)
Signed-off-by: Vishal Sarda <vsarda@amazon.com> (cherry picked from commit a17692d)
1 parent 59176ec commit 14b79b2

File tree

4 files changed

+42
-15
lines changed

4 files changed

+42
-15
lines changed

CHANGELOG.md

+6-1
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,13 @@ Inspired from [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
4545
- Getting security exception due to access denied 'java.lang.RuntimePermission' 'accessDeclaredMembers' when trying to get snapshot with S3 IRSA ([#4469](https://github.com/opensearch-project/OpenSearch/pull/4469))
4646
- Fixed flaky test `ResourceAwareTasksTests.testTaskIdPersistsInThreadContext` ([#4484](https://github.com/opensearch-project/OpenSearch/pull/4484))
4747
- Fixed the ignore_malformed setting to also ignore objects ([#4494](https://github.com/opensearch-project/OpenSearch/pull/4494))
48-
- [Bug]: Fixed invalid location of JDK dependency for arm64 architecture([#4613](https://github.com/opensearch-project/OpenSearch/pull/4613))
48+
- [Segment Replication] Ignore lock file when testing cleanupAndPreserveLatestCommitPoint ([#4544](https://github.com/opensearch-project/OpenSearch/pull/4544))
49+
- Updated jackson to 2.13.4 and snakeyml to 1.32 ([#4556](https://github.com/opensearch-project/OpenSearch/pull/4556))
50+
- Fixed day of year defaulting for round up parser ([#4627](https://github.com/opensearch-project/OpenSearch/pull/4627))
4951
- Fixed the SnapshotsInProgress error during index deletion ([#4570](https://github.com/opensearch-project/OpenSearch/pull/4570))
52+
- [Segment Replication] Adding check to make sure checkpoint is not processed when a shard's shard routing is primary ([#4630](https://github.com/opensearch-project/OpenSearch/pull/4630))
53+
- [Bug]: Fixed invalid location of JDK dependency for arm64 architecture([#4613](https://github.com/opensearch-project/OpenSearch/pull/4613))
54+
- [Bug]: Alias filter lost after rollover ([#4499](https://github.com/opensearch-project/OpenSearch/pull/4499))
5055

5156
### Security
5257
- CVE-2022-25857 org.yaml:snakeyaml DOS vulnerability ([#4341](https://github.com/opensearch-project/OpenSearch/pull/4341))

server/src/main/java/org/opensearch/common/time/EpochTime.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -259,15 +259,15 @@ public long getFrom(TemporalAccessor temporal) {
259259
static final DateFormatter SECONDS_FORMATTER = new JavaDateFormatter(
260260
"epoch_second",
261261
SECONDS_FORMATTER1,
262-
builder -> builder.parseDefaulting(ChronoField.NANO_OF_SECOND, 999_999_999L),
262+
(builder, parser) -> builder.parseDefaulting(ChronoField.NANO_OF_SECOND, 999_999_999L),
263263
SECONDS_FORMATTER1,
264264
SECONDS_FORMATTER2
265265
);
266266

267267
static final DateFormatter MILLIS_FORMATTER = new JavaDateFormatter(
268268
"epoch_millis",
269269
MILLISECONDS_FORMATTER1,
270-
builder -> builder.parseDefaulting(EpochTime.NANOS_OF_MILLI, 999_999L),
270+
(builder, parser) -> builder.parseDefaulting(EpochTime.NANOS_OF_MILLI, 999_999L),
271271
MILLISECONDS_FORMATTER1,
272272
MILLISECONDS_FORMATTER2
273273
);

server/src/main/java/org/opensearch/common/time/JavaDateFormatter.java

+24-12
Original file line numberDiff line numberDiff line change
@@ -51,21 +51,19 @@
5151
import java.util.Locale;
5252
import java.util.Map;
5353
import java.util.Objects;
54-
import java.util.function.Consumer;
54+
import java.util.function.BiConsumer;
5555
import java.util.stream.Collectors;
5656

5757
class JavaDateFormatter implements DateFormatter {
5858

5959
// base fields which should be used for default parsing, when we round up for date math
60-
private static final Map<TemporalField, Long> ROUND_UP_BASE_FIELDS = new HashMap<>(6);
60+
private static final Map<TemporalField, Long> ROUND_UP_GENERIC_BASE_FIELDS = new HashMap<>(4);
6161

6262
{
63-
ROUND_UP_BASE_FIELDS.put(ChronoField.MONTH_OF_YEAR, 1L);
64-
ROUND_UP_BASE_FIELDS.put(ChronoField.DAY_OF_MONTH, 1L);
65-
ROUND_UP_BASE_FIELDS.put(ChronoField.HOUR_OF_DAY, 23L);
66-
ROUND_UP_BASE_FIELDS.put(ChronoField.MINUTE_OF_HOUR, 59L);
67-
ROUND_UP_BASE_FIELDS.put(ChronoField.SECOND_OF_MINUTE, 59L);
68-
ROUND_UP_BASE_FIELDS.put(ChronoField.NANO_OF_SECOND, 999_999_999L);
63+
ROUND_UP_GENERIC_BASE_FIELDS.put(ChronoField.HOUR_OF_DAY, 23L);
64+
ROUND_UP_GENERIC_BASE_FIELDS.put(ChronoField.MINUTE_OF_HOUR, 59L);
65+
ROUND_UP_GENERIC_BASE_FIELDS.put(ChronoField.SECOND_OF_MINUTE, 59L);
66+
ROUND_UP_GENERIC_BASE_FIELDS.put(ChronoField.NANO_OF_SECOND, 999_999_999L);
6967
}
7068

7169
private final String format;
@@ -96,14 +94,25 @@ JavaDateFormatter getRoundupParser() {
9694

9795
// named formatters use default roundUpParser
9896
JavaDateFormatter(String format, DateTimeFormatter printer, DateTimeFormatter... parsers) {
99-
this(format, printer, builder -> ROUND_UP_BASE_FIELDS.forEach(builder::parseDefaulting), parsers);
97+
this(format, printer, ROUND_UP_BASE_FIELDS, parsers);
10098
}
10199

100+
private static final BiConsumer<DateTimeFormatterBuilder, DateTimeFormatter> ROUND_UP_BASE_FIELDS = (builder, parser) -> {
101+
String parserString = parser.toString();
102+
if (parserString.contains(ChronoField.DAY_OF_YEAR.toString())) {
103+
builder.parseDefaulting(ChronoField.DAY_OF_YEAR, 1L);
104+
} else {
105+
builder.parseDefaulting(ChronoField.MONTH_OF_YEAR, 1L);
106+
builder.parseDefaulting(ChronoField.DAY_OF_MONTH, 1L);
107+
}
108+
ROUND_UP_GENERIC_BASE_FIELDS.forEach(builder::parseDefaulting);
109+
};
110+
102111
// subclasses override roundUpParser
103112
JavaDateFormatter(
104113
String format,
105114
DateTimeFormatter printer,
106-
Consumer<DateTimeFormatterBuilder> roundupParserConsumer,
115+
BiConsumer<DateTimeFormatterBuilder, DateTimeFormatter> roundupParserConsumer,
107116
DateTimeFormatter... parsers
108117
) {
109118
if (printer == null) {
@@ -138,13 +147,16 @@ JavaDateFormatter getRoundupParser() {
138147
* <code>DateFormatters</code>.
139148
* This means that we need to also have multiple RoundUp parsers.
140149
*/
141-
private List<DateTimeFormatter> createRoundUpParser(String format, Consumer<DateTimeFormatterBuilder> roundupParserConsumer) {
150+
private List<DateTimeFormatter> createRoundUpParser(
151+
String format,
152+
BiConsumer<DateTimeFormatterBuilder, DateTimeFormatter> roundupParserConsumer
153+
) {
142154
if (format.contains("||") == false) {
143155
List<DateTimeFormatter> roundUpParsers = new ArrayList<>();
144156
for (DateTimeFormatter parser : this.parsers) {
145157
DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();
146158
builder.append(parser);
147-
roundupParserConsumer.accept(builder);
159+
roundupParserConsumer.accept(builder, parser);
148160
roundUpParsers.add(builder.toFormatter(locale()));
149161
}
150162
return roundUpParsers;

server/src/test/java/org/opensearch/common/time/JavaDateMathParserTests.java

+10
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,16 @@ public void testBasicDates() {
131131
assertDateMathEquals("2014-05-30T20:21:35.123", "2014-05-30T20:21:35.123");
132132
}
133133

134+
public void testDayOfYearWithMissingFields() {
135+
DateFormatter formatter = DateFormatter.forPattern("yyyy[-DDD'T'HH:mm:ss.SSS]");
136+
assertDateMathEquals(formatter.toDateMathParser(), "2022", "2022-01-01T23:59:59.999Z", 0, true, ZoneOffset.UTC);
137+
}
138+
139+
public void testDayOfYear() {
140+
DateFormatter formatter = DateFormatter.forPattern("yyyy[-DDD'T'HH:mm:ss.SSS]");
141+
assertDateMathEquals(formatter.toDateMathParser(), "2022-104T14:08:30.293", "2022-04-14T14:08:30.293", 0, true, ZoneOffset.UTC);
142+
}
143+
134144
public void testRoundingDoesNotAffectExactDate() {
135145
assertDateMathEquals("2014-11-12T22:55:00.000Z", "2014-11-12T22:55:00.000Z", 0, true, null);
136146
assertDateMathEquals("2014-11-12T22:55:00.000Z", "2014-11-12T22:55:00.000Z", 0, false, null);

0 commit comments

Comments
 (0)