fix: preserve partial batch property results

This commit is contained in:
2026-07-22 11:38:23 +08:00
parent 013056d715
commit a22457ce5f
3 changed files with 63 additions and 9 deletions
+17 -3
View File
@@ -747,6 +747,7 @@ func (device *Device) GetMany(ctx context.Context, names []string) ([]DeviceProp
return nil, err
}
byIdentity := make(map[propertyIdentity]PropertyResult, len(chunkResults))
duplicateIdentities := make(map[propertyIdentity]struct{})
requested := make(map[propertyIdentity]struct{}, end-start)
for _, request := range requests[start:end] {
requested[propertyIdentity{did: request.DID, siid: request.SIID, piid: request.PIID}] = struct{}{}
@@ -757,17 +758,30 @@ func (device *Device) GetMany(ctx context.Context, names []string) ([]DeviceProp
return nil, fmt.Errorf("get properties protocol error: unexpected identity (%s,%d,%d)", result.DID, result.SIID, result.PIID)
}
if _, duplicate := byIdentity[identity]; duplicate {
return nil, fmt.Errorf("get properties protocol error: duplicate identity (%s,%d,%d)", result.DID, result.SIID, result.PIID)
duplicateIdentities[identity] = struct{}{}
continue
}
byIdentity[identity] = result
}
for index, request := range requests[start:end] {
identity := propertyIdentity{did: request.DID, siid: request.SIID, piid: request.PIID}
name := names[start+index]
if _, duplicate := duplicateIdentities[identity]; duplicate {
results[start+index] = DevicePropertyResult{
Name: name,
Err: fmt.Errorf("get properties protocol error: duplicate identity (%s,%d,%d)", request.DID, request.SIID, request.PIID),
}
continue
}
result, ok := byIdentity[identity]
if !ok {
return nil, fmt.Errorf("get properties protocol error: missing identity (%s,%d,%d)", request.DID, request.SIID, request.PIID)
results[start+index] = DevicePropertyResult{
Name: name,
Err: fmt.Errorf("get properties protocol error: missing identity (%s,%d,%d)", request.DID, request.SIID, request.PIID),
}
continue
}
results[start+index] = DevicePropertyResult{Name: names[start+index], Value: result.Value, Code: result.Code}
results[start+index] = DevicePropertyResult{Name: name, Value: result.Value, Code: result.Code}
}
}
if err := device.wait(ctx); err != nil {