Пример #1
0
        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();
        }
Пример #2
0
        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;
        }
Пример #3
0
 public void PutServiceResponsibleNodes(ServiceDescription sd, PutStorageBehavior putBehavior)
 {
     LocalStorage.PutServiceResponsibleNodes(sd, putBehavior);
 }
Пример #4
0
 public OverlayData[] Put(OverlayData[] d, PutStorageBehavior putBehavior)
 {
     return LocalStorage.Put(d, putBehavior);
 }
Пример #5
0
 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);
                 }
             }
         }
     }
 }
Пример #6
0
        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);
                        }
                    }
                }
            }
        }
Пример #7
0
        // 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;
        }