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);
        }
示例#2
0
        internal async Task <string> DuplicateAsync(string id)
        {
            var lId2 = await _nrwl.AcquireWriterLockAsync($"{nameof(ChunkMap)}.{id}");

            var mapSearch = (await _maps.FindAsync(x => x.ID == id)).ToList();

            if (!mapSearch.Any())
            {
                await _nrwl.ReleaseLockAsync($"{nameof(ChunkMap)}.{id}", lId2);

                throw new MdbfsElementNotFoundException();
            } //not found

            var map  = mapSearch.First();
            var nMap = new ChunkMap {
                ChunksIDs = new List <string>(), Length = map.Length, Removed = false
            };
            var chunksSearch = await _chunks.FindAsync(Builders <Chunk> .Filter.Where(x => map.ChunksIDs.Contains(x.ID)));

            var nChunks = new List <Chunk>();

            foreach (var ch in chunksSearch.ToEnumerable())
            {
                nChunks.Add(new Chunk {
                    Bytes = ch.Bytes
                });
            }

            await _chunks.InsertManyAsync(nChunks);

            nChunks.ForEach(x => nMap.ChunksIDs.Add(x.ID));
            await _maps.InsertOneAsync(nMap);

            await _nrwl.ReleaseLockAsync($"{nameof(ChunkMap)}.{id}", lId2);

            return(nMap.ID);
        }
示例#3
0
        public async Task <Element> GetAsync(string id)
        {
            var lId = await _nrwl.AcquireReaderLockAsync($"{nameof(Files)}.{id}");

            var elemSearch = (await _elements.FindAsync(x => x.ID == id)).ToList();
            await _nrwl.ReleaseLockAsync($"{nameof(Files)}.{id}", lId);

            return(elemSearch.Count == 0 ? null : elemSearch.First());
        }