docs: @Override
      void atUninstall(BeanId beanId, BeanO bean)
      {
          final boolean isTraceOn = TraceComponent.isAnyTracingEnabled();
          if (isTraceOn && tc.isEntryEnabled())
              Tr.entry(tc, "atUninstall (" + beanId + ")");
  
          // The 'bean' parameter may be null (i.e. when calling to uninstall
          // a passivated bean), so don't count on it.                      LI3408
  
          MasterKey key = new MasterKey(beanId);
  
          synchronized (locks.getLock(key)) {
  
              if ((bean = (BeanO) cache.find(key)) != null)
              {
                  // Regardless of whether the bean has timed out or not, remove it
                  // from the cache and reaper and call uninstall, which will result
                  // in ejbPassivate being called for this bean, but skip streaming
                  // the bean out to a file.                         d106838 d112866
                  if (isTraceOn && tc.isEventEnabled())
                      Tr.event(tc, "Found bean in cache: uninstalling");
                  try
                  {
                      cache.remove(key, true);
                      bean.ivCacheKey = null; // d199233
                      reaper.remove(beanId); // d159666.1
                      ((StatefulBeanO) bean).uninstall(); // d112866
                  } catch (IllegalOperationException ioe)
                  {
                      // This occurs if the application is stopped while the bean
                      // is enlisted with an active transaction (i.e. probably hung).
                      // Nothing should be done except release the pin taken above
                      // on the find.                                       d159666.1
                      FFDCFilter.processException(ioe, CLASS_NAME + ".atUninstall",
                                                  "590", this);
                      if (isTraceOn && tc.isDebugEnabled())
                          Tr.debug(tc, "Found bean in cache: active!");
  
                      cache.unpin(key);
                  }
              }
              else
              {
                  // Since the bean is not in the cache, most likely, the bean
                  // is in the passivated state, so the file just needs to be
                  // deleted. However, it is also possible the StatefulBeanReaper
                  // has already removed the file.                           d129562
                  if (isTraceOn && tc.isDebugEnabled())
                      Tr.debug(tc, "Bean not in cache: removing file");
  
                  try
                  {
                      // Check if in bean is in the reaper list.  If so, then
                      // delete the file used when bean was passivated. Note,
                      // we do not want to remote the failover cache entry if the reason
                      // we are uninstalling is because server is shutting down.
                      // That is why we pass false to the Passivator remove method.
                      if (reaper.remove(beanId))
                      {
                          ivPassivator.remove(beanId, false); //LIDB2018-1
                      }
                  } catch (RemoteException rex)
                  {
                      // Just log the exception.  Not being able to remove the file
                      // should not be cause to fail the uninstall of the bean.
                      FFDCFilter.processException(rex, CLASS_NAME + ".atUninstall",
                                                  "598", this);
                      Tr.warning(tc, "REMOVE_FROM_PASSIVATION_STORE_FAILED_CNTR0016W"
                                 , new Object[] { beanId, rex });
                  }
              }
          }
  
          if (isTraceOn && tc.isEntryEnabled())
              Tr.exit(tc, "atUninstall");
      }