private async Task DirectApplyIndexUpdateNonPersistent(IIndexableGrain g, IMemberUpdate updt, bool isUniqueIndex, IndexMetaData idxMetaData, SiloAddress siloAddress) { //this variable determines whether index was still unavailable //when we received a delete operation bool fixIndexUnavailableOnDelete = false; //the target grain that is updated V updatedGrain = g.AsReference <V>(GrainFactory); K befImg; HashIndexSingleBucketEntry <V> befEntry; //Updates the index bucket synchronously //(note that no other thread can run concurrently //before we reach an await operation, so no concurrency //control mechanism (e.g., locking) is required) if (!HashIndexBucketUtils.UpdateBucket(updatedGrain, updt, State, isUniqueIndex, idxMetaData, out befImg, out befEntry, out fixIndexUnavailableOnDelete)) { await(await GetNextBucketAndPersist()).DirectApplyIndexUpdate(g, updt.AsImmutable(), isUniqueIndex, idxMetaData, siloAddress); } //if the index was still unavailable //when we received a delete operation //if (fixIndexUnavailableOnDelete) //{ // //create tombstone //} }
private async Task DirectApplyIndexUpdateNonPersistent(IIndexableGrain g, IMemberUpdate updt, bool isUniqueIndex, IndexMetaData idxMetaData, SiloAddress siloAddress) { // The target grain that is updated V updatedGrain = g.AsReference <V>(this.SiloIndexManager); // Updates the index bucket synchronously (note that no other thread can run concurrently before we reach an await operation, // when execution is yielded back to the Orleans scheduler, so no concurrency control mechanism (e.g., locking) is required). // 'fixIndexUnavailableOnDelete' indicates whether the index was still unavailable when we received a delete operation. if (!HashIndexBucketUtils.UpdateBucketState(updatedGrain, updt, this.State, isUniqueIndex, idxMetaData, out K befImg, out HashIndexSingleBucketEntry <V> befEntry, out bool fixIndexUnavailableOnDelete)) { await(await GetNextBucketAndPersist()).DirectApplyIndexUpdate(g, updt.AsImmutable(), isUniqueIndex, idxMetaData, siloAddress); } // TODO if the index was still unavailable when we received a delete operation //if (fixIndexUnavailableOnDelete) //{ // //create tombstone //} }
private Task ApplyIndexUpdatesEagerly(Type iGrainType, IIndexableGrain updatedGrain, IDictionary <string, IMemberUpdate> updates, UpdateIndexType updateIndexTypes, bool updateIndexesTentatively) { IList <Task <bool> > updateIndexTasks = new List <Task <bool> >(); foreach (KeyValuePair <string, IMemberUpdate> updt in updates.Where(updt => updt.Value.OperationType != IndexOperationType.None)) { var idxInfo = this._grainIndexes[updt.Key]; if (updateIndexTypes.HasFlag(idxInfo.MetaData.IsUniqueIndex ? UpdateIndexType.Unique : UpdateIndexType.NonUnique)) { // If the caller asks for the update to be tentative, then it will be wrapped inside a MemberUpdateTentative IMemberUpdate updateToIndex = updateIndexesTentatively ? new MemberUpdateTentative(updt.Value) : updt.Value; // The update task is added to the list of update tasks updateIndexTasks.Add(idxInfo.IndexInterface.ApplyIndexUpdate(this.SiloIndexManager, updatedGrain, updateToIndex.AsImmutable(), idxInfo.MetaData, BaseSiloAddress)); } } // At the end, because the index update should be eager, we wait for all index update tasks to finish return(Task.WhenAll(updateIndexTasks)); }