daemon: make Windows service unregistration idempotent

Treat an already absent service or one already marked for deletion as a
successful unregister operation.

Continue removing the event log registration in those cases so retries
also clean up stale registration state left by an earlier partial
unregister.

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
Sebastiaan van Stijn committed 2026-10-02 14:19:18 +02:00
1 parent 6e077c1505
commit 1a80fa4098
1 file changed
+12 -5
+12 -5
View File
@@ -200,6 +200,9 @@ func registerService() (retErr error) {
return eventlog.Install(*flServiceName, p, false, eventlog.Info|eventlog.Warning|eventlog.Error)
}
// unregisterService unregisters the Docker Windows service and removes its
// event log registration. It succeeds if the service is already absent or
// already marked for deletion.
func unregisterService() error {
m, err := mgr.Connect()
if err != nil {
@@ -208,12 +211,16 @@ func unregisterService() error {
defer m.Disconnect()
s, err := m.OpenService(*flServiceName)
if err != nil {
return err
}
defer s.Close()
switch {
case err == nil:
defer s.Close()
if err := s.Delete(); err != nil {
if err := s.Delete(); err != nil && !errors.Is(err, windows.ERROR_SERVICE_MARKED_FOR_DELETE) {
return err
}
case errors.Is(err, windows.ERROR_SERVICE_DOES_NOT_EXIST):
// Continue to remove a potentially stale event log registration.
default:
return err
}
if err := eventlog.Remove(*flServiceName); err != nil && !errors.Is(err, registry.ErrNotExist) {