コード例 #1
0
 public AzureEventStoreClient(AzureStoreConfiguration config, EventStoreId storeId, string serverEndpoint = null)
     : base(storeId, serverEndpoint)
 {
     Config = config;
     _blob = config.GetPageBlob(storeId.Name + "/stream.dat");
     _blob.Container.CreateIfNotExist();
 }
コード例 #2
0
        public AzureEventStoreManager(AzureStoreConfiguration config)
        {
            _config = config;

            var account = CloudStorageAccount.Parse(config.ConnectionString);
            var client  = account.CreateCloudBlobClient();

            var rootAzureContainer = client.GetContainerReference(config.RootBlobContainerName);

            rootAzureContainer.CreateIfNotExist();

            foreach (var blob in rootAzureContainer.ListBlobs())
            {
                var dir = blob as CloudBlobDirectory;

                if (dir == null)
                {
                    continue;
                }

                EventStoreId container;

                if (AzureEventStore.TryGetContainerName(_config, dir, out container))
                {
                    var value = AzureEventStore.OpenExistingForWriting(config, container);
                    _stores.Add(container.Name, value);
                }
                else
                {
                    Log.Info("Skipping invalid folder {0}", rootAzureContainer.Uri.MakeRelativeUri(dir.Uri));
                }
            }
        }
コード例 #3
0
        public AzureEventStoreManager(AzureStoreConfiguration config)
        {
            _config = config;

            var account = CloudStorageAccount.Parse(config.ConnectionString);
            var client = account.CreateCloudBlobClient();

            var rootAzureContainer = client.GetContainerReference(config.RootBlobContainerName);

            rootAzureContainer.CreateIfNotExist();

            foreach (var blob in rootAzureContainer.ListBlobs())
            {
                var dir = blob as CloudBlobDirectory;

                if (dir == null) continue;

                EventStoreId container;

                if (AzureEventStore.TryGetContainerName(_config, dir, out container))
                {
                    var value = AzureEventStore.OpenExistingForWriting(config, container);
                    _stores.Add(container.Name, value);
                }
                else
                {
                    Log.Info("Skipping invalid folder {0}", rootAzureContainer.Uri.MakeRelativeUri(dir.Uri));
                }
            }
        }
コード例 #4
0
 public AzureEventStoreClient(AzureStoreConfiguration config, EventStoreId storeId, string serverEndpoint = null)
     : base(storeId, serverEndpoint)
 {
     Config = config;
     _blob  = config.GetPageBlob(storeId.Name + "/stream.dat");
     _blob.Container.CreateIfNotExist();
 }
コード例 #5
0
        public static CloudPageBlob GetPageBlob(this AzureStoreConfiguration config, string blobAddress)
        {
            var account = CloudStorageAccount.Parse(config.ConnectionString);
            var client  = account.CreateCloudBlobClient();
            var path    = config.RootBlobContainerName + "/" + blobAddress.TrimStart('/');

            return(client.GetPageBlobReference(path));
        }
コード例 #6
0
 public static AzureEventStore OpenExistingForReading(AzureStoreConfiguration config, EventStoreId container)
 {
     var blob = config.GetPageBlob(container.Name + "/stream.dat");
     var check = AzureEventPointer.OpenReadable(blob);
     blob.FetchAttributes();
     var store = AzureEventStoreChunk.OpenExistingForReading(blob, blob.Properties.Length);
     return new AzureEventStore(container, store, check);
 }
コード例 #7
0
        public bool Execute(CommandProcessorContext context, CancellationToken token, string[] args)
        {
            // [abdullin]: we don't need checkpoint write flood (multi-threads)
            // since there is only one writer by default
            int repeat = 10000;

            if (args.Length > 0)
            {
                int.TryParse(args[0], out repeat);
            }

            const string            checkpointName = "epfl.chk";
            AzureStoreConfiguration configuration;
            var location = context.Client.Options.StoreLocation;

            if (AzureStoreConfiguration.TryParse(location, out configuration))
            {
                var container = CloudStorageAccount.Parse(configuration.ConnectionString)
                                .CreateCloudBlobClient()
                                .GetContainerReference(configuration.RootBlobContainerName);

                container.CreateIfNotExist();
                var blob = container.GetPageBlobReference(checkpointName);
                blob.Create(512);
                try
                {
                    using (var pointer = new TestAzurePointer(blob))
                    {
                        TestPointer(context, pointer, repeat, "page");
                    }
                    using (var pointer = AzureEventPointer.OpenWriteable(blob))
                    {
                        TestPointer(context, pointer, repeat, "meta");
                    }
                }
                finally
                {
                    blob.DeleteIfExists();
                }
            }
            else
            {
                var fullName = Path.Combine(location, checkpointName);

                try
                {
                    using (var openOrCreateForWriting = FileEventPointer.OpenOrCreateForWriting(fullName))
                    {
                        TestPointer(context, openOrCreateForWriting, repeat, "file");
                    }
                }
                finally
                {
                    File.Delete(fullName);
                }
            }
            return(true);
        }
コード例 #8
0
 public static AzureEventStore OpenExistingForWriting(AzureStoreConfiguration config, EventStoreId container)
 {
     var blob = config.GetPageBlob(container.Name + "/stream.dat");
     var check = AzureEventPointer.OpenWriteable(blob);
     var offset = check.Read();
     var length = blob.Properties.Length;
     var store = AzureEventStoreChunk.OpenExistingForWriting(blob, offset, length);
     return new AzureEventStore(container, store, check);
 }
コード例 #9
0
        public static AzureEventStore OpenExistingForWriting(AzureStoreConfiguration config, EventStoreId container)
        {
            var blob   = config.GetPageBlob(container.Name + "/stream.dat");
            var check  = AzureEventPointer.OpenWriteable(blob);
            var offset = check.Read();
            var length = blob.Properties.Length;
            var store  = AzureEventStoreChunk.OpenExistingForWriting(blob, offset, length);

            return(new AzureEventStore(container, store, check));
        }
コード例 #10
0
        public static AzureEventStore CreateNewForWriting(AzureStoreConfiguration config, EventStoreId container)
        {
            var blob = config.GetPageBlob(container.Name + "/stream.dat");
            blob.Container.CreateIfNotExist();

            var store = AzureEventStoreChunk.CreateNewForWriting(blob);
            var check = AzureEventPointer.OpenWriteable(blob);

            return new AzureEventStore(container, store, check);
        }
コード例 #11
0
        public static AzureEventStore OpenExistingForReading(AzureStoreConfiguration config, EventStoreId container)
        {
            var blob  = config.GetPageBlob(container.Name + "/stream.dat");
            var check = AzureEventPointer.OpenReadable(blob);

            blob.FetchAttributes();
            var store = AzureEventStoreChunk.OpenExistingForReading(blob, blob.Properties.Length);

            return(new AzureEventStore(container, store, check));
        }
コード例 #12
0
        public static NodeEntryPoint StartWithOptions(NodeOptions options, Action <int> termination)
        {
            var slim = new ManualResetEventSlim(false);
            var list = String.Join(Environment.NewLine,
                                   options.GetPairs().Select(p => String.Format("{0} : {1}", p.Key, p.Value)));

            Log.Info(list);

            var bus        = new InMemoryBus("OutputBus");
            var controller = new NodeController(bus);
            var mainQueue  = new QueuedHandler(controller, "Main Queue");

            controller.SetMainQueue(mainQueue);
            Application.Start(i =>
            {
                slim.Set();
                termination(i);
            });

            var http = new PlatformServerApiService(mainQueue, String.Format("http://{0}:{1}/", options.LocalHttpIp, options.HttpPort));

            bus.Subscribe <SystemMessage.Init>(http);
            bus.Subscribe <SystemMessage.StartShutdown>(http);


            var timer = new TimerService(new ThreadBasedScheduler(new RealTimeProvider()));

            bus.Subscribe <TimerMessage.Schedule>(timer);

            // switch, based on configuration
            AzureStoreConfiguration azureConfig;

            if (AzureStoreConfiguration.TryParse(options.StoreLocation, out azureConfig))
            {
                var storageService = new AzureStorageService(azureConfig, mainQueue);
                bus.Subscribe <ClientMessage.AppendEvents>(storageService);
                bus.Subscribe <SystemMessage.Init>(storageService);
                bus.Subscribe <ClientMessage.ImportEvents>(storageService);
                bus.Subscribe <ClientMessage.RequestStoreReset>(storageService);
            }
            else
            {
                var storageService = new FileStorageService(options.StoreLocation, mainQueue);
                bus.Subscribe <ClientMessage.AppendEvents>(storageService);
                bus.Subscribe <SystemMessage.Init>(storageService);
                bus.Subscribe <ClientMessage.ImportEvents>(storageService);
                bus.Subscribe <ClientMessage.RequestStoreReset>(storageService);
            }


            mainQueue.Start();

            mainQueue.Enqueue(new SystemMessage.Init());
            return(new NodeEntryPoint(mainQueue, slim));
        }
コード例 #13
0
        public static AzureEventStore CreateNewForWriting(AzureStoreConfiguration config, EventStoreId container)
        {
            var blob = config.GetPageBlob(container.Name + "/stream.dat");

            blob.Container.CreateIfNotExist();

            var store = AzureEventStoreChunk.CreateNewForWriting(blob);
            var check = AzureEventPointer.OpenWriteable(blob);

            return(new AzureEventStore(container, store, check));
        }
コード例 #14
0
        public static bool TryGetContainerName(
            AzureStoreConfiguration config, 
            CloudBlobDirectory dir,
            out EventStoreId container)
        {
            var topic = dir.Uri.ToString().Remove(0, dir.Container.Uri.ToString().Length).Trim('/');

            container = null;
            if (EventStoreId.IsValid(topic)!= EventStoreId.Rule.Valid)
                return false;
            container = EventStoreId.Parse(topic);
            return IsValid(config, container);
        }
コード例 #15
0
        public static bool TryGetContainerName
        (
            AzureStoreConfiguration config,
            CloudBlobDirectory dir,
            out EventStoreId container)
        {
            var topic = dir.Uri.ToString().Remove(0, dir.Container.Uri.ToString().Length).Trim('/');

            container = null;
            if (EventStoreId.IsValid(topic) != EventStoreId.Rule.Valid)
            {
                return(false);
            }
            container = EventStoreId.Parse(topic);
            return(IsValid(config, container));
        }
コード例 #16
0
 public static bool IsValid(AzureStoreConfiguration config, EventStoreId container)
 {
     var store = config.GetPageBlob(container.Name + "/stream.dat");
     return Exists(store);
 }
コード例 #17
0
        public static bool IsValid(AzureStoreConfiguration config, EventStoreId container)
        {
            var store = config.GetPageBlob(container.Name + "/stream.dat");

            return(Exists(store));
        }
コード例 #18
0
 public AzureStorageService(AzureStoreConfiguration config, IPublisher publisher)
 {
     _publisher = publisher;
     _config    = config;
 }