@Override
  public DeleteResult isDeleted(ExtendedCell cell) {
    try {
      long duplicateMvcc = prepare(cell);

      for (Map.Entry<Long, DeleteVersionsNode> e : delColMap.tailMap(cell.getSequenceId())
        .entrySet()) {
        VisibilityDeleteVersionsNode node = (VisibilityDeleteVersionsNode) e.getValue();
        long deleteMvcc = Long.MAX_VALUE;
        SortedMap<Long, TagInfo> deleteVersionMvccs = node.deletesMap.get(cell.getTimestamp());
        if (deleteVersionMvccs != null) {
          SortedMap<Long, TagInfo> tail = deleteVersionMvccs.tailMap(cell.getSequenceId());
          for (Map.Entry<Long, TagInfo> entry : tail.entrySet()) {
            if (tagMatched(cell, entry.getValue())) {
              deleteMvcc = tail.firstKey();
              break;
            }
          }
        }
        SortedMap<Long, SortedSet<Long>> subMap = node.mvccCountingMap.subMap(cell.getSequenceId(),
          true, Math.min(duplicateMvcc, deleteMvcc), true);
        for (Map.Entry<Long, SortedSet<Long>> seg : subMap.entrySet()) {
          if (seg.getValue().size() >= maxVersions) {
            return DeleteResult.VERSION_MASKED;
          }
          seg.getValue().add(cell.getSequenceId());
        }
        if (deleteMvcc < Long.MAX_VALUE) {
          return DeleteResult.VERSION_DELETED;
        }

        if (cell.getTimestamp() <= node.ts && tagMatched(cell, node.tagInfo)) {
          return DeleteResult.COLUMN_DELETED;
        }
      }
      if (duplicateMvcc < Long.MAX_VALUE) {
        return DeleteResult.VERSION_MASKED;
      }
    } catch (IOException e) {
      LOG.error("Error in isDeleted() check! Will treat cell as not deleted", e);
    }
    return DeleteResult.NOT_DELETED;
  }
Similar to MvccSensitiveTracker but tracks the visibility expression also before deciding if a
Cell can be considered deleted
hbase-server/src/main/java/org/apache/hadoop/hbase/security/visibility/VisibilityNewVersionBehaivorTracker.java