public static DataServicePaxosProxy New(ProxyStateMachine stateMachine)
        {
            var resourcePresented = RoleEnvironment.GetConfigurationSettingValue(stateMachine.ServiceName + ".ResourcePresented");
            var resourceManaged   = RoleEnvironment.GetConfigurationSettingValue(stateMachine.ServiceName + ".ResourceManaged");

            return(new DataServicePaxosProxy(resourceManaged, resourcePresented, stateMachine));
        }
        static void InitializeProxy(string service, string kind)
        {
            var location = RoleEnvironment.GetConfigurationSettingValue("Name");

            try
            {
                var SM = ProxyStateMachine.New(location, service);
                var RP = ProxyFactory.New(kind, SM);

                FUSE.Weld.Azure.Configuration.SetConfigurationSettingPublisher();
                var s2        = Utility.GetStorageAccount(true);
                var container = s2.CreateCloudBlobClient().GetContainerReference("root");
                container.CreateIfNotExist();
                var logPosition = container.GetBlobReference(service + "LogPosition");

                var startAt = 0;
                try
                {
                    startAt = Int32.Parse(logPosition.DownloadText());
                }
                catch
                {
                }

                SM.StartAsync(startAt);
            }
            catch (ArgumentException ex)
            {
                if (!ex.Message.Contains("Location"))
                {
                    throw;
                }
            }
        }
        DataServicePaxosProxy(string resourceManaged, string resourcePrestented, ProxyStateMachine stateMachine)
            : base(resourceManaged, resourcePrestented, stateMachine.ServiceName)
        {
            var serviceName = stateMachine.ServiceName;

            this.stateMachine             = stateMachine;
            this.stateMachine.GetResponse = base.GetResponse;

            RouteTable.Routes.Add(new Route(serviceName + "/{*path}", new FuncRouteHandler(_ => this)));
        }
Пример #4
0
        public static ProxyBase New(string kind, ProxyStateMachine stateMachine)
        {
            if (kind.Equals("AzureStorage", StringComparison.InvariantCultureIgnoreCase))
            {
                return(AzureStorageProxy.New(stateMachine));
            }

            if (kind.Equals("DataService", StringComparison.InvariantCultureIgnoreCase))
            {
                return(DataServicePaxosProxy.New(stateMachine));
            }

            throw new ArgumentOutOfRangeException(kind + " is not a known service type");
        }
        AzureStorageProxy(string resourcePresented, ProxyStateMachine stateMachine)
            : base(resourcePresented, stateMachine.ServiceName)
        {
            var serviceName = stateMachine.ServiceName;

            this.stateMachine             = stateMachine;
            this.stateMachine.GetResponse = base.GetResponse;
            this.ManagedAccount           = RoleEnvironment.GetConfigurationSettingValue(serviceName + ".StorageAccount");
            this.ManagedKey       = RoleEnvironment.GetConfigurationSettingValue(serviceName + ".StorageKey");
            this.PresentedAccount = RoleEnvironment.GetConfigurationSettingValue(serviceName + ".PresentedAccount");
            this.PresentedKey     = RoleEnvironment.GetConfigurationSettingValue(serviceName + ".PresentedKey");
            this.prefix           = serviceName;
            this.stateMachine     = stateMachine;

            RouteTable.Routes.Add(new Route(serviceName + "/{*path}", new FuncRouteHandler(_ => this)));
        }
        public static ProxyStateMachine New(string location, string serviceName)
        {
            ProxyStateMachine stateMachine;
            var nodeConfig      = RoleEnvironment.GetConfigurationSettingValue(serviceName + ".Nodes");
            var nodeDescriptors = nodeConfig.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
            var nodes           = new Dictionary <string, Uri>();

            foreach (var d in nodeDescriptors)
            {
                var n = d.Split('=');
                try
                {
                    nodes.Add(n[0], new UriBuilder()
                    {
                        Host = n[1]
                    }.Uri);
                }
                catch (Exception x)
                {
                    Trace.TraceError(x.ToString());
                }
            }
            Uri host;

            if (nodes.TryGetValue(location, out host))
            {
                var preferedLeaders = RoleEnvironment.GetConfigurationSettingValue(serviceName + ".PreferedActiveMembers").Split(';');
                var localStorage    = RoleEnvironment.GetLocalResource("LocalStorage").RootPath;
                var storagePath     = Path.Combine(localStorage, serviceName);

                if (!Directory.Exists(storagePath))
                {
                    Directory.CreateDirectory(storagePath);
                }
                var storage       = new EsentStorage <string, SerialilzableWebRequest>(storagePath, new Counters(location));
                var configuration = new Configuration <string>(preferedLeaders, preferedLeaders, nodes.Keys);
                storage.TryInitialize(configuration);
                Trace.WriteLine("Local Storage Initialized");

                var meshPath = serviceName + "Mesh.ashx";
                var uri      = new UriBuilder(host)
                {
                    Path = meshPath
                }.Uri;
                X509Certificate2 cert = Utility.GetCert();
                var mesh = new MeshHandler <Message>(uri, null, cert);
                RouteTable.Routes.Add(new Route(meshPath, new FuncRouteHandler(_ => mesh)));

                FUSE.Weld.Azure.Configuration.SetConfigurationSettingPublisher();
                var s2        = Utility.GetStorageAccount(true);
                var container = s2.CreateCloudBlobClient().GetContainerReference("root");
                container.CreateIfNotExist();

                Trace.Write("Remote Storage Loaded");

                stateMachine = new ProxyStateMachine(location, nodes, mesh, storage, serviceName, preferedLeaders);

                stateMachine.Paxos.WhenDiverged.Subscribe(d =>
                {
                    Utility.DisableService(stateMachine.ServiceName);
                });

                Global.lastMessages[serviceName]  = new Queue <Timestamped <Tuple <string, Message, string> > >();
                Global.stateMachines[serviceName] = stateMachine;

                var o = stateMachine.Mesh
                        .Where(m => Interesting(m.Item2))
                        .Where(m => stateMachine.EndpointUrisToNames.ContainsKey(m.Item1))
                        .Select(m => Tuple.Create(stateMachine.EndpointUrisToNames[m.Item1], m.Item2, "To"))
                        .Timestamp();

                var i = mesh
                        .Where(m => Interesting(m.Item2))
                        .Where(m => stateMachine.EndpointUrisToNames.ContainsKey(m.Item1))
                        .Select(m => Tuple.Create(stateMachine.EndpointUrisToNames[m.Item1], m.Item2, "From"))
                        .Timestamp();

                i
                .Merge(o)
                .Subscribe(m =>
                {
                    try
                    {
                        lock (Global.lastMessages)
                        {
                            var lastMessages = Global.lastMessages[serviceName];
                            lastMessages.Enqueue(m);
                            while (lastMessages.Count > 1000)
                            {
                                lastMessages.Dequeue();
                            }
                        }
                    }
                    catch
                    {
                    }
                });
                var enabled      = false;
                var enabledState = container.GetBlobReference(serviceName + "EnabledState.txt");
                try
                {
                    enabled = Boolean.Parse(enabledState.DownloadText());
                }
                catch
                {
                }

                mesh.enabled = enabled;
                return(stateMachine);
            }
            else
            {
                throw new ArgumentException("Location not found");
            }
        }
        public static AzureStorageProxy New(ProxyStateMachine stateMachine)
        {
            var resource = RoleEnvironment.GetConfigurationSettingValue(stateMachine.ServiceName + ".ResourcePresented");

            return(new AzureStorageProxy(resource, stateMachine));
        }