public Task <ByteBuffer> Get(ByteBuffer key) { if (key.Length != _keySize) { throw new ArgumentException("Key has wrong Length not equal to KeySize"); } var tcs = new TaskCompletionSource <ByteBuffer>(); try { var k = new ByteStructs.Key20(key); CacheValue cacheValue; if (_cache.TryGetValue(k, out cacheValue)) { var newCacheValue = cacheValue; newCacheValue.AccessRate = cacheValue.AccessRate + 1; _cache.TryUpdate(k, newCacheValue, cacheValue); // It is not problem if update fails, it will have just lower access rate then real var result = new byte[cacheValue.ContentLength]; _fileCollection.GetFile(cacheValue.FileId).RandomRead(result.AsSpan(0, (int)cacheValue.ContentLength), cacheValue.FileOfs, false); tcs.SetResult(ByteBuffer.NewAsync(result)); return(tcs.Task); } } catch { } // It is better to return nothing than throw exception tcs.SetResult(ByteBuffer.NewEmpty()); return(tcs.Task); }
public Task <ByteBuffer> Get(ByteBuffer key) { _chunkStorageInKV.CheckOrInitKeyLen(key.Length); var tcs = new TaskCompletionSource <ByteBuffer>(); var key20 = new ByteStructs.Key20(key); var d = _chunkStorageInKV._dict20; StorageValue val; if (d.TryGetValue(key20, out val)) { var buf = new byte[val.ContentLength]; _chunkStorageInKV._fileCollection.GetFile(val.FileId).RandomRead(buf, 0, buf.Length, val.FileOfs, false); tcs.SetResult(ByteBuffer.NewAsync(buf)); } else { tcs.SetResult(ByteBuffer.NewEmpty()); } return(tcs.Task); }
public void Put(ByteBuffer key, ByteBuffer content) { if (key.Length != _keySize) { throw new ArgumentException("Key has wrong Length not equal to KeySize"); } if (content.Length == 0) { throw new ArgumentException("Empty Content cannot be stored"); } var k = new ByteStructs.Key20(key); if (_cache.TryGetValue(k, out var cacheValue)) { return; } cacheValue.AccessRate = 1; again: var writer = _cacheValueWriter; while (writer == null || writer.GetCurrentPositionWithoutWriter() + content.Length > _sizeLimitOfOneValueFile) { StartNewValueFile(); writer = _cacheValueWriter; } lock (writer) { if (writer != _cacheValueWriter) { goto again; } cacheValue.FileId = _cacheValueFileId; cacheValue.FileOfs = (uint)writer.GetCurrentPositionWithoutWriter(); var trueWriter = new SpanWriter(writer); trueWriter.WriteBlock(content); trueWriter.Sync(); _cacheValueFile !.Flush(); } cacheValue.ContentLength = (uint)content.Length; _cache.TryAdd(k, cacheValue); }
public void Put(ByteBuffer key, ByteBuffer content, bool isLeaf) { _chunkStorageInKV.CheckOrInitKeyLen(key.Length); var key20 = new ByteStructs.Key20(key); var d = _chunkStorageInKV._dict20; StorageValue val; again: if (d.TryGetValue(key20, out val)) { if (val.ContentLength != content.Length) { throw new InvalidOperationException("Hash collision or error in memory"); } if (!isLeaf && val.Leaf) { var newval = val; newval.Leaf = false; if (!d.TryUpdate(key20, newval, val)) { goto again; } lock (_chunkStorageInKV._pureValueFileLock) { _chunkStorageInKV.StoreHashUpdate(key, newval); } } return; } lock (_chunkStorageInKV._pureValueFileLock) { val = _chunkStorageInKV.StoreContent(content); val.Leaf = isLeaf; if (!d.TryAdd(key20, val)) { goto again; } _chunkStorageInKV.StoreHashUpdate(key, val); } }
public Task<ByteBuffer> Get(ByteBuffer key) { if (key.Length != _keySize) throw new ArgumentException("Key has wrong Length not equal to KeySize"); var tcs = new TaskCompletionSource<ByteBuffer>(); try { var k = new ByteStructs.Key20(key); CacheValue cacheValue; if (_cache.TryGetValue(k, out cacheValue)) { var newCacheValue = cacheValue; newCacheValue.AccessRate = cacheValue.AccessRate + 1; _cache.TryUpdate(k, newCacheValue, cacheValue); // It is not problem if update fails, it will have just lower access rate then real var result = new byte[cacheValue.ContentLength]; _fileCollection.GetFile(cacheValue.FileId).RandomRead(result, 0, (int)cacheValue.ContentLength, cacheValue.FileOfs); tcs.SetResult(ByteBuffer.NewAsync(result)); return tcs.Task; } } catch { } // It is better to return nothing than throw exception tcs.SetResult(ByteBuffer.NewEmpty()); return tcs.Task; }
public void Put(ByteBuffer key, ByteBuffer content) { if (key.Length != _keySize) throw new ArgumentException("Key has wrong Length not equal to KeySize"); if (content.Length == 0) throw new ArgumentException("Empty Content cannot be stored"); var k = new ByteStructs.Key20(key); CacheValue cacheValue; if (_cache.TryGetValue(k, out cacheValue)) { return; } cacheValue.AccessRate = 1; again: var writer = _cacheValueWriter; while (writer == null || writer.GetCurrentPosition() + content.Length > _sizeLimitOfOneValueFile) { StartNewValueFile(); writer = _cacheValueWriter; } lock (writer) { if (writer != _cacheValueWriter) goto again; cacheValue.FileId = _cacheValueFileId; cacheValue.FileOfs = (uint)_cacheValueWriter.GetCurrentPosition(); _cacheValueWriter.WriteBlock(content); } cacheValue.ContentLength = (uint)content.Length; _cache.TryAdd(k, cacheValue); }
public Task<ByteBuffer> Get(ByteBuffer key) { _chunkStorageInKV.CheckOrInitKeyLen(key.Length); var tcs = new TaskCompletionSource<ByteBuffer>(); var key20 = new ByteStructs.Key20(key); var d = _chunkStorageInKV._dict20; StorageValue val; if (d.TryGetValue(key20, out val)) { var buf = new byte[val.ContentLength]; _chunkStorageInKV._fileCollection.GetFile(val.FileId).RandomRead(buf, 0, buf.Length, val.FileOfs); tcs.SetResult(ByteBuffer.NewAsync(buf)); } else { tcs.SetResult(ByteBuffer.NewEmpty()); } return tcs.Task; }
public void Put(ByteBuffer key, ByteBuffer content, bool isLeaf) { _chunkStorageInKV.CheckOrInitKeyLen(key.Length); var key20 = new ByteStructs.Key20(key); var d = _chunkStorageInKV._dict20; StorageValue val; again: if (d.TryGetValue(key20, out val)) { if (val.ContentLength != content.Length) throw new InvalidOperationException("Hash collision or error in memory"); if (!isLeaf && val.Leaf) { var newval = val; newval.Leaf = false; if (!d.TryUpdate(key20, newval, val)) goto again; lock (_chunkStorageInKV._pureValueFileLock) { _chunkStorageInKV.StoreHashUpdate(key, newval); } } return; } lock (_chunkStorageInKV._pureValueFileLock) { val = _chunkStorageInKV.StoreContent(content); val.Leaf = isLeaf; if (!d.TryAdd(key20, val)) { goto again; } _chunkStorageInKV.StoreHashUpdate(key, val); } }