public async Task <MembershipTableData> ReadRow(SiloAddress siloAddress) { try { var keys = new Dictionary <string, AttributeValue> { { $"{SiloInstanceRecord.DEPLOYMENT_ID_PROPERTY_NAME}", new AttributeValue(this.clusterId) }, { $"{SiloInstanceRecord.SILO_IDENTITY_PROPERTY_NAME}", new AttributeValue(SiloInstanceRecord.ConstructSiloIdentity(siloAddress)) } }; var entry = await storage.ReadSingleEntryAsync(this.options.TableName, keys, fields => new SiloInstanceRecord(fields)); MembershipTableData data = entry != null?Convert(new List <SiloInstanceRecord> { entry }) : new MembershipTableData(this.tableVersion); if (this.logger.IsEnabled(LogLevel.Trace)) { this.logger.Trace("Read my entry {0} Table=" + Environment.NewLine + "{1}", siloAddress.ToLongString(), data.ToString()); } return(data); } catch (Exception exc) { this.logger.Warn(ErrorCode.MembershipBase, $"Intermediate error reading silo entry for key {siloAddress.ToLongString()} from the table {this.options.TableName}.", exc); throw; } }
private async Task <bool> TryCreateTableVersionEntryAsync() { var keys = new Dictionary <string, AttributeValue> { { $"{SiloInstanceRecord.DEPLOYMENT_ID_PROPERTY_NAME}", new AttributeValue(this.clusterId) }, { $"{SiloInstanceRecord.SILO_IDENTITY_PROPERTY_NAME}", new AttributeValue(SiloInstanceRecord.TABLE_VERSION_ROW) } }; var versionRow = await storage.ReadSingleEntryAsync(this.options.TableName, keys, fields => new SiloInstanceRecord(fields)); if (versionRow != null) { return(false); } if (!TryCreateTableVersionRecord(0, null, out var entry)) { return(false); } var notExistConditionExpression = $"attribute_not_exists({SiloInstanceRecord.DEPLOYMENT_ID_PROPERTY_NAME}) AND attribute_not_exists({SiloInstanceRecord.SILO_IDENTITY_PROPERTY_NAME})"; try { await storage.PutEntryAsync(this.options.TableName, entry.GetFields(true), notExistConditionExpression); } catch (ConditionalCheckFailedException) { return(false); } return(true); }
/// <summary> Read state data function for this storage provider. </summary> /// <see cref="IStorageProvider.ReadStateAsync"/> public async Task ReadStateAsync(string grainType, GrainReference grainReference, IGrainState grainState) { if (storage == null) { throw new ArgumentException("GrainState-Table property not initialized"); } string partitionKey = GetKeyString(grainReference); if (Log.IsVerbose3) { Log.Verbose3(ErrorCode.StorageProviderBase, "Reading: GrainType={0} Pk={1} Grainid={2} from Table={3}", grainType, partitionKey, grainReference, tableName); } string rowKey = AWSUtils.ValidateDynamoDBRowKey(grainType); var record = await storage.ReadSingleEntryAsync(tableName, new Dictionary <string, AttributeValue> { { GRAIN_REFERENCE_PROPERTY_NAME, new AttributeValue(partitionKey) }, { GRAIN_TYPE_PROPERTY_NAME, new AttributeValue(rowKey) } }, (fields) => { return(new GrainStateRecord { GrainType = fields[GRAIN_TYPE_PROPERTY_NAME].S, GrainReference = fields[GRAIN_REFERENCE_PROPERTY_NAME].S, ETag = int.Parse(fields[ETAG_PROPERTY_NAME].N), BinaryState = fields.ContainsKey(BINARY_STATE_PROPERTY_NAME) ? fields[BINARY_STATE_PROPERTY_NAME].B.ToArray() : null, StringState = fields.ContainsKey(STRING_STATE_PROPERTY_NAME) ? fields[STRING_STATE_PROPERTY_NAME].S : string.Empty }); }).ConfigureAwait(false); if (record != null) { var loadedState = ConvertFromStorageFormat(record); grainState.State = loadedState ?? Activator.CreateInstance(grainState.State.GetType()); grainState.ETag = record.ETag.ToString(); } // Else leave grainState in previous default condition }
/// <summary> /// Reads a reminder for a grain reference by reminder name. /// Read a row from the remider table /// </summary> /// <param name="grainRef"> grain ref to locate the row </param> /// <param name="reminderName"> remider name to locate the row </param> /// <returns> Return the RemiderTableData if the rows were read successfully </returns> public async Task <ReminderEntry> ReadRow(GrainReference grainRef, string reminderName) { var reminderId = ConstructReminderId(serviceId, grainRef, reminderName); var keys = new Dictionary <string, AttributeValue> { { $"{REMINDER_ID_PROPERTY_NAME}", new AttributeValue(reminderId) }, { $"{GRAIN_HASH_PROPERTY_NAME}", new AttributeValue { N = grainRef.GetUniformHashCode().ToString() } } }; try { return(await storage.ReadSingleEntryAsync(TABLE_NAME_DEFAULT_VALUE, keys, Resolve).ConfigureAwait(false)); } catch (Exception exc) { logger.Warn(ErrorCode.ReminderServiceBase, $"Intermediate error reading reminder entry {Utils.DictionaryToString(keys)} from table {TABLE_NAME_DEFAULT_VALUE}.", exc); throw; } }