/// <summary> /// Get worker heartbeat /// </summary> /// <param name="ct"></param> /// <returns></returns> private async Task <WorkerHeartbeatModel> GetWorkerHeartbeatAsync(CancellationToken ct) { var workerHeartbeat = new WorkerHeartbeatModel { WorkerId = WorkerId, AgentId = AgentId, Status = GetStatus() }; if (_agentRepository != null) { await _agentRepository.AddOrUpdate(workerHeartbeat, ct); } return(workerHeartbeat); }
/// <inheritdoc/> public async Task AddOrUpdate(WorkerHeartbeatModel workerHeartbeat, CancellationToken ct) { if (workerHeartbeat == null) { throw new ArgumentNullException(nameof(workerHeartbeat)); } while (true) { var workerDocument = new WorkerDocument { AgentId = workerHeartbeat.AgentId, Id = workerHeartbeat.WorkerId, WorkerStatus = workerHeartbeat.Status, LastSeen = DateTime.UtcNow }; var existing = await _documents.FindAsync <WorkerDocument>( workerHeartbeat.WorkerId); if (existing != null) { try { workerDocument.ETag = existing.Etag; workerDocument.Id = existing.Id; await _documents.ReplaceAsync(existing, workerDocument); return; } catch (ResourceOutOfDateException) { continue; // try again refreshing the etag } catch (ResourceNotFoundException) { continue; } } try { await _documents.AddAsync(workerDocument); return; } catch (ConflictingResourceException) { // Try to update continue; } } }