• L
    network: make virNetworkObjUpdate error detection/recovery better · f59e25e0
    Laine Stump 提交于
    1) virNetworkObjUpdate should be an all or none operation, but in the
    case that we want to update both the live state and persistent config
    versions of the network, it was committing the update to the live
    state before starting to update the persistent config. If update of
    the persistent config failed, we would leave with things in an
    inconsistent state - the live state would be updated (even though an
    error was returned), but persistent config unchanged.
    
    This patch changed virNetworkObjUpdate to use a separate pointer for
    each copy of the virNetworkDef, and not commit either of them in the
    virNetworkObj until both live and config parts of the update have
    successfully completed.
    
    2) The parsers for various pieces of the virNetworkDef have all sorts
    of subtle limitations on them that may not be known by the
    Update[section] function, making it possible for one of these
    functions to make a modification directly to the object that may not
    pass the scrutiny of a subsequent parse. But normally another parse
    wouldn't be done on the data until the *next* time the object was
    updated (which could leave the network definition in an unusable
    state).
    
    Rather than fighting the losing battle of trying to duplicate all the
    checks from the parsers into the update functions as well, the more
    foolproof solution to this is to simply do an extra
    virNetworkDefCopy() operation on the updated networkdef -
    virNetworkDefCopy() does a virNetworkFormat() followed by a
    virNetworkParseString(), so it will do all the checks we need. If this
    fails, then we don't commit the changed def.
    f59e25e0
network_conf.c 95.7 KB