diff --git a/lib/cmdlib.py b/lib/cmdlib.py index 40dca63f54817c0140816760b9cef1bab7264afd..a3d9fc9d82681c82ec0a8a99aa02a7717876e900 100644 --- a/lib/cmdlib.py +++ b/lib/cmdlib.py @@ -8002,6 +8002,11 @@ def _RemoveDisks(lu, instance, target_node=None): " continuing anyway: %s", device.iv_name, node, msg) all_result = False + # if this is a DRBD disk, return its port to the pool + if device.dev_type in constants.LDS_DRBD: + tcp_port = device.logical_id[2] + lu.cfg.AddTcpUdpPort(tcp_port) + if instance.disk_template == constants.DT_FILE: file_storage_dir = os.path.dirname(instance.disks[0].logical_id[1]) if target_node: @@ -11161,6 +11166,11 @@ class LUInstanceSetParams(LogicalUnit): self.LogWarning("Could not remove metadata for disk %d on node %s," " continuing anyway: %s", idx, pnode, msg) + # this is a DRBD disk, return its port to the pool + for disk in old_disks: + tcp_port = disk.logical_id[2] + self.cfg.AddTcpUdpPort(tcp_port) + def Exec(self, feedback_fn): """Modifies an instance. @@ -11187,6 +11197,11 @@ class LUInstanceSetParams(LogicalUnit): self.LogWarning("Could not remove disk/%d on node %s: %s," " continuing anyway", device_idx, node, msg) result.append(("disk/%d" % device_idx, "remove")) + + # if this is a DRBD disk, return its port to the pool + if device.dev_type in constants.LDS_DRBD: + tcp_port = device.logical_id[2] + self.cfg.AddTcpUdpPort(tcp_port) elif disk_op == constants.DDM_ADD: # add a new disk if instance.disk_template in (constants.DT_FILE, diff --git a/lib/config.py b/lib/config.py index fdd77c0d918dcf43ae3628c1326376b5380d5742..7a8faa19a36cb9bb5caa79b6e3ebcacb3882a089 100644 --- a/lib/config.py +++ b/lib/config.py @@ -1158,6 +1158,14 @@ class ConfigWriter: """ if instance_name not in self._config_data.instances: raise errors.ConfigurationError("Unknown instance '%s'" % instance_name) + + # If a network port has been allocated to the instance, + # return it to the pool of free ports. + inst = self._config_data.instances[instance_name] + network_port = getattr(inst, "network_port", None) + if network_port is not None: + self._config_data.cluster.tcpudp_port_pool.add(network_port) + del self._config_data.instances[instance_name] self._config_data.cluster.serial_no += 1 self._WriteConfig()