feat(linstor-manager): add support for custom drbd sync options#117
Draft
klmp200 wants to merge 95 commits into3.2.12-8.3from
Draft
feat(linstor-manager): add support for custom drbd sync options#117klmp200 wants to merge 95 commits into3.2.12-8.3from
klmp200 wants to merge 95 commits into3.2.12-8.3from
Conversation
This was a patch added to the sm RPM git repo before we had this forked git repo for sm in the xcp-ng github organisation.
Originally-by: Ronan Abhamon <ronan.abhamon@vates.fr> This version obtained through merge in ff1bf65: git restore -SW -s ydi/forks/2.30.7/xfs drivers/EXTSR.py mv drivers/EXTSR.py drivers/XFSSR.py git restore -SW drivers/EXTSR.py Signed-off-by: Yann Dirson <yann.dirson@vates.fr>
Some important points: - linstor.KV must use an identifier name that starts with a letter (so it uses a "sr-" prefix). - Encrypted VDI are supported with key_hash attribute (not tested, experimental). - When a new LINSTOR volume is created on a host (via snapshot or create), the remaining diskless devices are not necessarily created on other hosts. So if a resource definition exists without local device path, we ask it to LINSTOR. Wait 5s for symlink creation when a new volume is created => 5s is is purely arbitrary, but this guarantees that we do not try to access the volume if the symlink has not yet been created by the udev rule. - Can change the provisioning using the device config 'provisioning' param. - We can only increase volume size (See: LINBIT/linstor-server#66), it would be great if we could shrink volumes to limit the space used by the snapshots. - Inflate/Deflate can only be executed on the master host, a linstor-manager plugin is present to do this from slaves. The same plugin is used to open LINSTOR ports + start controller. - Use a `total_allocated_volume_size` method to have a good idea of the reserved memory Why? Because `physical_free_size` is computed using the LVM used size, in the case of thick provisioning it's ok, but when thin provisioning is choosen LVM returns only the allocated size using the used block count. So this method solves this problem, it takes the fixed virtual volume size of each node to compute the required size to store the volume data. - Call vhd-util on remote hosts using the linstor-manager when necessary, i.e. vhd-util is called to get vhd info, the DRBD device can be in use (and unusable by external processes), so we must use the local LVM device that contains the DRBD data or a remote disk if the DRBD device is diskless. - If a DRBD device is in use when vhdutil.getVHDInfo is called, we must have no errors. So a LinstorVhdUtil wrapper is now used to bypass DRBD layer when VDIs are loaded. - Refresh PhyLink when unpause in called on DRBD devices: We must always recreate the symlink to ensure we have the right info. Why? Because if the volume UUID is changed in LINSTOR the symlink is not directly updated. When live leaf coalesce is executed we have these steps: "A" -> "OLD_A" "B" -> "A" Without symlink update the previous "A" path is reused instead of "B" path. Note: "A", "B" and "OLD_A" are UUIDs. - Since linstor python modules are not present on every XCP-ng host, module imports are protected by try.. except... blocks. - Provide a linstor-monitor daemon to check master changes
- Check if "create" doesn't succeed without zfs packages - Check if "scan" failed if the path is not mounted (not a ZFS mountpoint)
Co-authored-by: Piotr Robert Konopelko <piotr.konopelko@moosefs.pro> Signed-off-by: Aleksander Wieliczko <aleksander.wieliczko@moosefs.pro> Signed-off-by: Ronan Abhamon <ronan.abhamon@vates.fr>
`umount` should not be called when `legacy_mode` is enabled, otherwise a mounted dir used during SR creation is unmounted at the end of the `create` call (and also when a PBD is unplugged) in `detach` block. Signed-off-by: Ronan Abhamon <ronan.abhamon@vates.fr>
A sm-config boolean param `subdir` is available to configure where to store the VHDs: - In a subdir with the SR UUID, the new behavior - In the root directory of the MooseFS SR By default, new SRs are created with `subdir` = True. Existing SRs are not modified and continue to use the folder that was given at SR creation, directly, without looking for a subdirectory. Signed-off-by: Ronan Abhamon <ronan.abhamon@vates.fr>
Ensure all shared drivers are imported in `_is_open` definition to register them in the driver list. Otherwise this function always fails with a SRUnknownType exception. Also, we must add two fake mandatory parameters to make MooseFS happy: `masterhost` and `rootpath`. Same for CephFS with: `serverpath`. (NFS driver is directly patched to ensure there is no usage of the `serverpath` param because its value is equal to None.) `location` param is required to use ZFS, to be more precise, in the parent class: `FileSR`. Signed-off-by: Ronan Abhamon <ronan.abhamon@vates.fr>
SR_CACHING offers the capacity to use IntelliCache, but this feature is only available using NFS SR. For more details, the implementation of `_setup_cache` in blktap2.py uses only an instance of NFSFileVDI for the shared target. Signed-off-by: Ronan Abhamon <ronan.abhamon@vates.fr>
Signed-off-by: Ronan Abhamon <ronan.abhamon@vates.fr>
* `except` syntax fixes * drop `has_key()` usage * drop `filter()` usage (but drop their silly `list(x.keys())` wrappings) * drop `map()` usage * use `int` not `long` * use `items()` not `iteritems()` Signed-off-by: Yann Dirson <yann.dirson@vates.fr>
…store Signed-off-by: Yann Dirson <yann.dirson@vates.fr>
Guided by futurize's "old_div" use Signed-off-by: Yann Dirson <yann.dirson@vates.fr>
PROBE_MOUNTPOINT in a some drivers is a relative path, which is resolved
using MOUNT_BASE at probe time, but CephFS, GlusterFS and MooseFS it is
set on driver load to an absolute path, and this requires MOUNT_BASE to be
looking like a path component.
```
drivers/CephFSSR.py:69: in <module>
PROBE_MOUNTPOINT = os.path.join(SR.MOUNT_BASE, "probe")
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
a = <MagicMock name='mock.MOUNT_BASE' id='140396863897728'>, p = ('probe',)
def join(a, *p):
"""Join two or more pathname components, inserting '/' as needed.
If any component is an absolute path, all previous path components
will be discarded. An empty last part will result in a path that
ends with a separator."""
> a = os.fspath(a)
E TypeError: expected str, bytes or os.PathLike object, not MagicMock
/usr/lib64/python3.6/posixpath.py:80: TypeError
```
Note this same idiom is also used in upstream SMBFS, although that does not
appear to cause any problem with the tests.
Signed-off-by: Yann Dirson <yann.dirson@vates.fr>
(coverage 7.2.5) Without these changes many warns/errors are emitted: - "assertEquals" is deprecated, "assertEqual" must be used instead - mocked objects in "setUp" method like "cleanup.IPCFlag" cannot be repatched at the level of the test functions, otherwise tests are aborted, this is the behavior of coverage version 7.2.5 Signed-off-by: Ronan Abhamon <ronan.abhamon@vates.fr>
Signed-off-by: Ronan Abhamon <ronan.abhamon@vates.fr>
Signed-off-by: Ronan Abhamon <ronan.abhamon@vates.fr>
Impacted drivers: LINSTOR, MooseFS and ZFS. - Ignore all linstor.* members during coverage, the module is not installed in github runner. - Use mock from unittest, the old one is not found now. - Remove useless return from LinstorSR scan method. Signed-off-by: Ronan Abhamon <ronan.abhamon@vates.fr>
Signed-off-by: BenjiReis <benjamin.reis@vates.fr>
A SR inheriting from a EXTSR allowing to use a 4KiB blocksize device as SR. Create a 512 bytes loop device on top of a 4KiB device then give it to EXTSR code. It uses the same device-config as a normal local SR, i.e. `device-config:device=/dev/nvme0n1` After creation, the driver find the device under the VG to identify the correct disk. It means that creating the SR with a non-stable disk identifier is doable and it will work as EXTSR would by ignoring the device-config after creation. Identifying the correct disk by using LVM infos. The VG is created using a different prefix name from EXTSR. It is `XSLocalLargeBlock-<SR UUID>`. The SR artificially limits the creation to disk not being 512b. It will throw an error if a disk whose blocksize is 512 is given. We currently don't support multi devices, it fails at the EXTSR creation. We added an error to explicitly say that multi devices SR is not supported on the driver. Before that, it would make another error: ``` Error code: SR_BACKEND_FAILURE_77 Error parameters: , Logical Volume group creation failed, ``` Sometimes the pvremove from EXTSR using the loop device fails. In this case, we need to remove the real device from PV list ourself in the error handling. Signed-off-by: Damien Thenot <damien.thenot@vates.tech>
With this change the driver supports a "lvm-conf" param on "other-config". For now The configuration is only used by "remove" calls from LVMCache. Example to issue discards after a lvremove command: > xe sr-param-set uuid=<SR_UUID> other-config:lvm-conf=issue_discards=1 And to remove the param: > xe sr-param-remove uuid=<SR_UUID> param-name=other-config param-key=lvm-conf Signed-off-by: Ronan Abhamon <ronan.abhamon@vates.fr>
Signed-off-by: Benjamin Reis <benjamin.reis@vates.tech>
…#73) Signed-off-by: Ronan Abhamon <ronan.abhamon@vates.fr>
Signed-off-by: Ronan Abhamon <ronan.abhamon@vates.tech>
Upstream patch of ae10349 is incorrect. All "@mock.patch('blktap2.VDI.PhyLink', autospec=True)" lines must be removed because PhyLink is mocked globally. Signed-off-by: Ronan Abhamon <ronan.abhamon@vates.tech>
- Use specific DRBD options to detect failures in a small delay. - Use these options to control quorum with drbd-reactor. - Provide a better compromise in terms of availability. Signed-off-by: Ronan Abhamon <ronan.abhamon@vates.tech>
Impacted functions: `_get_volumes_info` and `_get_volume_node_names_and_size`. Before this change "usable_size" validity was checked too early and which could lead to an exception for no good reason while the size could be known on at least one host despite an issue on other machines. Signed-off-by: Ronan Abhamon <ronan.abhamon@vates.tech>
Signed-off-by: Ronan Abhamon <ronan.abhamon@vates.tech>
Signed-off-by: Ronan Abhamon <ronan.abhamon@vates.tech>
…ll context Signed-off-by: Ronan Abhamon <ronan.abhamon@vates.tech>
Signed-off-by: Ronan Abhamon <ronan.abhamon@vates.tech>
…mutators Signed-off-by: Ronan Abhamon <ronan.abhamon@vates.tech>
Session attr is not set during "attach/detach calls from config". In this context local method must always be called. Signed-off-by: Ronan Abhamon <ronan.abhamon@vates.tech>
Signed-off-by: Ronan Abhamon <ronan.abhamon@vates.tech>
A change in lvm2 `https://github.com/xcp-ng-rpms/lvm2/pull/3/files` introduces an issue in LargeBlockSR: `/dev/` is not scanned now meaning the loop device is never used for VG activation. So we must add a custom scan parameter to LVM commands. We also now systematically do the call to _redo_vg_connection to use our custom parameters to enable the LV on the correct device before calling `EXTSR.attach()`. Signed-off-by: Damien Thenot <damien.thenot@vates.tech>
This is not done on every and each implementation of SR but only on ones that calls cleanup.start_gc_service (like FileSR) and on the classes that inherits from them and don't call super on detach. This is to prevent useless errors logs like Failed to stop xxx.service: Unit xxx.service not loaded. Signed-off-by: Mathieu Labourier <mathieu.labourier@vates.tech>
When the pool master is changed and if it doesn't have a local DB path then `get_database_path` fails during SR.scan call. This patch allows creating a diskless path if necessary. Signed-off-by: Ronan Abhamon <ronan.abhamon@vates.tech>
…104) In `_request_device_path`: Before this change, an exception was thrown when a resource was missing, but not when the returned path was empty. Now it's raised in both cases. Signed-off-by: Ronan Abhamon <ronan.abhamon@vates.tech>
Add a way in `linstorvolumemanager` to verify that all nodes are using the same LINSTOR version at init. Raise an error early if this happens so that SR ops are properly disabled with clear feedback to the user. Signed-off-by: Antoine Bartuccio <antoine.bartuccio@vates.tech>
Avoid python version mismatch that pulls incompatible dependencies in github actions when running unittests. Signed-off-by: Antoine Bartuccio <antoine.bartuccio@vates.tech>
During the construction of the volume set in `LinstorVolumeManager`,
a resource might not be properly deleted following a previous operation, such as a snapshot.
In this case, it's renamed with the prefix `DELETED_`. Unfortunately, this part fails
at the end of the renaming process because it attempts to delete the original volume name
from the set, which is not present because the list is being initialized at that point.
Without this fix, we have this trace:
```
Nov 26 08:20:30 xcp-node-1 SM: [1045423] Cannot clean volume 389e891c-2150-4caa-b201-073dedb8b886: Could not destroy resource `xcp-volume-9ef5f4a1-f101-4f34-8029-f2ad698decdd` from SR `xcp-sr-linstor_group_thin_device`: (Node: 'xcp-nodo
-1') Failed to delete lvm volume
Nov 26 08:20:30 xcp-node-1 SM: [1045423] Trying to update volume UUID 389e891c-2150-4caa-b201-073dedb8b886 to DELETED_389e891c-2150-4caa-b201-073dedb8b886...
Nov 26 08:20:30 xcp-node-1 SM: [1045423] Raising exception [47, The SR is not available [opterr='389e891c-2150-4caa-b201-073dedb8b886']]
Nov 26 08:20:30 xcp-node-1 SM: [1045423] lock: released /var/lock/sm/33dcb0ef-e089-4b6b-ab79-3d337045528e/sr
Nov 26 08:20:30 xcp-node-1 SM: [1045423] ***** generic exception: vdi_snapshot: EXCEPTION <class 'xs_errors.SROSError'>, The SR is not available [opterr='389e891c-2150-4caa-b201-073dedb8b886']
Nov 26 08:20:30 xcp-node-1 SM: [1045423] File "/opt/xensource/sm/SRCommand.py", line 113, in run
Nov 26 08:20:30 xcp-node-1 SM: [1045423] return self._run_locked(sr)
Nov 26 08:20:30 xcp-node-1 SM: [1045423] File "/opt/xensource/sm/SRCommand.py", line 157, in _run_locked
Nov 26 08:20:30 xcp-node-1 SM: [1045423] target = sr.vdi(self.vdi_uuid)
Nov 26 08:20:30 xcp-node-1 SM: [1045423] File "/opt/xensource/sm/LinstorSR", line 537, in wrap
Nov 26 08:20:30 xcp-node-1 SM: [1045423] return load(self, *args, **kwargs)
Nov 26 08:20:30 xcp-node-1 SM: [1045423] File "/opt/xensource/sm/LinstorSR", line 463, in load
Nov 26 08:20:30 xcp-node-1 SM: [1045423] raise xs_errors.XenError('SRUnavailable', opterr=str(e))
Nov 26 08:20:30 xcp-node-1 SM: [1045423]
Nov 26 08:20:30 xcp-node-1 SM: [1045423] ***** LINSTOR resources on XCP-ng: EXCEPTION <class 'xs_errors.SROSError'>, The SR is not available [opterr='389e891c-2150-4caa-b201-073dedb8b886']
Nov 26 08:20:30 xcp-node-1 SM: [1045423] File "/opt/xensource/sm/SRCommand.py", line 392, in run
Nov 26 08:20:30 xcp-node-1 SM: [1045423] ret = cmd.run(sr)
Nov 26 08:20:30 xcp-node-1 SM: [1045423] File "/opt/xensource/sm/SRCommand.py", line 113, in run
Nov 26 08:20:30 xcp-node-1 SM: [1045423] return self._run_locked(sr)
Nov 26 08:20:30 xcp-node-1 SM: [1045423] File "/opt/xensource/sm/SRCommand.py", line 157, in _run_locked
Nov 26 08:20:30 xcp-node-1 SM: [1045423] target = sr.vdi(self.vdi_uuid)
Nov 26 08:20:30 xcp-node-1 SM: [1045423] File "/opt/xensource/sm/LinstorSR", line 537, in wrap
Nov 26 08:20:30 xcp-node-1 SM: [1045423] return load(self, *args, **kwargs)
Nov 26 08:20:30 xcp-node-1 SM: [1045423] File "/opt/xensource/sm/LinstorSR", line 463, in load
Nov 26 08:20:30 xcp-node-1 SM: [1045423] raise xs_errors.XenError('SRUnavailable', opterr=str(e))
Nov 26 08:20:30 xcp-node-1 SM: [1045423]
```
Signed-off-by: Ronan Abhamon <ronan.abhamon@vates.tech>
In the case of a DRBD resource deletion issue via the LINSTOR API,
a wrong exception was thrown in the `VDI.delete` code instead of
simply logging and properly terminating the command.
Trace before correction:
```
Nov 26 08:19:58 xcp-node-1 SM: [1055074] Failed to remove the volume (maybe is leaf coalescing) for 389e891c-2150-4caa-b201-073dedb8b886 err: Cannot destroy volume `389e891c-2150-4caa-b201-073dedb8b886`: Could not destroy resource `xcp-
volume-9ef5f4a1-f101-4f34-8029-f2ad698decdd` from SR `xcp-sr-linstor_group_thin_device`: (Node: 'xcp-nodo-1') Failed to delete lvm volume
Nov 26 08:19:58 xcp-node-1 SM: [1055074] Raising exception [80, Failed to mark VDI hidden [opterr=Cannot destroy volume `389e891c-2150-4caa-b201-073dedb8b886`: Could not destroy resource `xcp-volume-9ef5f4a1-f101-4f34-8029-f2ad698decdd`
from SR `xcp-sr-linstor_group_thin_device`: (Node: 'xcp-nodo-1') Failed to delete lvm volume]]
Nov 26 08:19:58 xcp-node-1 SM: [1055074] lock: released /var/lock/sm/33dcb0ef-e089-4b6b-ab79-3d337045528e/sr
Nov 26 08:19:58 xcp-node-1 SM: [1150284] lock: acquired /var/lock/sm/33dcb0ef-e089-4b6b-ab79-3d337045528e/sr
Nov 26 08:19:58 xcp-node-1 SM: [1055074] ***** generic exception: vdi_delete: EXCEPTION <class 'xs_errors.SROSError'>, Failed to mark VDI hidden [opterr=Cannot destroy volume `389e891c-2150-4caa-b201-073dedb8b886`: Could not destroy res
ource `xcp-volume-9ef5f4a1-f101-4f34-8029-f2ad698decdd` from SR `xcp-sr-linstor_group_thin_device`: (Node: 'xcp-nodo-1') Failed to delete lvm volume]
Nov 26 08:19:58 xcp-node-1 SM: [1055074] File "/opt/xensource/sm/SRCommand.py", line 113, in run
Nov 26 08:19:58 xcp-node-1 SM: [1055074] return self._run_locked(sr)
Nov 26 08:19:58 xcp-node-1 SM: [1055074] File "/opt/xensource/sm/SRCommand.py", line 163, in _run_locked
Nov 26 08:19:58 xcp-node-1 SM: [1055074] rv = self._run(sr, target)
Nov 26 08:19:58 xcp-node-1 SM: [1055074] File "/opt/xensource/sm/SRCommand.py", line 254, in _run
Nov 26 08:19:58 xcp-node-1 SM: [1055074] return target.delete(self.params['sr_uuid'], self.vdi_uuid)
Nov 26 08:19:58 xcp-node-1 SM: [1055074] File "/opt/xensource/sm/LinstorSR", line 1775, in delete
Nov 26 08:19:58 xcp-node-1 SM: [1055074] raise xs_errors.XenError('VDIDelete', opterr=str(e))
Nov 26 08:19:58 xcp-node-1 SM: [1055074]
Nov 26 08:19:58 xcp-node-1 SM: [1055074] ***** LINSTOR resources on XCP-ng: EXCEPTION <class 'xs_errors.SROSError'>, Failed to mark VDI hidden [opterr=Cannot destroy volume `389e891c-2150-4caa-b201-073dedb8b886`: Could not destroy resou
rce `xcp-volume-9ef5f4a1-f101-4f34-8029-f2ad698decdd` from SR `xcp-sr-linstor_group_thin_device`: (Node: 'xcp-nodo-1') Failed to delete lvm volume]
Nov 26 08:19:58 xcp-node-1 SM: [1055074] File "/opt/xensource/sm/SRCommand.py", line 392, in run
Nov 26 08:19:58 xcp-node-1 SM: [1055074] ret = cmd.run(sr)
Nov 26 08:19:58 xcp-node-1 SM: [1055074] File "/opt/xensource/sm/SRCommand.py", line 113, in run
Nov 26 08:19:58 xcp-node-1 SM: [1055074] return self._run_locked(sr)
Nov 26 08:19:58 xcp-node-1 SM: [1055074] File "/opt/xensource/sm/SRCommand.py", line 163, in _run_locked
Nov 26 08:19:58 xcp-node-1 SM: [1055074] rv = self._run(sr, target)
Nov 26 08:19:58 xcp-node-1 SM: [1055074] File "/opt/xensource/sm/SRCommand.py", line 254, in _run
Nov 26 08:19:58 xcp-node-1 SM: [1055074] return target.delete(self.params['sr_uuid'], self.vdi_uuid)
Nov 26 08:19:58 xcp-node-1 SM: [1055074] File "/opt/xensource/sm/LinstorSR", line 1775, in delete
Nov 26 08:19:58 xcp-node-1 SM: [1055074] raise xs_errors.XenError('VDIDelete', opterr=str(e))
Nov 26 08:19:58 xcp-node-1 SM: [1055074]
```
Signed-off-by: Ronan Abhamon <ronan.abhamon@vates.tech>
Before this change `EMEDIUMTYPE` was not tested, so we only checked the DRBD openers if we attempted a local opening in write mode. As a reminder, `EMEDIUMTYPE` is returned if a local read-only opening is attempted and the volume is open for writing on another machine. Signed-off-by: Ronan Abhamon <ronan.abhamon@vates.tech>
Explicit error message pointing to missing vdi_type on SRMetadata update Add a distinction for unpacking corrupted empty metadata headers for easier diagnostic Signed-off-by: Antoine Bartuccio <antoine.bartuccio@vates.tech>
Adding SRs on multiple usb devices may fail because /usr/lib/udev/scsi_id returns the same device id for all the usb devices. This change fixes this by checking the drive type and using the device serial number if correctly read. Signed-off-by: Frederic Bor <frederic.bor@wanadoo.fr>
Signed-off-by: Antoine Bartuccio <antoine.bartuccio@vates.tech>
Millefeuille42
requested changes
Dec 15, 2025
Comment on lines
+1331
to
+1332
| 'drbdProperties': drbd_properties, | ||
| 'drbdPropertiesSet': drbd_properties_set, |
There was a problem hiding this comment.
I'd suggest having getX and setX to have some consistency
Suggested change
| 'drbdProperties': drbd_properties, | |
| 'drbdPropertiesSet': drbd_properties_set, | |
| 'getDrbdProperties': get_drbd_properties, | |
| 'setDrbdProperties': set_drbd_properties, |
Comment on lines
+940
to
+945
| allowed = [ | ||
| 'c-min-rate', | ||
| 'c-max-rate', | ||
| 'resync-rate', | ||
| 'c-plan-ahead', | ||
| ] |
There was a problem hiding this comment.
Make it a tuple
Suggested change
| allowed = [ | |
| 'c-min-rate', | |
| 'c-max-rate', | |
| 'resync-rate', | |
| 'c-plan-ahead', | |
| ] | |
| allowed = ( | |
| 'c-min-rate', | |
| 'c-max-rate', | |
| 'resync-rate', | |
| 'c-plan-ahead', | |
| ) |
9cbd470 to
81418fa
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Allow finer control over drbd sync settings on linstor SR