[ 
https://issues.apache.org/jira/browse/HIVE-26363?focusedWorklogId=802327&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-802327
 ]

ASF GitHub Bot logged work on HIVE-26363:
-----------------------------------------

                Author: ASF GitHub Bot
            Created on: 22/Aug/22 03:19
            Start Date: 22/Aug/22 03:19
    Worklog Time Spent: 10m 
      Work Description: pudidic commented on code in PR #3541:
URL: https://github.com/apache/hive/pull/3541#discussion_r950978148


##########
ql/src/test/org/apache/hadoop/hive/ql/parse/repl/TestReplStateLogTimeFormat.java:
##########
@@ -0,0 +1,109 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hive.ql.parse.repl;
+
+import org.apache.hadoop.hive.ql.parse.repl.load.log.state.DataCopyEnd;
+import org.apache.hadoop.hive.ql.exec.repl.util.ReplUtils;
+import org.reflections.Reflections;
+import org.junit.Test;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+
+import java.lang.reflect.Field;
+import java.time.Instant;
+import java.util.HashSet;
+import java.util.Objects;
+import java.util.Set;
+
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+
+public class TestReplStateLogTimeFormat {
+  private static final long randomDate = 1659367078L;
+  private static final String UTCString = 
Instant.ofEpochSecond(randomDate).toString();
+  private static final Set<Class<? extends ReplState>> 
DUMP_LOG_EXEMPTED_CLASSES;
+  private static final Set<Class<? extends ReplState>> 
LOAD_LOG_EXEMPTED_CLASSES;
+
+  static {
+    // Add classes which don't have a time field or time fields which need not 
be serialized to UTC format.
+    DUMP_LOG_EXEMPTED_CLASSES = new HashSet<>();
+
+    LOAD_LOG_EXEMPTED_CLASSES = new HashSet<>();
+    LOAD_LOG_EXEMPTED_CLASSES.add(DataCopyEnd.class);
+  }
+
+  private void verifyAnnotationAndSetEpoch(ReplState replState) throws 
Exception {
+    boolean isAnnotationSet = false;
+    for (Field field : replState.getClass().getDeclaredFields()) {
+      if (Objects.nonNull(field.getAnnotation(JsonSerialize.class))) {
+        if 
(ReplUtils.TimeSerializer.class.equals(field.getAnnotation(JsonSerialize.class).using()))
 {
+          field.setAccessible(true);
+          field.set(replState, randomDate);
+          isAnnotationSet = true;
+        }
+      }
+    }
+    assertTrue(
+            String.format("Class %s has a time field which is not annotated 
with " +
+                            "@JsonSerialize(using = 
ReplUtils.TimeSerializer.class) " +
+                            "Please annotate the time field with it or add it 
to appropriate exempted set above",
+                    replState.getClass().getName()),
+            isAnnotationSet
+    );
+  }
+
+  private void verifyUTCString(ReplState replState) throws Exception {
+    ObjectMapper objectMapper = new ObjectMapper();
+    String json = objectMapper.writeValueAsString(replState);
+    assertTrue(
+            String.format("Expected UTC string %s not found in serialized 
representation of %s",
+                    UTCString, replState.getClass().getName()),
+            json.contains(UTCString)
+    );
+  }
+
+
+  private void testTimeFormat(String packagePath, Set<Class<? extends 
ReplState>> EXEMPTED_CLASS) throws Exception {
+    Set<Class<? extends ReplState>> replStateLogClasses
+            = new Reflections(packagePath).getSubTypesOf(ReplState.class);
+    for (Class<? extends ReplState> cls : replStateLogClasses) {
+      if (EXEMPTED_CLASS.contains(cls)) {
+        continue;
+      }
+      ReplState replState = mock(cls);
+      verifyAnnotationAndSetEpoch(replState);
+      verifyUTCString(replState);
+    }
+  }
+
+  @Test
+  public void test() throws Exception {

Review Comment:
   How about having a more specific name to reveal more about its intention?



##########
ql/src/test/org/apache/hadoop/hive/ql/parse/repl/TestReplStateLogTimeFormat.java:
##########
@@ -0,0 +1,109 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hive.ql.parse.repl;
+
+import org.apache.hadoop.hive.ql.parse.repl.load.log.state.DataCopyEnd;
+import org.apache.hadoop.hive.ql.exec.repl.util.ReplUtils;
+import org.reflections.Reflections;
+import org.junit.Test;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+
+import java.lang.reflect.Field;
+import java.time.Instant;
+import java.util.HashSet;
+import java.util.Objects;
+import java.util.Set;
+
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+
+public class TestReplStateLogTimeFormat {
+  private static final long randomDate = 1659367078L;
+  private static final String UTCString = 
Instant.ofEpochSecond(randomDate).toString();
+  private static final Set<Class<? extends ReplState>> 
DUMP_LOG_EXEMPTED_CLASSES;
+  private static final Set<Class<? extends ReplState>> 
LOAD_LOG_EXEMPTED_CLASSES;
+
+  static {
+    // Add classes which don't have a time field or time fields which need not 
be serialized to UTC format.
+    DUMP_LOG_EXEMPTED_CLASSES = new HashSet<>();
+
+    LOAD_LOG_EXEMPTED_CLASSES = new HashSet<>();
+    LOAD_LOG_EXEMPTED_CLASSES.add(DataCopyEnd.class);
+  }
+
+  private void verifyAnnotationAndSetEpoch(ReplState replState) throws 
Exception {
+    boolean isAnnotationSet = false;
+    for (Field field : replState.getClass().getDeclaredFields()) {
+      if (Objects.nonNull(field.getAnnotation(JsonSerialize.class))) {
+        if 
(ReplUtils.TimeSerializer.class.equals(field.getAnnotation(JsonSerialize.class).using()))
 {
+          field.setAccessible(true);
+          field.set(replState, randomDate);
+          isAnnotationSet = true;
+        }
+      }
+    }
+    assertTrue(
+            String.format("Class %s has a time field which is not annotated 
with " +

Review Comment:
   The current Hive code base usually indents with 2 or 4 whitespaces for new 
lines with open brackets. There are 8 ones, but they are rare.



##########
ql/src/test/org/apache/hadoop/hive/ql/parse/repl/TestReplStateLogTimeFormat.java:
##########
@@ -0,0 +1,109 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hive.ql.parse.repl;
+
+import org.apache.hadoop.hive.ql.parse.repl.load.log.state.DataCopyEnd;
+import org.apache.hadoop.hive.ql.exec.repl.util.ReplUtils;
+import org.reflections.Reflections;
+import org.junit.Test;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+
+import java.lang.reflect.Field;
+import java.time.Instant;
+import java.util.HashSet;
+import java.util.Objects;
+import java.util.Set;
+
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+
+public class TestReplStateLogTimeFormat {
+  private static final long randomDate = 1659367078L;
+  private static final String UTCString = 
Instant.ofEpochSecond(randomDate).toString();
+  private static final Set<Class<? extends ReplState>> 
DUMP_LOG_EXEMPTED_CLASSES;
+  private static final Set<Class<? extends ReplState>> 
LOAD_LOG_EXEMPTED_CLASSES;
+
+  static {
+    // Add classes which don't have a time field or time fields which need not 
be serialized to UTC format.
+    DUMP_LOG_EXEMPTED_CLASSES = new HashSet<>();
+
+    LOAD_LOG_EXEMPTED_CLASSES = new HashSet<>();
+    LOAD_LOG_EXEMPTED_CLASSES.add(DataCopyEnd.class);
+  }
+
+  private void verifyAnnotationAndSetEpoch(ReplState replState) throws 
Exception {
+    boolean isAnnotationSet = false;
+    for (Field field : replState.getClass().getDeclaredFields()) {
+      if (Objects.nonNull(field.getAnnotation(JsonSerialize.class))) {
+        if 
(ReplUtils.TimeSerializer.class.equals(field.getAnnotation(JsonSerialize.class).using()))
 {
+          field.setAccessible(true);
+          field.set(replState, randomDate);
+          isAnnotationSet = true;
+        }
+      }
+    }
+    assertTrue(
+            String.format("Class %s has a time field which is not annotated 
with " +
+                            "@JsonSerialize(using = 
ReplUtils.TimeSerializer.class) " +
+                            "Please annotate the time field with it or add it 
to appropriate exempted set above",
+                    replState.getClass().getName()),
+            isAnnotationSet
+    );
+  }
+
+  private void verifyUTCString(ReplState replState) throws Exception {
+    ObjectMapper objectMapper = new ObjectMapper();
+    String json = objectMapper.writeValueAsString(replState);
+    assertTrue(
+            String.format("Expected UTC string %s not found in serialized 
representation of %s",
+                    UTCString, replState.getClass().getName()),
+            json.contains(UTCString)
+    );
+  }
+
+
+  private void testTimeFormat(String packagePath, Set<Class<? extends 
ReplState>> EXEMPTED_CLASS) throws Exception {
+    Set<Class<? extends ReplState>> replStateLogClasses
+            = new Reflections(packagePath).getSubTypesOf(ReplState.class);
+    for (Class<? extends ReplState> cls : replStateLogClasses) {
+      if (EXEMPTED_CLASS.contains(cls)) {
+        continue;
+      }
+      ReplState replState = mock(cls);
+      verifyAnnotationAndSetEpoch(replState);
+      verifyUTCString(replState);
+    }
+  }
+
+  @Test
+  public void test() throws Exception {
+    testTimeFormat("org.apache.hadoop.hive.ql.parse.repl.dump.log.state", 
DUMP_LOG_EXEMPTED_CLASSES);
+    testTimeFormat("org.apache.hadoop.hive.ql.parse.repl.load.log.state", 
LOAD_LOG_EXEMPTED_CLASSES);
+  }
+
+  @Test(expected = AssertionError.class)
+  public void testClassWithoutAnnotation() throws Exception {
+    ReplState replStateClassWithoutAnnotation = new ReplState() {
+      private Long StartTime;
+    };
+    verifyAnnotationAndSetEpoch(replStateClassWithoutAnnotation);
+  }
+
+}

Review Comment:
   We usually end a file with a new line.



##########
ql/src/test/org/apache/hadoop/hive/ql/parse/repl/TestReplStateLogTimeFormat.java:
##########
@@ -0,0 +1,109 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hive.ql.parse.repl;
+
+import org.apache.hadoop.hive.ql.parse.repl.load.log.state.DataCopyEnd;
+import org.apache.hadoop.hive.ql.exec.repl.util.ReplUtils;
+import org.reflections.Reflections;
+import org.junit.Test;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+
+import java.lang.reflect.Field;
+import java.time.Instant;
+import java.util.HashSet;
+import java.util.Objects;
+import java.util.Set;
+
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+
+public class TestReplStateLogTimeFormat {
+  private static final long randomDate = 1659367078L;
+  private static final String UTCString = 
Instant.ofEpochSecond(randomDate).toString();
+  private static final Set<Class<? extends ReplState>> 
DUMP_LOG_EXEMPTED_CLASSES;
+  private static final Set<Class<? extends ReplState>> 
LOAD_LOG_EXEMPTED_CLASSES;
+
+  static {
+    // Add classes which don't have a time field or time fields which need not 
be serialized to UTC format.
+    DUMP_LOG_EXEMPTED_CLASSES = new HashSet<>();
+
+    LOAD_LOG_EXEMPTED_CLASSES = new HashSet<>();
+    LOAD_LOG_EXEMPTED_CLASSES.add(DataCopyEnd.class);
+  }
+
+  private void verifyAnnotationAndSetEpoch(ReplState replState) throws 
Exception {
+    boolean isAnnotationSet = false;
+    for (Field field : replState.getClass().getDeclaredFields()) {
+      if (Objects.nonNull(field.getAnnotation(JsonSerialize.class))) {
+        if 
(ReplUtils.TimeSerializer.class.equals(field.getAnnotation(JsonSerialize.class).using()))
 {
+          field.setAccessible(true);
+          field.set(replState, randomDate);
+          isAnnotationSet = true;
+        }
+      }
+    }
+    assertTrue(
+            String.format("Class %s has a time field which is not annotated 
with " +
+                            "@JsonSerialize(using = 
ReplUtils.TimeSerializer.class) " +
+                            "Please annotate the time field with it or add it 
to appropriate exempted set above",
+                    replState.getClass().getName()),
+            isAnnotationSet
+    );
+  }
+
+  private void verifyUTCString(ReplState replState) throws Exception {
+    ObjectMapper objectMapper = new ObjectMapper();
+    String json = objectMapper.writeValueAsString(replState);
+    assertTrue(
+            String.format("Expected UTC string %s not found in serialized 
representation of %s",
+                    UTCString, replState.getClass().getName()),
+            json.contains(UTCString)
+    );
+  }
+
+
+  private void testTimeFormat(String packagePath, Set<Class<? extends 
ReplState>> EXEMPTED_CLASS) throws Exception {

Review Comment:
   How about having 'check' or 'verify' for its prefix? Because 'test' prefix 
is usually used for JUnit test methods with the Test annotation.



##########
ql/src/java/org/apache/hadoop/hive/ql/parse/repl/dump/log/state/AtlasDumpBegin.java:
##########
@@ -17,6 +17,8 @@
  */
 package org.apache.hadoop.hive.ql.parse.repl.dump.log.state;
 
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;

Review Comment:
   How about grouping with the line 25 `import 
com.fasterxml.jackson.annotation.JsonProperty;`? A same comment applies for 
other files, too.





Issue Time Tracking
-------------------

    Worklog Id:     (was: 802327)
    Time Spent: 1h 50m  (was: 1h 40m)

> Time logged during repldump and replload per table is not in readable format
> ----------------------------------------------------------------------------
>
>                 Key: HIVE-26363
>                 URL: https://issues.apache.org/jira/browse/HIVE-26363
>             Project: Hive
>          Issue Type: Improvement
>          Components: HiveServer2, repl
>    Affects Versions: 4.0.0
>            Reporter: Imran
>            Assignee: Rakshith C
>            Priority: Minor
>              Labels: pull-request-available
>          Time Spent: 1h 50m
>  Remaining Estimate: 0h
>
> During replDump and replLoad we capture time take for each activity in 
> hive.log file. This is captured in milliseconds which becomes difficult to 
> read during debug activity, this ticket is raised to change the time logged 
> in hive.log in UTC format.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to