docs: public static void disposeSavepoint(
  			String pointer,
  			StateBackend stateBackend,
  			ClassLoader classLoader) throws IOException, FlinkException {
  
  		checkNotNull(pointer, "location");
  		checkNotNull(stateBackend, "stateBackend");
  		checkNotNull(classLoader, "classLoader");
  
  		final CompletedCheckpointStorageLocation checkpointLocation = stateBackend.resolveCheckpoint(pointer);
  
  		final StreamStateHandle metadataHandle = checkpointLocation.getMetadataHandle();
  
  		// load the savepoint object (the metadata) to have all the state handles that we need
  		// to dispose of all state
  		final Savepoint savepoint;
  		try (InputStream in = metadataHandle.openInputStream();
  			DataInputStream dis = new DataInputStream(in)) {
  
  			savepoint = loadCheckpointMetadata(dis, classLoader);
  		}
  
  		Exception exception = null;
  
  		// first dispose the savepoint metadata, so that the savepoint is not
  		// addressable any more even if the following disposal fails
  		try {
  			metadataHandle.discardState();
  		}
  		catch (Exception e) {
  			exception = e;
  		}
  
  		// now dispose the savepoint data
  		try {
  			savepoint.dispose();
  		}
  		catch (Exception e) {
  			exception = ExceptionUtils.firstOrSuppressed(e, exception);
  		}
  
  		// now dispose the location (directory, table, whatever)
  		try {
  			checkpointLocation.disposeStorageLocation();
  		}
  		catch (Exception e) {
  			exception = ExceptionUtils.firstOrSuppressed(e, exception);
  		}
  
  		// forward exceptions caught in the process
  		if (exception != null) {
  			ExceptionUtils.rethrowIOException(exception);
  		}
  	}