Ejemplo n.º 1
0
 private BinaryUploadStream(IMongoCollection <ChunkMap> maps, IMongoCollection <Chunk> chunks, int maxChunkLength,
                            NamedReaderWriterLock namedReaderWriterLock)
 {
     _maps           = maps;
     _chunks         = chunks;
     _maxChunkLength = maxChunkLength;
     _nrwl           = namedReaderWriterLock;
     _writeBuffer    = new byte[0];
 }
Ejemplo n.º 2
0
        public Files(IMongoCollection <Element> elements, int binaryStorageBufferLength = 1024, int chunkSize = 1048576)
        {
            _elements      = elements;
            _nrwl          = new NamedReaderWriterLock();
            _binaryStorage = new BinaryStorageClient(_nrwl, elements.Database, binaryStorageBufferLength, chunkSize);
            var tmp0 = _binaryStorage.CleanUpErrors();

            foreach (var map in tmp0)
            {
                _elements.DeleteOne(x => x.ID == map.ID);
            }
        }
Ejemplo n.º 3
0
        public BinaryStorageClient(NamedReaderWriterLock nrwl, IMongoDatabase database,
                                   int bufforLength = 1024, int maxChunkLength = 1048576)
        {
            //set database

            //set collections
            _chunks = database.GetCollection <Chunk>(nameof(MDBFS) + '.' + nameof(Filesystem) + '.' +
                                                     nameof(BinaryStorageClient) + nameof(_chunks));
            _maps = database.GetCollection <ChunkMap>(nameof(MDBFS) + '.' + nameof(Filesystem) + '.' +
                                                      nameof(BinaryStorageClient) + nameof(_maps));

            _bufforLength   = bufforLength;
            _maxChunkLenght = maxChunkLength;
            _nrwl           = nrwl;
        }
Ejemplo n.º 4
0
        private static (bool success, ChunkMap map) CreateNewElement(IMongoCollection <ChunkMap> maps, string id, NamedReaderWriterLock nrwl)
        {
            var map = new ChunkMap {
                ID = id, ChunksIDs = new List <string>(), Length = 0
            };
            var lId = nrwl.AcquireReaderLock($"{nameof(ChunkMap)}.{id}");

            using var session = maps.Database.Client.StartSession();
            session.StartTransaction();
            try
            {
                if (id != null)
                {
                    if (!maps.Find(x => x.ID == id).Any())
                    {
                        map.ID = id;
                    }
                    else
                    {
                        session.AbortTransaction();
                        nrwl.ReleaseLock($"{nameof(ChunkMap)}.{id}", lId);
                        return(false, null);
                    }
                }

                maps.InsertOne(map);

                session.CommitTransaction();
                nrwl.ReleaseLock($"{nameof(ChunkMap)}.{id}", lId);
                return(true, map);
            }
            catch
            {
                nrwl.ReleaseLock($"{nameof(ChunkMap)}.{id}", lId);
            }

            session.AbortTransaction();
            nrwl.ReleaseLock($"{nameof(ChunkMap)}.{id}", lId);
            return(false, null);
        }
Ejemplo n.º 5
0
        public static async Task <(bool success, BinaryUploadStream stream)> OpenAsync(IMongoCollection <ChunkMap> maps,
                                                                                       IMongoCollection <Chunk> chunks, int maxChunkLenght, string id, NamedReaderWriterLock namedReaderWriterLock)
        {
            if (id != null)
            {
            }
            var(success, map) = await CreateNewElementAsync(maps, id, namedReaderWriterLock);

            if (!success)
            {
                return(false, null);
            }

            var stream = new BinaryUploadStream(maps, chunks, maxChunkLenght, namedReaderWriterLock)
            {
                _map = map
            };

            stream._nrwlID = await namedReaderWriterLock.AcquireWriterLockAsync($"{nameof(Chunk)}.{map.ID}");

            return(true, stream);
        }
Ejemplo n.º 6
0
        private static async Task <(bool success, ChunkMap map)> CreateNewElementAsync(IMongoCollection <ChunkMap> maps,
                                                                                       string id, NamedReaderWriterLock nrwl)
        {
            var map = new ChunkMap {
                ID = id, ChunksIDs = new List <string>(), Length = 0
            };
            var lId = await nrwl.AcquireReaderLockAsync($"{nameof(ChunkMap)}.{id}");

            using var session = await maps.Database.Client.StartSessionAsync();

            session.StartTransaction();
            try
            {
                if (id != null)
                {
                    if (!await(await maps.FindAsync(x => x.ID == id)).AnyAsync())
                    {
                        map.ID = id;
                    }
                    else
                    {
                        await nrwl.ReleaseLockAsync($"{nameof(ChunkMap)}.{id}", lId);

                        return(false, null);
                    }
                }

                await maps.InsertOneAsync(map);

                await session.CommitTransactionAsync();

                await nrwl.ReleaseLockAsync($"{nameof(ChunkMap)}.{id}", lId);

                return(true, map);
            }
            catch (Exception)
            {
                await nrwl.ReleaseLockAsync($"{nameof(ChunkMap)}.{id}", lId);
            }

            await session.AbortTransactionAsync();

            await nrwl.ReleaseLockAsync($"{nameof(ChunkMap)}.{id}", lId);

            return(false, null);
        }