Repository: oozie Updated Branches: refs/heads/master 71b668fbe -> ef32fbb0e
OOZIE-2867 [Coordinators] Emphasize Region/City timezone format (dbist13 via rkanter, andras.piros) Project: http://git-wip-us.apache.org/repos/asf/oozie/repo Commit: http://git-wip-us.apache.org/repos/asf/oozie/commit/ef32fbb0 Tree: http://git-wip-us.apache.org/repos/asf/oozie/tree/ef32fbb0 Diff: http://git-wip-us.apache.org/repos/asf/oozie/diff/ef32fbb0 Branch: refs/heads/master Commit: ef32fbb0e3ebefd43db5e04149b65d641cdf6ec5 Parents: 71b668f Author: Andras Piros <andras.pi...@cloudera.com> Authored: Mon May 21 12:15:38 2018 +0200 Committer: Andras Piros <andras.pi...@cloudera.com> Committed: Mon May 21 12:15:38 2018 +0200 ---------------------------------------------------------------------- .../java/org/apache/oozie/cli/OozieCLI.java | 3 ++- .../java/org/apache/oozie/util/DateUtils.java | 25 +++++++++++++++++--- .../org/apache/oozie/util/TestDateUtils.java | 13 ++++++++-- .../site/twiki/CoordinatorFunctionalSpec.twiki | 11 ++++++--- release-log.txt | 1 + 5 files changed, 44 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/oozie/blob/ef32fbb0/client/src/main/java/org/apache/oozie/cli/OozieCLI.java ---------------------------------------------------------------------- diff --git a/client/src/main/java/org/apache/oozie/cli/OozieCLI.java b/client/src/main/java/org/apache/oozie/cli/OozieCLI.java index 4abc750..2828633 100644 --- a/client/src/main/java/org/apache/oozie/cli/OozieCLI.java +++ b/client/src/main/java/org/apache/oozie/cli/OozieCLI.java @@ -2267,7 +2267,8 @@ public class OozieCLI { } private void printAvailableTimeZones() { - System.out.println("The format is \"SHORT_NAME (ID)\"\nGive the ID to the -timezone argument"); + System.out.println("The format is \"SHORT_NAME (ID)\"\nGive the ID (GMT, UTC or Region/City)" + + "to the -timezone argument"); System.out.println("GMT offsets can also be used (e.g. GMT-07:00, GMT-0700, GMT+05:30, GMT+0530)"); System.out.println("Available Time Zones:"); for (String tzId : TimeZone.getAvailableIDs()) { http://git-wip-us.apache.org/repos/asf/oozie/blob/ef32fbb0/core/src/main/java/org/apache/oozie/util/DateUtils.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/oozie/util/DateUtils.java b/core/src/main/java/org/apache/oozie/util/DateUtils.java index 261dc3d..e63a1fb 100644 --- a/core/src/main/java/org/apache/oozie/util/DateUtils.java +++ b/core/src/main/java/org/apache/oozie/util/DateUtils.java @@ -18,6 +18,7 @@ package org.apache.oozie.util; +import com.google.common.annotations.VisibleForTesting; import java.sql.Timestamp; import java.text.DateFormat; import java.text.ParseException; @@ -29,7 +30,6 @@ import java.util.GregorianCalendar; import java.util.TimeZone; import java.util.regex.Matcher; import java.util.regex.Pattern; - import org.apache.hadoop.conf.Configuration; import org.apache.oozie.coord.TimeUnit; import org.apache.oozie.service.ConfigurationService; @@ -38,9 +38,9 @@ import org.apache.oozie.service.ConfigurationService; * Date utility classes to parse and format datetimes in Oozie expected datetime formats. */ public class DateUtils { - + private static final XLog LOG = XLog.getLog(DateUtils.class); private static final Pattern GMT_OFFSET_COLON_PATTERN = Pattern.compile("^GMT(\\-|\\+)(\\d{2})(\\d{2})$"); - + private static final Pattern THREE_LETTER_ID_PATTERN = Pattern.compile("[A-Z]{3}"); public static final TimeZone UTC = getTimeZone("UTC"); public static final String ISO8601_UTC_MASK = "yyyy-MM-dd'T'HH:mm'Z'"; @@ -141,6 +141,12 @@ public class DateUtils { } tzId = handleGMTOffsetTZNames(tzId); // account for GMT-#### TimeZone tz = TimeZone.getTimeZone(tzId); + + // Check whether tzID can handle DST shifts + if (!isThreeLetterTZName(tzId)) { + LOG.warn("GMT, UTC or Region/City Timezone formats are preferred instead of " + tzId); + } + // If these are not equal, it means that the tzId is not valid (invalid tzId's return GMT) if (!tz.getID().equals(tzId)) { throw new IllegalArgumentException("Invalid TimeZone: " + tzId); @@ -149,6 +155,19 @@ public class DateUtils { } /** + * Check whether 3-letter timezone ID is in preferred format, + * UTC, GMT or Region/City, the other three-letter codes may not handle + * DST shifts properly. + * @param tzId + * @return true if format is not appropriate for DST shift + */ + @VisibleForTesting + static boolean isThreeLetterTZName(String tzId) { + Matcher m = THREE_LETTER_ID_PATTERN.matcher(tzId); + return m.matches() && !tzId.equalsIgnoreCase("UTC") && !tzId.equalsIgnoreCase("GMT"); + } + + /** * Parses a datetime in ISO8601 format in UTC timezone * * @param s string with the datetime to parse. http://git-wip-us.apache.org/repos/asf/oozie/blob/ef32fbb0/core/src/test/java/org/apache/oozie/util/TestDateUtils.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/oozie/util/TestDateUtils.java b/core/src/test/java/org/apache/oozie/util/TestDateUtils.java index 2fcac51..1df7b78 100644 --- a/core/src/test/java/org/apache/oozie/util/TestDateUtils.java +++ b/core/src/test/java/org/apache/oozie/util/TestDateUtils.java @@ -15,14 +15,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.apache.oozie.util; import org.apache.hadoop.conf.Configuration; import org.junit.After; import org.junit.Assert; import org.junit.Test; - import java.text.ParseException; import java.util.Date; import java.util.TimeZone; @@ -137,4 +135,15 @@ public class TestDateUtils { public void testGetTimeZoneInvalidFormatNull() throws Exception { DateUtils.getTimeZone(null); } + + @Test + public void testIsThreeLetterTZName() { + Assert.assertTrue(DateUtils.isThreeLetterTZName("PST")); + Assert.assertTrue(DateUtils.isThreeLetterTZName("PDT")); + Assert.assertTrue(DateUtils.isThreeLetterTZName("BST")); + Assert.assertTrue(DateUtils.isThreeLetterTZName("CST")); + Assert.assertFalse(DateUtils.isThreeLetterTZName("UTC")); + Assert.assertFalse(DateUtils.isThreeLetterTZName("GMT")); + Assert.assertFalse(DateUtils.isThreeLetterTZName("America/Los_Angeles")); + } } http://git-wip-us.apache.org/repos/asf/oozie/blob/ef32fbb0/docs/src/site/twiki/CoordinatorFunctionalSpec.twiki ---------------------------------------------------------------------- diff --git a/docs/src/site/twiki/CoordinatorFunctionalSpec.twiki b/docs/src/site/twiki/CoordinatorFunctionalSpec.twiki index bc32806..cd416d4 100644 --- a/docs/src/site/twiki/CoordinatorFunctionalSpec.twiki +++ b/docs/src/site/twiki/CoordinatorFunctionalSpec.twiki @@ -136,7 +136,7 @@ time zone is other than =UTC=, the qualifier must be the GMT offset, =(+/-)####= For example, a datetime in =UTC= is =2012-08-12T00:00Z=, the same datetime in =GMT+5:30= is =2012-08-12T05:30+0530=. -For simplicity, there rest of this specification uses =UTC= datetimes. +For simplicity, the rest of this specification uses =UTC= datetimes. #datetime ---+++ 4.1. Datetime @@ -166,8 +166,13 @@ There is no widely accepted standard to identify timezones. Oozie Coordinator will understand the following timezone identifiers: * Generic NON-DST timezone identifier: =GMT[+/-]##:##= (i.e.: GMT+05:30) + * UTC timezone identifier: =UTC= (i.e.: 2009-06-06T00:00Z) * ZoneInfo identifiers, with DST support, understood by Java JDK (about 600 IDs) (i.e.: America/Los_Angeles) +Due to DST shift from PST to PDT, it is preferred that GMT, UTC or Region/City timezone notation is used in +favor of direct three-letter ID (PST, PDT, BST, etc.). For example, America/Los_Angeles switches from PST to PDT +at a DST shift. If used directly, PST will not handle DST shift when time is switched to PDT. + Oozie Coordinator must provide a tool for developers to list all supported timezone identifiers. ---+++ 4.3. Timezones and Daylight-Saving @@ -3445,12 +3450,12 @@ In other words, it offsets the =baseDate= by the difference from Oozie processin account for daylight saving time based on the given =baseDate= and =timezone=. The =timezone= argument accepts any timezone or GMT offset that is returned by the -[[DG_CommandLineTool#Getting_a_list_of_time_zones]["info -timezones"]] command. For example, "America/Los_Angeles" or "PST". +[[DG_CommandLineTool#Getting_a_list_of_time_zones]["info -timezones"]] command. For example, "America/Los_Angeles". For example, if =baseDate= is '2012-06-13T00:00Z' and =timezone= is 'America/Los_Angeles', the return date will be '2012-06-12T17:00Z'. But if =baseDate= is '2012-12-13T00:00Z', then the return date will be '2012-12-12T16:00Z'. The difference in return dates occurs because the former occurs during Summer when DST is in effect (UTC-0700) and the latter occurs during Winter -when DST is no in effect (UTC-0800). +when DST is not in effect (UTC-0800). *%GREEN% Example: %ENDCOLOR%*: http://git-wip-us.apache.org/repos/asf/oozie/blob/ef32fbb0/release-log.txt ---------------------------------------------------------------------- diff --git a/release-log.txt b/release-log.txt index 7f8d651..e46b4cc 100644 --- a/release-log.txt +++ b/release-log.txt @@ -1,5 +1,6 @@ -- Oozie 5.1.0 release (trunk - unreleased) +OOZIE-2867 [Coordinators] Emphasize Region/City timezone format (dbist13 via rkanter, andras.piros) OOZIE-3242 Flaky test TestXCommand#testXCommandLifecycleLockingFailingToLock (pbacsko via gezapeti) OOZIE-3226 [tools] TestOozieDBCLI#testOozieDBCLI() fails (pbacsko via gezapeti) OOZIE-2968 TestJavaActionExecutor.testCredentialsSkip fails intermittently (pbacsko via gezapeti)