TLDR: Anyone able to assist of why Controller B cannot talk to Controller A after 25.10.2.1>25.10.3.1 update?
I have an X20 dual controller unit that was running in HA mode rather beautifully on 25.10.2.1 other than some occasional active directory sync issues I was trying to resolve. The update channel was giving me a warning that 25.10.2.1 was an early adopter release and an update to 25.10.3.1 is a recommended action.
Controller B was the active controller (with HA enabled and healthy) when update was initiated via the web interface. Everything seemed to download well and pass pre-checks and while pinging both controllers, controller A stopped pinging during the update installation. After some minutes, it began pinging again. 20+ minutes later, it seems controller A is missing according to the web interface.
I SSH’d into controller A and it seemed as though things may have been working from the CLI perspective of things but my only obvious action seemed to be to try a good ol $sudo reboot.
Controller A rebooted and still ping responsive and still able to ssh into it but the web interface of Controller B claims it eventually timed out waiting for Controller A to update and reboot, controller A appears offline to controller B.
Controller A ssh interface: I entered “cli” from the linux shell > menu > then navigated to network configurations to be sure everything is looking normal among my fairly simple adapter configurations. It is. It is also showing that it is running 25.10.3.1, a seemingly successful OS upgrade.
I figured it’d be worth a shot to simply roll controller A back to 25.10.2.1 via the CLI. When trying to do that via command
system bootenv
I get: Namespace bootenv not found
Therefore, I am unable to change me boot environment back to the previous version. In linux cli rummaging around zfs commands, I can see my boot pool volumes for 25.10.2.1 do still exist.
Why such a failure? Anyone able to assist of why Controller B cannot talk to Controller A after 25.10.2.1 to 25.10.3.1 update?
When attempting to manually “sync to peer and reboot peer” in HA settings, I get this:
`Traceback (most recent call last):
File “/usr/lib/python3/dist-packages/middlewared/plugins/failover_/remote.py”, line 332, in call_remote
return self.CLIENT.call(method, *args, **opts)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/lib/python3/dist-packages/middlewared/plugins/failover_/remote.py”, line 197, in call
raise CallError(‘Remote connection unavailable’, errno.ECONNREFUSED)
middlewared.service_exception.CallError: [ECONNREFUSED] Remote connection unavailableDuring handling of the above exception, another exception occurred:
Traceback (most recent call last):
File “/usr/lib/python3/dist-packages/middlewared/api/base/server/ws_handler/rpc.py”, line 361, in process_method_call
result = await method.call(app, id_, params)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/lib/python3/dist-packages/middlewared/api/base/server/method.py”, line 57, in call
result = await self.middleware.call_with_audit(self.name, self.serviceobj, methodobj, params, app,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/lib/python3/dist-packages/middlewared/main.py”, line 956, in call_with_audit
result = await self._call(method, serviceobj, methodobj, params, app=app,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/lib/python3/dist-packages/middlewared/main.py”, line 784, in _call
return await self.run_in_executor(prepared_call.executor, methodobj, *prepared_call.args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/lib/python3/dist-packages/middlewared/main.py”, line 667, in run_in_executor
return await loop.run_in_executor(pool, functools.partial(method, *args, **kwargs))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/lib/python3.11/concurrent/futures/thread.py”, line 58, in run
result = self.fn(*self.args, **self.kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/lib/python3/dist-packages/middlewared/api/base/decorator.py”, line 116, in wrapped
result = func(*args)
^^^^^^^^^^^
File “/usr/lib/python3/dist-packages/middlewared/plugins/failover.py”, line 377, in sync_to_peer
self.middleware.call_sync(‘failover.datastore.send’)
File “/usr/lib/python3/dist-packages/middlewared/main.py”, line 1083, in call_sync
return self.run_coroutine(self.run_in_executor(prepared_call.executor, methodobj, *prepared_call.args))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/lib/python3/dist-packages/middlewared/main.py”, line 1115, in run_coroutine
return fut.result()
^^^^^^^^^^^^
File “/usr/lib/python3.11/concurrent/futures/_base.py”, line 449, in result
return self.__get_result()
^^^^^^^^^^^^^^^^^^^
File “/usr/lib/python3.11/concurrent/futures/_base.py”, line 401, in __get_result
raise self.exception
File “/usr/lib/python3/dist-packages/middlewared/main.py”, line 667, in run_in_executor
return await loop.run_in_executor(pool, functools.partial(method, *args, **kwargs))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/lib/python3.11/concurrent/futures/thread.py”, line 58, in run
result = self.fn(*self.args, **self.kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/middlewared/plugins/failover/datastore.py", line 87, in send
token = self.middleware.call_sync(‘failover.call_remote’, ‘auth.generate_token’, [
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/lib/python3/dist-packages/middlewared/main.py”, line 1083, in call_sync
return self.run_coroutine(self.run_in_executor(prepared_call.executor, methodobj, *prepared_call.args))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/lib/python3/dist-packages/middlewared/main.py”, line 1115, in run_coroutine
return fut.result()
^^^^^^^^^^^^
File “/usr/lib/python3.11/concurrent/futures/_base.py”, line 449, in result
return self.__get_result()
^^^^^^^^^^^^^^^^^^^
File “/usr/lib/python3.11/concurrent/futures/_base.py”, line 401, in __get_result
raise self.exception
File “/usr/lib/python3/dist-packages/middlewared/main.py”, line 667, in run_in_executor
return await loop.run_in_executor(pool, functools.partial(method, *args, **kwargs))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/usr/lib/python3.11/concurrent/futures/thread.py”, line 58, in run
result = self.fn(*self.args, **self.kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/middlewared/plugins/failover/remote.py", line 336, in call_remote
raise CallError(str(e), e.errno)
middlewared.service_exception.CallError: [ECONNREFUSED] [ECONNREFUSED] Remote connection unavailable`
