code: public static void updateAllForFacade(DataStore dataStore, Iterator<Update> updateIter, Set<String> tags) {
          // Invoke dataStore.updateAll() with smallish batches so if one batch fails due to server failure, we will
          // fail over to another server using the Ostrich retry/failover infrastructure and continue from the point
          // of the failure.
          // Use time-based partitioning that adjusts batch sizes dynamically in an effort to settle on a batches that
          // take 500 milliseconds to execute.  This should make the TimeLimitedIterator used by the DataStoreClient
          // unnecessary, but the TimeLimitedIterator is still relevant for clients that don't use DataStoreStreaming.
          // For now, hard-code initial/min/max/goal values.
          Iterator<List<Update>> batchIter =
                  new TimePartitioningIterator<>(updateIter, 50, 1, 2500, Duration.ofMillis(500L));
          while (batchIter.hasNext()) {
              // Ostrich will retry each batch as necessary
              dataStore.updateAllForFacade(batchIter.next(), tags);
          }
      }
docs: Creates, updates or deletes zero or more pieces of content in the data store facades.