This is an automated email from the ASF dual-hosted git repository.

asdf2014 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-druid.git


The following commit(s) were added to refs/heads/master by this push:
     new e18d5d9  Ignore bad JSON entries in 
SQLMetadataSupervisorManager.getAll() (#7278)
e18d5d9 is described below

commit e18d5d96d991af448ce5f390226609de65d019b5
Author: Jihoon Son <[email protected]>
AuthorDate: Sun Mar 17 23:28:11 2019 -0700

    Ignore bad JSON entries in SQLMetadataSupervisorManager.getAll() (#7278)
---
 .../supervisor/VersionedSupervisorSpec.java        |  9 ++-
 .../metadata/SQLMetadataSupervisorManager.java     | 21 ++++--
 .../metadata/SQLMetadataSupervisorManagerTest.java | 85 ++++++++++++++++++----
 .../apache/druid/metadata/TestSupervisorSpec.java  | 34 ++++++++-
 4 files changed, 127 insertions(+), 22 deletions(-)

diff --git 
a/server/src/main/java/org/apache/druid/indexing/overlord/supervisor/VersionedSupervisorSpec.java
 
b/server/src/main/java/org/apache/druid/indexing/overlord/supervisor/VersionedSupervisorSpec.java
index d589d85..51f6a7e 100644
--- 
a/server/src/main/java/org/apache/druid/indexing/overlord/supervisor/VersionedSupervisorSpec.java
+++ 
b/server/src/main/java/org/apache/druid/indexing/overlord/supervisor/VersionedSupervisorSpec.java
@@ -22,19 +22,26 @@ package org.apache.druid.indexing.overlord.supervisor;
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
+import javax.annotation.Nullable;
+
 public class VersionedSupervisorSpec
 {
+  @Nullable
   private final SupervisorSpec spec;
   private final String version;
 
   @JsonCreator
-  public VersionedSupervisorSpec(@JsonProperty("spec") SupervisorSpec spec, 
@JsonProperty("version") String version)
+  public VersionedSupervisorSpec(
+      @JsonProperty("spec") @Nullable SupervisorSpec spec,
+      @JsonProperty("version") String version
+  )
   {
     this.spec = spec;
     this.version = version;
   }
 
   @JsonProperty
+  @Nullable
   public SupervisorSpec getSpec()
   {
     return spec;
diff --git 
a/server/src/main/java/org/apache/druid/metadata/SQLMetadataSupervisorManager.java
 
b/server/src/main/java/org/apache/druid/metadata/SQLMetadataSupervisorManager.java
index 871cb5d..83fcc05 100644
--- 
a/server/src/main/java/org/apache/druid/metadata/SQLMetadataSupervisorManager.java
+++ 
b/server/src/main/java/org/apache/druid/metadata/SQLMetadataSupervisorManager.java
@@ -19,7 +19,9 @@
 
 package org.apache.druid.metadata;
 
+import com.fasterxml.jackson.core.JsonParseException;
 import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.JsonMappingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.base.Supplier;
 import com.google.common.collect.ImmutableMap;
@@ -32,6 +34,7 @@ import org.apache.druid.java.util.common.DateTimes;
 import org.apache.druid.java.util.common.Pair;
 import org.apache.druid.java.util.common.StringUtils;
 import org.apache.druid.java.util.common.lifecycle.LifecycleStart;
+import org.apache.druid.java.util.common.logger.Logger;
 import org.skife.jdbi.v2.FoldController;
 import org.skife.jdbi.v2.Folder3;
 import org.skife.jdbi.v2.Handle;
@@ -51,6 +54,8 @@ import java.util.Map;
 @ManageLifecycle
 public class SQLMetadataSupervisorManager implements MetadataSupervisorManager
 {
+  private static final Logger log = new 
Logger(SQLMetadataSupervisorManager.class);
+
   private final ObjectMapper jsonMapper;
   private final SQLMetadataConnector connector;
   private final Supplier<MetadataStorageTablesConfig> dbTables;
@@ -124,21 +129,27 @@ public class SQLMetadataSupervisorManager implements 
MetadataSupervisorManager
                       public Pair<String, VersionedSupervisorSpec> map(int 
index, ResultSet r, StatementContext ctx)
                           throws SQLException
                       {
+                        SupervisorSpec payload;
                         try {
-                          SupervisorSpec payload = jsonMapper.readValue(
+                          payload = jsonMapper.readValue(
                               r.getBytes("payload"),
                               new TypeReference<SupervisorSpec>()
                               {
                               }
                           );
-                          return Pair.of(
-                              r.getString("spec_id"),
-                              new VersionedSupervisorSpec(payload, 
r.getString("created_date"))
-                          );
+                        }
+                        catch (JsonParseException | JsonMappingException e) {
+                          log.warn("Failed to deserialize payload for 
spec_id[%s]", r.getString("spec_id"));
+                          payload = null;
                         }
                         catch (IOException e) {
                           throw new RuntimeException(e);
                         }
+
+                        return Pair.of(
+                            r.getString("spec_id"),
+                            new VersionedSupervisorSpec(payload, 
r.getString("created_date"))
+                        );
                       }
                     }
                 ).fold(
diff --git 
a/server/src/test/java/org/apache/druid/metadata/SQLMetadataSupervisorManagerTest.java
 
b/server/src/test/java/org/apache/druid/metadata/SQLMetadataSupervisorManagerTest.java
index 30f35e3..afc5f53 100644
--- 
a/server/src/test/java/org/apache/druid/metadata/SQLMetadataSupervisorManagerTest.java
+++ 
b/server/src/test/java/org/apache/druid/metadata/SQLMetadataSupervisorManagerTest.java
@@ -22,6 +22,7 @@ package org.apache.druid.metadata;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.base.Suppliers;
 import com.google.common.collect.ImmutableMap;
+import org.apache.druid.indexing.overlord.supervisor.Supervisor;
 import org.apache.druid.indexing.overlord.supervisor.SupervisorSpec;
 import org.apache.druid.indexing.overlord.supervisor.VersionedSupervisorSpec;
 import org.apache.druid.jackson.DefaultObjectMapper;
@@ -35,6 +36,7 @@ import org.junit.Test;
 import org.skife.jdbi.v2.Handle;
 import org.skife.jdbi.v2.tweak.HandleCallback;
 
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
@@ -55,6 +57,23 @@ public class SQLMetadataSupervisorManagerTest
     mapper.registerSubtypes(TestSupervisorSpec.class);
   }
 
+  @After
+  public void cleanup()
+  {
+    connector.getDBI().withHandle(
+        new HandleCallback<Void>()
+        {
+          @Override
+          public Void withHandle(Handle handle)
+          {
+            handle.createStatement(StringUtils.format("DROP TABLE %s", 
tablesConfig.getSupervisorTable()))
+                  .execute();
+            return null;
+          }
+        }
+    );
+  }
+
   @Before
   public void setUp()
   {
@@ -118,20 +137,58 @@ public class SQLMetadataSupervisorManagerTest
     Assert.assertEquals(data2rev2, ((TestSupervisorSpec) 
latestSpecs.get(supervisor2)).getData());
   }
 
-  @After
-  public void cleanup()
+  @Test
+  public void testSkipDeserializingBadSpecs()
   {
-    connector.getDBI().withHandle(
-        new HandleCallback<Void>()
-        {
-          @Override
-          public Void withHandle(Handle handle)
-          {
-            handle.createStatement(StringUtils.format("DROP TABLE %s", 
tablesConfig.getSupervisorTable()))
-                  .execute();
-            return null;
-          }
-        }
-    );
+    final String supervisor1 = "test-supervisor-1";
+    final String supervisor2 = "test-supervisor-2";
+    final Map<String, String> data1rev1 = ImmutableMap.of("key1-1", 
"value1-1-1", "key1-2", "value1-2-1");
+    final Map<String, String> data1rev2 = ImmutableMap.of("key1-1", 
"value1-1-2", "key1-2", "value1-2-2");
+
+    supervisorManager.insert(supervisor1, new TestSupervisorSpec(supervisor1, 
data1rev1));
+    supervisorManager.insert(supervisor2, new BadSupervisorSpec(supervisor2, 
supervisor2));
+    supervisorManager.insert(supervisor1, new TestSupervisorSpec(supervisor1, 
data1rev2));
+
+    final Map<String, List<VersionedSupervisorSpec>> allSpecs = 
supervisorManager.getAll();
+
+    Assert.assertEquals(2, allSpecs.size());
+    List<VersionedSupervisorSpec> specs = allSpecs.get(supervisor1);
+    Assert.assertEquals(2, specs.size());
+    Assert.assertEquals(new TestSupervisorSpec(supervisor1, data1rev2), 
specs.get(0).getSpec());
+    Assert.assertEquals(new TestSupervisorSpec(supervisor1, data1rev1), 
specs.get(1).getSpec());
+
+    specs = allSpecs.get(supervisor2);
+    Assert.assertEquals(1, specs.size());
+    Assert.assertNull(specs.get(0).getSpec());
+  }
+
+  private static class BadSupervisorSpec implements SupervisorSpec
+  {
+    private final String id;
+    private final String dataSource;
+
+    private BadSupervisorSpec(String id, String dataSource)
+    {
+      this.id = id;
+      this.dataSource = dataSource;
+    }
+
+    @Override
+    public String getId()
+    {
+      return id;
+    }
+
+    @Override
+    public Supervisor createSupervisor()
+    {
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public List<String> getDataSources()
+    {
+      return Collections.singletonList(dataSource);
+    }
   }
 }
diff --git 
a/server/src/test/java/org/apache/druid/metadata/TestSupervisorSpec.java 
b/server/src/test/java/org/apache/druid/metadata/TestSupervisorSpec.java
index bb9bf46..19802f1 100644
--- a/server/src/test/java/org/apache/druid/metadata/TestSupervisorSpec.java
+++ b/server/src/test/java/org/apache/druid/metadata/TestSupervisorSpec.java
@@ -25,11 +25,12 @@ import 
org.apache.druid.indexing.overlord.supervisor.Supervisor;
 import org.apache.druid.indexing.overlord.supervisor.SupervisorSpec;
 
 import java.util.List;
+import java.util.Objects;
 
 public class TestSupervisorSpec implements SupervisorSpec
 {
-  private String id;
-  private Object data;
+  private final String id;
+  private final Object data;
 
   @JsonCreator
   public TestSupervisorSpec(@JsonProperty("id") String id, 
@JsonProperty("data") Object data)
@@ -62,4 +63,33 @@ public class TestSupervisorSpec implements SupervisorSpec
   {
     return data;
   }
+
+  @Override
+  public boolean equals(Object o)
+  {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    TestSupervisorSpec that = (TestSupervisorSpec) o;
+    return Objects.equals(id, that.id) &&
+           Objects.equals(data, that.data);
+  }
+
+  @Override
+  public int hashCode()
+  {
+    return Objects.hash(id, data);
+  }
+
+  @Override
+  public String toString()
+  {
+    return "TestSupervisorSpec{" +
+           "id='" + id + '\'' +
+           ", data=" + data +
+           '}';
+  }
 }


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

Reply via email to