docs: private void processUserSnapshotRequestEvent(final WatchedEvent event) throws Exception {
          if (event.getType() == EventType.NodeCreated) {
              byte data[] = m_zk.getData(event.getPath(), false, null);
              String jsonString = new String(data, "UTF-8");
              final JSONObject jsObj = new JSONObject(jsonString);
              final String requestId = jsObj.getString("requestId");
              final boolean blocking = jsObj.getBoolean(SnapshotUtil.JSON_BLOCK);
              /*
               * Going to reuse the request object, remove the requestId
               * field now that it is consumed
               */
              jsObj.remove("requestId");
              jsObj.put("perPartitionTxnIds", retrievePerPartitionTransactionIds());
              String nonce = jsObj.getString(SnapshotUtil.JSON_NONCE);
              final long handle = m_nextCallbackHandle++;
              m_procedureCallbacks.put(handle, new ProcedureCallback() {
  
                  @Override
                  public void clientCallback(ClientResponse clientResponse) {
                      m_lastInitiationTs = null;
                      try {
                          /*
                           * If there is an error then we are done.
                           */
                          if (clientResponse.getStatus() != ClientResponse.SUCCESS) {
                              ClientResponseImpl rimpl = (ClientResponseImpl)clientResponse;
                              saveResponseToZKAndReset(requestId, rimpl);
                              return;
                          }
  
                          /*
                           * Now analyze the response. If a snapshot was in progress
                           * we have to reattempt it later, and send a response to the client
                           * saying it was queued. Otherwise, forward the response
                           * failure/success to the client.
                           */
                          if (isSnapshotInProgressResponse(clientResponse)) {
                              loggingLog.info("Deferring user snapshot with nonce " + nonce + " until after in-progress snapshot completes");
                              scheduleSnapshotForLater(jsObj.toString(4), requestId, true);
                          } else {
                              ClientResponseImpl rimpl = (ClientResponseImpl)clientResponse;
                              saveResponseToZKAndReset(requestId, rimpl);
                              return;
                          }
                      } catch (Exception e) {
                          SNAP_LOG.error("Error processing user snapshot request", e);
                          try {
                              userSnapshotRequestExistenceCheck(true);
                          } catch (Exception e2) {
                              VoltDB.crashLocalVoltDB("Error resetting watch for user snapshots", true, e2);
                          }
                      }
                  }
              });
              loggingLog.info("Initiating user snapshot with nonce " + nonce);
              initiateSnapshotSave(handle, new Object[]{jsObj.toString(4)}, blocking);
              return;
          }
      }