private OverlayData[] PutInternal(OverlayData[] data, PutStorageBehavior putBehavior) { var dataToPutByNode = new Dictionary<IOverlayNode, IList<OverlayData>>(); foreach (var dataitem in data) { var dataItemKey = OverlayHashKeyPrv.GetHashKey(OverlayHelper.GetHashArgument(dataitem.AttrValue.Key)); var responsibleNode = MainOverlaySrv.GetNodeByKey(new GetOverlayNodeByKeyArg(dataItemKey)); dataitem.ResponsibleNode = responsibleNode; // here we assign responsible node to the overlay data item if (!dataToPutByNode.ContainsKey(responsibleNode)) { dataToPutByNode.Add(responsibleNode, new List<OverlayData>()); } dataToPutByNode[responsibleNode].Add(dataitem); } var results = new Dictionary<IOverlayNode, OverlayData[]>(); foreach (var item in dataToPutByNode) { var channel = CommunicationMgr.GetChannel(item.Key); var putResults = channel.Service.Put(item.Value.ToArray(), putBehavior); results.Add(item.Key, putResults); } return results.SelectMany(r => r.Value).ToArray(); }
private bool PutService(OverlayData[] od, string serviceName, PutStorageBehavior putBehavior) { // 1. put new service var putResults = PutInternal(od, putBehavior); var putSd = ServiceDescription.FromOverlayData(putResults).Single(); // only one service description will be here since it was one originally // 2. perform the action locally LocalStorage.PutLocal(putSd, putBehavior); // 3. store information about responsible nodes for the service at remote node (by service name) var storageSrv = GetStorageServiceByServiceName(serviceName); storageSrv.PutServiceResponsibleNodes(putSd, putBehavior); return putSd.StorageState == ServiceStorageState.Success; }
public void PutServiceResponsibleNodes(ServiceDescription sd, PutStorageBehavior putBehavior) { LocalStorage.PutServiceResponsibleNodes(sd, putBehavior); }
public OverlayData[] Put(OverlayData[] d, PutStorageBehavior putBehavior) { return LocalStorage.Put(d, putBehavior); }
public void PutServiceResponsibleNodes(ServiceDescription sd, PutStorageBehavior putBehavior) { var data = GetServiceDataCollection(); if (putBehavior == PutStorageBehavior.Overwrite) { data.Insert(GetInsertServiceResponsibleNodes(sd)); } else { var serviceDoc = data.FindOne(MongoQueryBuilder.EQ(ServiceNameFieldName, sd.Name)); if (serviceDoc == null) { data.Insert(GetInsertServiceResponsibleNodes(sd)); } else { foreach (var d in sd.Data) { var srvAttrDoc = data.FindOne( MongoQueryBuilder.And( MongoQueryBuilder.EQ(ServiceNameFieldName, sd.Name), MongoQueryBuilder.EQ(String.Format("{0}.{1}", ServiceDataFieldName, AttributeFieldName), d.AttrValue.Key) ) ); if (srvAttrDoc == null) { var srvDocData = serviceDoc[ServiceDataFieldName]; if (srvDocData == null) { serviceDoc[ServiceDataFieldName] = new BsonArray(); } (serviceDoc[ServiceDataFieldName].AsBsonArray).Add(new BsonDocument { { AttributeFieldName, d.AttrValue.Key }, { ResponsibleNodeFieldName, Serializer.Serialize(d.ResponsibleNode) } }); data.Save(serviceDoc); } } } } }
public void PutLocal(ServiceDescription sd, PutStorageBehavior putBehavior) { var data = GetLocalDataCollection(); if (putBehavior == PutStorageBehavior.Overwrite) { data.Insert(GetInsertLocalServiceDescription(sd)); } else if (putBehavior == PutStorageBehavior.Update) { var serviceDoc = data.FindOne(MongoQueryBuilder.EQ(ServiceNameFieldName, sd.Name)); if (serviceDoc == null) { data.Insert(GetInsertLocalServiceDescription(sd)); } else { foreach (var d in sd.Data) { var srvAttrDoc = data.FindOne( MongoQueryBuilder.And( MongoQueryBuilder.EQ(ServiceNameFieldName, sd.Name), MongoQueryBuilder.EQ(String.Format("{0}.{1}", ServiceDataFieldName, AttributeFieldName), d.AttrValue.Key) ) ); if (srvAttrDoc == null) { var srvDocData = serviceDoc[ServiceDataFieldName]; if (srvDocData == null) { serviceDoc[ServiceDataFieldName] = new BsonArray(); } (serviceDoc[ServiceDataFieldName].AsBsonArray).Add(new BsonDocument { { AttributeFieldName, d.AttrValue.Key }, { ValueFieldName, GetTypedBsonValue(d) }, { ResponsibleNodeFieldName, Serializer.Serialize(d.ResponsibleNode) }, { ValueTypeFieldName, GetValueTypeFieldValue(d) }, { ServiceStorageStateFieldName, Enum.GetName(typeof(ServiceStorageState), sd.StorageState) } }); data.Save(serviceDoc); } else { var srvAttrDocData = srvAttrDoc[ServiceDataFieldName].AsBsonArray; foreach (var item in srvAttrDocData) { var itemDoc = item.AsBsonDocument; if (itemDoc[AttributeFieldName].AsString == d.AttrValue.Key) { itemDoc[ValueFieldName] = GetTypedBsonValue(d); itemDoc[ValueTypeFieldName] = GetValueTypeFieldValue(d); itemDoc[ServiceStorageStateFieldName] = Enum.GetName(typeof(ServiceStorageState), sd.StorageState); break; } } data.Save(srvAttrDoc); } } } } }
// TODO: handle putBehavior public OverlayData[] Put(OverlayData[] od, PutStorageBehavior putBehavior) { if (!PutServiceFrequencyThreshold.Check() || !CheckAVThreshold()) { throw new PutServiceException(); } var data = GetDataCollection(); if (putBehavior == PutStorageBehavior.Overwrite) { data.InsertBatch( od.Select(d => GetInsertOverlayData(d)) ); } else if (putBehavior == PutStorageBehavior.Update) { foreach (var d in od) { var items = data.Find( MongoQueryBuilder.And( MongoQueryBuilder.EQ(ServiceNameFieldName, d.ServiceName), MongoQueryBuilder.EQ(AttributeFieldName, d.AttrValue.Key) ) ); if (items != null && items.Size() > 0) { foreach (var item in items) { item[ValueFieldName] = GetTypedBsonValue(d); item[ValueTypeFieldName] = GetValueTypeFieldValue(d); data.Save(item); } } else { data.Insert(GetInsertOverlayData(d)); } } } return od; }