mirror of
https://github.com/jpeletier/koolnova2mqtt.git
synced 2026-07-16 04:16:56 +00:00
refactor retry logic with exponential delay
This commit is contained in:
+28
-17
@@ -29,6 +29,26 @@ type modbus struct {
|
|||||||
lock sync.RWMutex
|
lock sync.RWMutex
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func throttle(ms int) {
|
||||||
|
time.Sleep(time.Duration(ms) * time.Millisecond)
|
||||||
|
}
|
||||||
|
|
||||||
|
func retry(f func() error) (err error) {
|
||||||
|
retries := 5
|
||||||
|
delay := 100
|
||||||
|
for retries > 0 {
|
||||||
|
err = f()
|
||||||
|
if err == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
retries--
|
||||||
|
log.Printf("Retried modbus operation due to %s. %d retries left\n", err, retries)
|
||||||
|
throttle(delay)
|
||||||
|
delay *= 2
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
func New(config *Config) (Modbus, error) {
|
func New(config *Config) (Modbus, error) {
|
||||||
handler := gmodbus.NewRTUClientHandler(config.Port)
|
handler := gmodbus.NewRTUClientHandler(config.Port)
|
||||||
handler.BaudRate = config.BaudRate
|
handler.BaudRate = config.BaudRate
|
||||||
@@ -56,15 +76,11 @@ func (mb *modbus) ReadRegister(slaveID byte, address uint16, quantity uint16) (r
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
defer mb.handler.Close()
|
defer mb.handler.Close()
|
||||||
retries := 5
|
retry(func() (err error) {
|
||||||
for retries > 0 {
|
|
||||||
results, err = mb.client.ReadHoldingRegisters(address-1, quantity)
|
results, err = mb.client.ReadHoldingRegisters(address-1, quantity)
|
||||||
if err == nil {
|
return err
|
||||||
break
|
})
|
||||||
}
|
throttle(200)
|
||||||
retries--
|
|
||||||
log.Printf("Warning: Retried read due to %s\n", err)
|
|
||||||
}
|
|
||||||
return results, err
|
return results, err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,15 +93,10 @@ func (mb *modbus) WriteRegister(slaveID byte, address uint16, value uint16) (res
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
defer mb.handler.Close()
|
defer mb.handler.Close()
|
||||||
retries := 5
|
retry(func() (err error) {
|
||||||
for retries > 0 {
|
|
||||||
results, err = mb.client.WriteSingleRegister(address-1, value)
|
results, err = mb.client.WriteSingleRegister(address-1, value)
|
||||||
if err == nil {
|
return err
|
||||||
break
|
})
|
||||||
}
|
throttle(200)
|
||||||
retries--
|
|
||||||
log.Printf("Warning: Retried write due to %s\n", err)
|
|
||||||
}
|
|
||||||
return results, err
|
return results, err
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user