jihoonson commented on a change in pull request #6094: Introduce SystemSchema 
tables (#5989)
URL: https://github.com/apache/incubator-druid/pull/6094#discussion_r221125652
 
 

 ##########
 File path: 
sql/src/main/java/org/apache/druid/sql/calcite/schema/DruidSchema.java
 ##########
 @@ -320,25 +322,32 @@ public void awaitInitialization() throws 
InterruptedException
   private void addSegment(final DruidServerMetadata server, final DataSegment 
segment)
   {
     synchronized (lock) {
-      final Map<DataSegment, RowSignature> knownSegments = 
segmentSignatures.get(segment.getDataSource());
+      final Map<DataSegment, SegmentMetadataHolder> knownSegments = 
segmentMetadataInfo.get(segment.getDataSource());
       if (knownSegments == null || !knownSegments.containsKey(segment)) {
+        final long isRealtime = server.segmentReplicatable() ? 0 : 1;
+        final long isPublished = 
server.getType().toString().equals(ServerType.HISTORICAL.toString()) ? 1 : 0;
+        SegmentMetadataHolder holder = new SegmentMetadataHolder(null, 
isPublished, 1, isRealtime, 1, null);
         // Unknown segment.
-        setSegmentSignature(segment, null);
+        setSegmentSignature(segment, holder);
         segmentsNeedingRefresh.add(segment);
-
         if (!server.segmentReplicatable()) {
           log.debug("Added new mutable segment[%s].", segment.getIdentifier());
           mutableSegments.add(segment);
         } else {
           log.debug("Added new immutable segment[%s].", 
segment.getIdentifier());
         }
-      } else if (server.segmentReplicatable()) {
-        // If a segment shows up on a replicatable (historical) server at any 
point, then it must be immutable,
-        // even if it's also available on non-replicatable (realtime) servers.
-        mutableSegments.remove(segment);
-        log.debug("Segment[%s] has become immutable.", 
segment.getIdentifier());
+      } else {
+        if (knownSegments != null && knownSegments.containsKey(segment)) {
 
 Review comment:
   `ConcurrentSkipListMap.containsKey()` is implemented as below:
   
   ```
       public boolean containsKey(Object key) {
           return doGet(key) != null;
       }
   ```
   
   and this can cause the race condition if we remove `lock` of this class that 
the segment exists when `containsKey()` is called but doesn't exist when 
`get()` gets called in the below.

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


With regards,
Apache Git Services

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

Reply via email to