private BinaryUploadStream(IMongoCollection <ChunkMap> maps, IMongoCollection <Chunk> chunks, int maxChunkLength, NamedReaderWriterLock namedReaderWriterLock) { _maps = maps; _chunks = chunks; _maxChunkLength = maxChunkLength; _nrwl = namedReaderWriterLock; _writeBuffer = new byte[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); } }
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; }
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); }
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); }
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); }