)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"eec78dfb0e861f97bc87f3530c7185d37eddad92","unresolved":true,"context_lines":[{"line_number":13,"context_line":"nodes outside the cluster."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"The new [libvirt] infoscale_mount_point_base option sets where those"},{"line_number":16,"context_line":"exports are mounted. Like the mount point options of the other remote"},{"line_number":17,"context_line":"file system drivers, it defaults to $state_path/mnt."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Implements: blueprint infoscale-nova-driver"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"e73a2000_acb97742","line":16,"updated":"2026-11-04 15:36:11.000000000","message":"Depends-On makes the devstack jobs install os-brick from the change, but the unit test jobs install it from upper-constraints, which pins os-brick 7.1.1 without `initiator.INFOSCALE``; all 14 failures in openstack-tox-py311 are `AttributeError: module \u0027os_brick.initiator\u0027 has no attribute \u0027INFOSCALE\u0027. This cannot go green until 986070 merges, os-brick releases, upper-constraints is bumped and `requirements.txt` here moves from `os-brick\u003e\u003d6.10.0` to that release. Worth saying so in the message so reviewers do not chase the red CI.","commit_id":"b7e6aa1818cee98d387af38795dbb95968fe29d6"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":37713,"name":"Alokedip Choudhuri","display_name":"Alokedip","email":"alokedip.choudhuri@infoscale.com","username":"alokedip_choudhuri"},"change_message_id":"880706a6f14ac97dc6a69e7012daedd3c636579c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"9a430a11_cd43f302","updated":"2026-05-01 06:45:22.000000000","message":"recheck","commit_id":"b058614c5e45793dbb39e33ba831de3d752ef1b0"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"eec78dfb0e861f97bc87f3530c7185d37eddad92","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"808c6776_2a1883ae","updated":"2026-11-04 15:36:11.000000000","message":"I reviewed the os-brick connector this driver uses (986070 PS3, +1 from me) and checked this side against it. The contract is consistent: the factory call, the written-back `device_path` and the `need_export` lock all match what the connector does now. The design question for the Nova cores is the mounting model: this driver mounts NFS exports through os-brick and never unmounts them, with no refcount across instances sharing an export, whereas every other remote-filesystem driver in Nova subclasses `LibvirtMountedFileSystemVolumeDriver` and gets refcounted mount and umount from the mount manager. Details inline, plus three small `get_config` items. The Zuul -1 is purely the os-brick release gap.","commit_id":"b7e6aa1818cee98d387af38795dbb95968fe29d6"}],"nova/conf/libvirt.py":[{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"eec78dfb0e861f97bc87f3530c7185d37eddad92","unresolved":true,"context_lines":[{"line_number":1523,"context_line":"]"},{"line_number":1524,"context_line":""},{"line_number":1525,"context_line":"libvirt_volume_infoscale_opts \u003d ["},{"line_number":1526,"context_line":"    cfg.StrOpt(\u0027infoscale_mount_point_base\u0027,"},{"line_number":1527,"context_line":"               default\u003dpaths.state_path_def(\u0027mnt\u0027),"},{"line_number":1528,"context_line":"               help\u003d\"\"\""},{"line_number":1529,"context_line":"Directory where InfoScale NFS exports are mounted on the compute node."}],"source_content_type":"text/x-python","patch_set":6,"id":"c604b51c_0e39ff7a","line":1526,"updated":"2026-11-04 15:36:11.000000000","message":"If the driver keeps mounting through os-brick, please add `infoscale_mount_options` alongside this, as `nfs_mount_options` exists for NFS: the os-brick client already reads `infoscale_mount_options` (986070 PS3 `remotefs/remotefs.py`:290-301) and builds the NFS version fallback from it, but nothing in Nova can set it. If you move to the mounted-filesystem base class, the same option feeds `_mount_options`.","commit_id":"b7e6aa1818cee98d387af38795dbb95968fe29d6"}],"nova/virt/libvirt/volume/infoscale.py":[{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"eec78dfb0e861f97bc87f3530c7185d37eddad92","unresolved":true,"context_lines":[{"line_number":43,"context_line":"        data \u003d connection_info[\u0027data\u0027]"},{"line_number":44,"context_line":"        conf.driver_cache \u003d DRIVER_CACHE"},{"line_number":45,"context_line":"        conf.driver_io \u003d DRIVER_IO"},{"line_number":46,"context_line":"        conf.source_protocol \u003d data.get(\u0027infoscale_protoname\u0027)"},{"line_number":47,"context_line":"        conf.source_path \u003d data.get(\u0027device_path\u0027, \u0027\u0027)"},{"line_number":48,"context_line":"        conf.driver_format \u003d data.get(\u0027format\u0027)"},{"line_number":49,"context_line":"        conf.source_type \u003d data.get(\u0027infoscale_voltype\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"d4a892e3_7d2764f2","line":46,"updated":"2026-11-04 15:36:11.000000000","message":"`source_protocol` is only emitted when `source_type` is `network` (`libvirt/config.py`:1341-1342); for file and block disks `format_dom` writes `\u003csource file\u003d...\u003e` or `\u003csource dev\u003d...\u003e` and ignores it. This assignment is dead and suggests libvirt knows an `infoscale` protocol, which it does not. Please drop it, and `infoscale_protoname` from the Cinder data if nothing else reads it.","commit_id":"b7e6aa1818cee98d387af38795dbb95968fe29d6"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"eec78dfb0e861f97bc87f3530c7185d37eddad92","unresolved":true,"context_lines":[{"line_number":45,"context_line":"        conf.driver_io \u003d DRIVER_IO"},{"line_number":46,"context_line":"        conf.source_protocol \u003d data.get(\u0027infoscale_protoname\u0027)"},{"line_number":47,"context_line":"        conf.source_path \u003d data.get(\u0027device_path\u0027, \u0027\u0027)"},{"line_number":48,"context_line":"        conf.driver_format \u003d data.get(\u0027format\u0027)"},{"line_number":49,"context_line":"        conf.source_type \u003d data.get(\u0027infoscale_voltype\u0027)"},{"line_number":50,"context_line":"        return conf"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5d6654ca_6c111326","line":48,"updated":"2026-11-04 15:36:11.000000000","message":"Nit: `nfs.py`:36 defaults the format to `raw` with `get(\u0027format\u0027, \u0027raw\u0027)`; without the default a connection without `format` produces a `\u003cdriver\u003e` element with no type. Please default to `raw` here too.","commit_id":"b7e6aa1818cee98d387af38795dbb95968fe29d6"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"eec78dfb0e861f97bc87f3530c7185d37eddad92","unresolved":true,"context_lines":[{"line_number":46,"context_line":"        conf.source_protocol \u003d data.get(\u0027infoscale_protoname\u0027)"},{"line_number":47,"context_line":"        conf.source_path \u003d data.get(\u0027device_path\u0027, \u0027\u0027)"},{"line_number":48,"context_line":"        conf.driver_format \u003d data.get(\u0027format\u0027)"},{"line_number":49,"context_line":"        conf.source_type \u003d data.get(\u0027infoscale_voltype\u0027)"},{"line_number":50,"context_line":"        return conf"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def _call_connector(self, method, data):"}],"source_content_type":"text/x-python","patch_set":6,"id":"f88f1500_20841dc7","line":49,"updated":"2026-11-04 15:36:11.000000000","message":"`source_type` is taken verbatim from the Cinder driver\u0027s `CinderStorageType`. Libvirt accepts only `file`, `block`, `dir`, `network` and `volume`, so please map explicitly, `\u0027block\u0027 if data.get(\u0027infoscale_voltype\u0027) \u003d\u003d \u0027block\u0027 else \u0027file\u0027`, rather than trusting the backend string. For the block case `is_block_dev\u003dFalse` at 35 is also wrong on paper; it is harmless only because this override replaces what the base class derived from it.","commit_id":"b7e6aa1818cee98d387af38795dbb95968fe29d6"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"eec78dfb0e861f97bc87f3530c7185d37eddad92","unresolved":true,"context_lines":[{"line_number":70,"context_line":"                  instance\u003dinstance)"},{"line_number":71,"context_line":"        data[\u0027device_path\u0027] \u003d device_info[\u0027path\u0027]"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def disconnect_volume(self, connection_info, instance, force\u003dFalse):"},{"line_number":74,"context_line":"        \"\"\"Disconnect the volume.\"\"\""},{"line_number":75,"context_line":"        self.connector.disconnect_volume("},{"line_number":76,"context_line":"            connection_info[\u0027data\u0027], None, force\u003dforce)"}],"source_content_type":"text/x-python","patch_set":6,"id":"22072a01_b39a278e","line":73,"updated":"2026-11-04 15:36:11.000000000","message":"`disconnect_volume` only calls the connector\u0027s `disconnect_volume`, which for `RemoteFsConnector` subclasses is a no-op (os-brick `connectors/remotefs.py`:115-128), so an NFS export mounted for an instance stays mounted on the compute host for ever, and nothing tracks how many instances share it. Nova\u0027s NFS, Quobyte, SMBFS and VZStorage drivers do not mount through os-brick for this reason: they subclass `LibvirtMountedFileSystemVolumeDriver` (`volume/fs.py`:96-124), whose `connect_volume` and `disconnect_volume` go through `mount.mount()` and `mount.umount()` with per-mountpoint refcounting in `_HostMountStateManager` (`volume/mount.py`:33, :262, :339), including `host_up` recovery after a restart. Please consider that shape here: `fstype nfs`, `_get_mount_point_base` returning `CONF.libvirt.infoscale_mount_point_base`, `_mount_options` from a new `infoscale_mount_options`, and a short-circuit to `data[\u0027device_path\u0027]` when `need_export` is false. That also removes the ad-hoc per-export lock at 52-62, which the mount manager already provides, and leaves os-brick needed only for `extend_volume`, or not at all if you size the file as `nfs.py`:52-56 does.","commit_id":"b7e6aa1818cee98d387af38795dbb95968fe29d6"}]}
