Skip to content

Commit 1635b65

Browse files
authored
Adjusting DPS for memory performance optimization on small devices (#311)
1 parent 2c9d4cd commit 1635b65

File tree

1 file changed

+38
-23
lines changed

1 file changed

+38
-23
lines changed

nanoFramework.Azure.Devices.Client/ProvisioningDeviceClient.cs

Lines changed: 38 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,11 @@ public class ProvisioningDeviceClient : IDisposable
3232
private DateTime _retryInitTime;
3333
private string _operationId;
3434
private ProvisioningRegistrationStatusType _status = ProvisioningRegistrationStatusType.Unassigned;
35+
private ProvisioningRegistrationStatusType _statusLast = ProvisioningRegistrationStatusType.Unassigned;
3536
private DeviceRegistrationResult _result = null;
3637
private bool _isMessageProcessed = false;
3738
private bool _isDisposed = false;
39+
private string _message = null;
3840

3941
/// <summary>
4042
/// Creates an instance of the Device Provisioning Client.
@@ -205,10 +207,12 @@ public DeviceRegistrationResult Register(ProvisioningRegistrationAdditionalData
205207
registration = $"{{\"registrationId\":\"{_registrationId}\"}}";
206208
}
207209

208-
var ret = _mqttc.Publish($"$dps/registrations/PUT/iotdps-register/?$rid={_requestId}", Encoding.UTF8.GetBytes(registration));
210+
_mqttc.Publish($"$dps/registrations/PUT/iotdps-register/?$rid={_requestId}", Encoding.UTF8.GetBytes(registration));
209211

210212
while ((!cancellationToken.IsCancellationRequested) && (_status != ProvisioningRegistrationStatusType.Assigned))
211213
{
214+
// We force to clean the memory at this stage, for constrained devices
215+
Runtime.Native.GC.Run(true);
212216
Thread.Sleep(200);
213217
// Don't ask for a new message if we are already processing one
214218
if ((_retry > 0) && (!_isMessageProcessed))
@@ -222,6 +226,35 @@ public DeviceRegistrationResult Register(ProvisioningRegistrationAdditionalData
222226
}
223227

224228
CleanAll();
229+
230+
// Creating a DeviceRegistrationResult only when it's needed
231+
// One more time cleaning the memory for small devices, a bit of performances penalties
232+
Runtime.Native.GC.Run(true);
233+
if (!string.IsNullOrEmpty(_message))
234+
{
235+
var opeStat = (RegistrationOperationStatus)nanoFramework.Json.JsonConvert.DeserializeObject(_message, typeof(RegistrationOperationStatus));
236+
var reg = opeStat.registrationState;
237+
var status = AssignStatus(opeStat.status);
238+
if (_statusLast == ProvisioningRegistrationStatusType.Assigned)
239+
{
240+
ProvisioningRegistrationSubstatusType sub = ProvisioningRegistrationSubstatusType.InitialAssignment;
241+
if (reg.substatus == "deviceDataMigrated")
242+
{
243+
sub = ProvisioningRegistrationSubstatusType.DeviceDataMigrated;
244+
}
245+
else if (reg.substatus == "deviceDataReset")
246+
{
247+
sub = ProvisioningRegistrationSubstatusType.DeviceDataReset;
248+
}
249+
250+
_result = new(reg.registrationId, reg.createdDateTimeUtc, reg.assignedHub, reg.deviceId, status, sub, string.Empty, reg.lastUpdatedDateTimeUtc, reg.errorCode, reg.errorMessage, reg.etag, opeStat.registrationState.payload);
251+
}
252+
else
253+
{
254+
_result = new(reg.registrationId, reg.createdDateTimeUtc, reg.assignedHub, reg.deviceId, status, string.Empty, reg.lastUpdatedDateTimeUtc, reg.errorCode, reg.errorMessage, reg.etag);
255+
}
256+
}
257+
225258
return _result ?? new DeviceRegistrationResult(_registrationId, DateTime.UtcNow, string.Empty, string.Empty, _status, string.Empty, DateTime.UtcNow, -1, $"Unknown error, cancellation requested: {cancellationToken.IsCancellationRequested}", string.Empty);
226259
}
227260

@@ -263,9 +296,9 @@ private void ClientMqttMsgReceived(object sender, MqttMsgPublishEventArgs e)
263296
// The message after the publish looks like that:
264297
// $dps/registrations/res/202/?$rid={request_id}&retry-after=x
265298
// x is the retry-after value in seconds
299+
var opeStat = (RegistrationOperationStatusSimple)Json.JsonConvert.DeserializeObject(message, typeof(RegistrationOperationStatusSimple));
266300
if (e.Topic.StartsWith($"$dps/registrations/res/202/?$rid={_requestId}"))
267301
{
268-
var opeStat = (RegistrationOperationStatusSimple)Json.JsonConvert.DeserializeObject(message, typeof(RegistrationOperationStatusSimple));
269302
_operationId = opeStat.operationId;
270303
status = AssignStatus(opeStat.status);
271304
_retry = Convert.ToInt32(e.Topic.Substring(e.Topic.LastIndexOf('=') + 1));
@@ -275,28 +308,10 @@ private void ClientMqttMsgReceived(object sender, MqttMsgPublishEventArgs e)
275308
{
276309
// This is to avoid having multiple messages to process
277310
_isMessageProcessed = true;
278-
var opeStat = (RegistrationOperationStatus)Json.JsonConvert.DeserializeObject(message, typeof(RegistrationOperationStatus));
279311
_operationId = opeStat.operationId;
280312
status = AssignStatus(opeStat.status);
281-
var reg = opeStat.registrationState;
282-
if (_status == ProvisioningRegistrationStatusType.Assigned)
283-
{
284-
ProvisioningRegistrationSubstatusType sub = ProvisioningRegistrationSubstatusType.InitialAssignment;
285-
if (reg.substatus == "deviceDataMigrated")
286-
{
287-
sub = ProvisioningRegistrationSubstatusType.DeviceDataMigrated;
288-
}
289-
else if (reg.substatus == "deviceDataReset")
290-
{
291-
sub = ProvisioningRegistrationSubstatusType.DeviceDataReset;
292-
}
293-
294-
_result = new(reg.registrationId, reg.createdDateTimeUtc, reg.assignedHub, reg.deviceId, status, sub, string.Empty, reg.lastUpdatedDateTimeUtc, reg.errorCode, reg.errorMessage, reg.etag, opeStat.registrationState.payload);
295-
}
296-
else
297-
{
298-
_result = new(reg.registrationId, reg.createdDateTimeUtc, reg.assignedHub, reg.deviceId, status, string.Empty, reg.lastUpdatedDateTimeUtc, reg.errorCode, reg.errorMessage, reg.etag);
299-
}
313+
_message = message;
314+
_statusLast = _status;
300315
}
301316
else if (!_isMessageProcessed)
302317
{
@@ -346,7 +361,7 @@ private ProvisioningRegistrationStatusType AssignStatus(string status)
346361
/// <inheritdoc/>
347362
public void Dispose()
348363
{
349-
if(_isDisposed)
364+
if (_isDisposed)
350365
{
351366
return;
352367
}

0 commit comments

Comments
 (0)