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); }
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); }
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()); }