keith-turner commented on code in PR #3150:
URL: https://github.com/apache/accumulo/pull/3150#discussion_r1064281018


##########
server/tserver/src/main/java/org/apache/accumulo/tserver/ScanServer.java:
##########
@@ -489,7 +499,7 @@ public void close() {
   }
 
   private Map<KeyExtent,TabletMetadata> 
reserveFilesInner(Collection<KeyExtent> extents,

Review Comment:
   ```suggestion
     /*
      * All extents passed in should end in either the returned map or the 
failures set, but no extent should be in both.
      */
     private Map<KeyExtent,TabletMetadata> 
reserveFilesInner(Collection<KeyExtent> extents,
   ```



##########
server/tserver/src/main/java/org/apache/accumulo/tserver/ScanServer.java:
##########
@@ -881,7 +903,7 @@ public InitialMultiScan startMultiScan(TInfo tinfo, 
TCredentials credentials,
       batch.put(extent, entry.getValue());
     }
 
-    try (ScanReservation reservation = reserveFiles(batch.keySet())) {
+    try (ScanReservation reservation = reserveFiles(batch)) {
 
       HashMap<KeyExtent,TabletBase> tablets = new HashMap<>();
       batch.keySet().forEach(extent -> {

Review Comment:
   The following should be the set of non failure tablets.
   
   ```suggestion
         reservation.tabletMetadata.keySet().forEach(extent -> {
   ```



##########
server/tserver/src/main/java/org/apache/accumulo/tserver/ScanServer.java:
##########
@@ -633,17 +644,24 @@ private Map<KeyExtent,TabletMetadata> 
reserveFilesInner(Collection<KeyExtent> ex
     }
   }
 
-  protected ScanReservation reserveFiles(Collection<KeyExtent> extents)
-      throws NotServingTabletException, AccumuloException {
+  protected ScanReservation reserveFiles(Map<KeyExtent,List<TRange>> extents)
+      throws AccumuloException {
 
     long myReservationId = nextScanReservationId.incrementAndGet();
 
-    Map<KeyExtent,TabletMetadata> tabletsMetadata = reserveFilesInner(extents, 
myReservationId);
+    Set<KeyExtent> failedReservations = new HashSet<>();
+    Map<KeyExtent,TabletMetadata> tabletsMetadata =
+        reserveFilesInner(extents.keySet(), myReservationId, 
failedReservations);
     while (tabletsMetadata == null) {
-      tabletsMetadata = reserveFilesInner(extents, myReservationId);
+      tabletsMetadata = reserveFilesInner(extents.keySet(), myReservationId, 
failedReservations);
     }
+    // Convert failures

Review Comment:
   We could add a validation on the return.
   
   ```suggestion
       if(!Collections.disjoint(tabletsMetadata.keySet(), failures) || 
!extents.keySet().equals(Sets.union(tabletsMetadata.keySet(), failures)) {
           throw new AssertionError("bug in reserverFilesInner 
"+extents.keySet()+" "+tabletsMetadata.keySet()+" "+failures);
       }
   
       // Convert failures
   ```



##########
server/tserver/src/main/java/org/apache/accumulo/tserver/ScanServer.java:
##########
@@ -896,6 +918,10 @@ public InitialMultiScan startMultiScan(TInfo tinfo, 
TCredentials credentials,
           ssio, authorizations, waitForWrites, tSamplerConfig, batchTimeOut, 
contextArg,
           executionHints, getBatchScanTabletResolver(tablets), busyTimeout);
 
+      if (!reservation.getFailures().isEmpty()) {
+        ims.result.setFailures(reservation.getFailures());
+      }
+

Review Comment:
   I was wondering if we need to handle the case of the delegate having already 
set some failures.   Digging around to answer that question I found [this 
code](https://github.com/apache/accumulo/blob/af6b4978d42e7a1f9102a7ec9605be51c67bb595/server/tserver/src/main/java/org/apache/accumulo/tserver/scan/LookupTask.java#L108-L113).
  Looking at that I think as long the tablet resolver does not return anything 
that failed then it will naturally be added to the failure by 
delegate.startMultiScan().  I added comments elsewhere about getting the tablet 
resolver to not contain failures.  
   
   ```suggestion
   ```



##########
server/tserver/src/main/java/org/apache/accumulo/tserver/ScanServer.java:
##########
@@ -500,13 +510,13 @@ private Map<KeyExtent,TabletMetadata> 
reserveFilesInner(Collection<KeyExtent> ex
       var tabletMetadata = tabletsMetadata.get(extent);
       if (tabletMetadata == null) {
         LOG.info("RFFS {} extent not found in metadata table {}", 
myReservationId, extent);
-        throw new NotServingTabletException(extent.toThrift());
+        failures.add(extent);
       }
 
       if (!AssignmentHandler.checkTabletMetadata(extent, null, tabletMetadata, 
true)) {
         LOG.info("RFFS {} extent unable to load {} as AssignmentHandler 
returned false",
             myReservationId, extent);
-        throw new NotServingTabletException(extent.toThrift());
+        failures.add(extent);

Review Comment:
   ```suggestion
           failures.add(extent);
           tabletsMetadata.remove(extent);
   ```



##########
server/tserver/src/main/java/org/apache/accumulo/tserver/ScanServer.java:
##########
@@ -633,17 +644,24 @@ private Map<KeyExtent,TabletMetadata> 
reserveFilesInner(Collection<KeyExtent> ex
     }
   }
 
-  protected ScanReservation reserveFiles(Collection<KeyExtent> extents)
-      throws NotServingTabletException, AccumuloException {
+  protected ScanReservation reserveFiles(Map<KeyExtent,List<TRange>> extents)
+      throws AccumuloException {
 
     long myReservationId = nextScanReservationId.incrementAndGet();
 
-    Map<KeyExtent,TabletMetadata> tabletsMetadata = reserveFilesInner(extents, 
myReservationId);
+    Set<KeyExtent> failedReservations = new HashSet<>();
+    Map<KeyExtent,TabletMetadata> tabletsMetadata =
+        reserveFilesInner(extents.keySet(), myReservationId, 
failedReservations);
     while (tabletsMetadata == null) {
-      tabletsMetadata = reserveFilesInner(extents, myReservationId);
+      tabletsMetadata = reserveFilesInner(extents.keySet(), myReservationId, 
failedReservations);

Review Comment:
   ```suggestion
         failedReservations.clear();
         tabletsMetadata = reserveFilesInner(extents.keySet(), myReservationId, 
failedReservations);
   ```



##########
server/tserver/src/main/java/org/apache/accumulo/tserver/ScanServer.java:
##########
@@ -592,11 +602,12 @@ private Map<KeyExtent,TabletMetadata> 
reserveFilesInner(Collection<KeyExtent> ex
             getContext().getAmple().deleteScanServerFileReferences(refs);
             LOG.info("RFFS {} extent unable to load {} as metadata no longer 
referencing files",
                 myReservationId, extent);
-            throw new NotServingTabletException(extent.toThrift());
+            failures.add(extent);

Review Comment:
   ```suggestion
               failures.add(extent);
               tabletsMetadata.remove(extent);
   ```



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to