code: def download_intersection(self, max_try=100, retry=3):
      for i in range(max_try):
          intersection = self.stub.downloadIntersection(
              DownloadIntersectionRequest()
          ).intersection
          if intersection is not None and len(intersection) != 0:
              hashed_intersection = list(intersection)
              logging.info(
                  f"Intersection completed, size {len(intersection)}"
              )
              intersection = [
                  self.hashed_ids_to_ids[i] for i in hashed_intersection
              ]
              return intersection
          else:
              logging.info(
                  f"Got empty intersection, will retry in {retry} s... {i}/{max_try}"
              )
              time.sleep(retry)
      invalidOperationError(
          False,
          "Max retry reached, could not get intersection, exiting.",
      )
  
file_path: BigDL/python/ppml/src/bigdl/ppml/fl/psi/psi_client.py
imports: import logging
  import time
  from bigdl.dllib.utils.log4Error import invalidOperationError
  from bigdl.ppml.fl.psi.utils import to_hex_string
  from ..nn.fl_client import FLClient
  from bigdl.ppml.fl.nn.generated.psi_service_pb2_grpc import *
  from ..nn.generated.psi_service_pb2 import DownloadIntersectionRequest, SaltRequest, UploadSetRequest
label_desc: Use image node_id 4 for calling the PSI obj's underlying member method code with example usage: obj.download_intersection(max_try, retry) and returns: intersection