Revision 40a815f8 snf-cyclades-app/synnefo/logic/backend.py

b/snf-cyclades-app/synnefo/logic/backend.py
243 243
    db_nics = dict([(nic.id, nic)
244 244
                    for nic in vm.nics.prefetch_related("ips__subnet")])
245 245

  
246
    # Get X-Lock on backend before getting X-Lock on network IP pools, to
247
    # guarantee that no deadlock will occur with Backend allocator.
248
    Backend.objects.select_for_update().get(id=vm.backend_id)
249

  
250 246
    for nic_name in set(db_nics.keys()) | set(ganeti_nics.keys()):
251 247
        db_nic = db_nics.get(nic_name)
252 248
        ganeti_nic = ganeti_nics.get(nic_name)
......
813 809
    and the IDs of the Ganeti job to create the network.
814 810

  
815 811
    """
816
    network = Network.objects.select_for_update().get(id=network_id)
817
    bnet, created = BackendNetwork.objects.get_or_create(backend=backend,
818
                                                         network=network)
819 812
    job_ids = []
820
    if bnet.operstate != "ACTIVE":
813
    try:
814
        bnet = BackendNetwork.objects.select_related("network")\
815
                                     .get(backend=backend, network=network_id)
816
        if bnet.operstate != "ACTIVE":
817
            job_ids = create_network(bnet.network, backend, connect=True)
818
    except BackendNetwork.DoesNotExist:
819
        network = Network.objects.select_for_update().get(id=network_id)
820
        bnet = BackendNetwork.objects.create(backend=backend, network=network)
821 821
        job_ids = create_network(network, backend, connect=True)
822 822

  
823 823
    return bnet, job_ids

Also available in: Unified diff