docs: def _IterateAllClients(recency_window=None):
    """Fetches client data from the relational db.
  
    Args:
      recency_window: An rdfvalue.Duration specifying a window of last-ping
        timestamps to consider. Clients that haven't communicated with GRR servers
        longer than the given period will be skipped. If recency_window is None,
        all clients will be iterated.
  
    Yields:
      Batches (lists) of ClientFullInfo objects.
    """
    if recency_window is None:
      min_last_ping = None
    else:
      min_last_ping = rdfvalue.RDFDatetime.Now() - recency_window
    client_ids = data_store.REL_DB.ReadAllClientIDs(min_last_ping=min_last_ping)
    for client_id_batch in collection.Batch(client_ids, CLIENT_READ_BATCH_SIZE):
      client_info_dict = data_store.REL_DB.MultiReadClientFullInfo(
          client_id_batch)
      yield list(itervalues(client_info_dict))