code: def _allocate_segment(self, session, net_id, source):
          
  
          with session.begin(subtransactions=True):
              hour_lapse = utils.utc_time_lapse(self.seg_timeout)
              count = (session.query(self.model).filter(
                  self.model.delete_time < hour_lapse).update(
                  {"delete_time": None}))
  
              select = (session.query(self.model).filter_by(allocated=False,
                                                            delete_time=None))
  
              # Selected segment can be allocated before update by someone else,
              # We retry until update success or DB_MAX_RETRIES retries
              for attempt in range(DB_MAX_RETRIES + 1):
                  alloc = select.first()
                  if not alloc:
                      LOG.info("No segment resource available")
                      # No resource available
                      return
  
                  count = (session.query(self.model).
                           filter_by(segmentation_id=alloc.segmentation_id,
                           allocated=False).update({"allocated": True,
                                                    "network_id": net_id,
                                                    "source": source}))
                  if count:
                      return alloc
  
          LOG.error("ERROR: Failed to allocate segment for net %(net)s"
                    " source %(src)s",
                    {'net': net_id, 'src': source})
docs: Allocate segment from pool.
  
          Return allocated db object or None.