docs: public void updateSession(BackedSession backedSess) {
          if (com.ibm.websphere.ras.TraceComponent.isAnyTracingEnabled() && LoggingUtil.SESSION_LOGGER_WAS.isLoggable(Level.FINE)) {
              LoggingUtil.SESSION_LOGGER_WAS.entering(methodClassName, methodNames[UPDATE_SESSION]);
          }
  
          if (!backedSess.isValid()) {
              if (com.ibm.websphere.ras.TraceComponent.isAnyTracingEnabled() && LoggingUtil.SESSION_LOGGER_WAS.isLoggable(Level.FINE)) {
                  LoggingUtil.SESSION_LOGGER_WAS.logp(Level.FINE, methodClassName, methodNames[UPDATE_SESSION], "session " + backedSess.getId()
                                                                                                                + " has been invalidated since last access, clean up and return ");
              }
  
              if (backedSess.appDataChanges != null)
                  backedSess.appDataChanges.clear();
              if (backedSess.appDataRemovals != null)
                  backedSess.appDataRemovals.clear();
              return;
          }
  
          if (cachedLastAccessedTimes != null) { // manual write or time based writes
              if (backedSess.cacheLastAccessedTime) {
                  cachedLastAccessedTimes.put(backedSess.getId(), new Long(backedSess.getCurrentAccessTime()));
                  return; // only cache last access time to be written prior to inval thread
              } else {
                  cachedLastAccessedTimes.remove(backedSess.getId());
              }
          }
  
          if (com.ibm.websphere.ras.TraceComponent.isAnyTracingEnabled() && LoggingUtil.SESSION_LOGGER_WAS.isLoggable(Level.FINE)) {
              LoggingUtil.SESSION_LOGGER_WAS.logp(Level.FINE, methodClassName, methodNames[UPDATE_SESSION], "Do the write!");
          }
  
          boolean propHit = false;
  
          if (_smc.writeAllProperties()) {
              propHit = true;
          }
  
          if (!propHit && backedSess.appDataChanges != null) {
              propHit = !backedSess.appDataChanges.isEmpty();
          }
  
          if (!propHit && backedSess.appDataRemovals != null) {
              propHit = !backedSess.appDataRemovals.isEmpty();
          }
  
          if (com.ibm.websphere.ras.TraceComponent.isAnyTracingEnabled() && LoggingUtil.SESSION_LOGGER_WAS.isLoggable(Level.FINE)) {
              LoggingUtil.SESSION_LOGGER_WAS.logp(Level.FINE, methodClassName, methodNames[UPDATE_SESSION], "propHit is: " + propHit);
              if (propHit) {
                  String changes = (backedSess.appDataChanges == null ? "null" : backedSess.appDataChanges.keySet().toString());
                  String removals = (backedSess.appDataRemovals == null ? "null" : backedSess.appDataRemovals.keySet().toString());
                  LoggingUtil.SESSION_LOGGER_WAS.logp(Level.FINE, methodClassName, methodNames[UPDATE_SESSION], "prop hit " + propHit + " app changes " + changes + " app removals "
                                                                                                                + removals);
              }
          }
  
          boolean writeSucc = persistSession(backedSess, propHit);
  
          backedSess.update = null;
          if (writeSucc) {
  
              backedSess.userWriteHit = false;
              backedSess.maxInactWriteHit = false;
              backedSess.listenCntHit = false;
              // PK32205: Clear appDataChanges and appDataRemovals only if it
              // is not a MR configuration. In MR configuration these are
              // appropriately cleared in handlePropertyHits
              if (!_smc.isUsingMultirow()) {
                  if (backedSess.appDataChanges != null)
                      backedSess.appDataChanges.clear();
                  if (backedSess.appDataRemovals != null)
                      backedSess.appDataRemovals.clear();
              }
          }
      }