docs: public HashSet<Exception> completeSnapshotWork(SystemProcedureExecutionContext context)
          throws InterruptedException {
          HashSet<Exception> retval = new HashSet<Exception>();
          //Set to 10 gigabytes/sec, basically unlimited
          //Does nothing if rate limiting is not enabled
          DefaultSnapshotDataTarget.setRate(1024 * 10);
          try {
              while (m_snapshotTableTasks != null) {
                  Future<?> result = doSnapshotWork(context, true);
                  if (result != null) {
                      try {
                          result.get();
                      } catch (ExecutionException e) {
                          final boolean added = retval.add((Exception)e.getCause());
                          assert(added);
                      } catch (Exception e) {
                          final boolean added = retval.add((Exception)e.getCause());
                          assert(added);
                      }
                  }
              }
          } finally {
              //Request default rate again
              DefaultSnapshotDataTarget.setRate(null);
          }
  
          /**
           * Block until the sync has actually occurred in the forked threads.
           * The threads are spawned even in the blocking case to keep it simple.
           */
          if (m_snapshotTargetTerminators != null) {
              for (final Thread t : m_snapshotTargetTerminators) {
                  t.join();
              }
              m_snapshotTargetTerminators = null;
          }
  
          return retval;
      }