code: public void discoverAll() {
          status.assertRunning(getClass(), "discoverAll()");
  
          Runnable runnable = new Runnable() {
              @Override
              public void run() {
                  WriteLock lock = EndpointService.this.discoveryScanRWLock.writeLock();
                  lock.lock();
                  try {
                      DiscoveryResults discoveryResults = new DiscoveryResults();
  
                      LOG.infoDiscoveryRequested(getMonitoredEndpoint());
                      long duration = -1;
                      try (S session = openSession()) {
                          Set<ResourceType<L>> rootTypes = getResourceTypeManager().getRootResourceTypes();
                          Context timer = getDiagnostics().getFullDiscoveryScanTimer().time();
                          for (ResourceType<L> rootType : rootTypes) {
                              discoverChildren(null, rootType, session, discoveryResults);
                          }
                          long nanos = timer.stop();
                          duration = TimeUnit.MILLISECONDS.convert(nanos, TimeUnit.NANOSECONDS);
                      } catch (Exception e) {
                          LOG.errorCouldNotAccess(EndpointService.this, e);
                          discoveryResults.error(e);
                      }
  
                      getResourceManager().logTreeGraph("Discovered all resources for: " + getMonitoredEndpoint(),
                              duration);
  
                      discoveryResults.discoveryFinished();
                  } finally {
                      lock.unlock();
                  }
              }
          };
  
          try {
              this.fullDiscoveryScanThreadPool.execute(runnable);
          } catch (RejectedExecutionException ree) {
              LOG.debugf("Redundant full discovery scan will be ignored for endpoint [%s]", getMonitoredEndpoint());
          }
      }
docs: Discovers all resources, puts them in the {@link #resourceManager},
  and triggers any listeners listening for new inventory.
  
  This will look for all root resources (resources whose types are that of the root resource types
  as defined by {@link ResourceTypeManager#getRootResourceTypes()} and then obtain all their
  children (recursively down to all descendents). Effectively, this discovers the full
  resource hierarchy.
  
  This method does not block - it runs the discovery in another thread.