コード例 #1
0
ファイル: DiskChunkCache.cs プロジェクト: martindrlik/BTDB
        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);
        }
コード例 #2
0
            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);
            }
コード例 #3
0
ファイル: DiskChunkCache.cs プロジェクト: yardee/BTDB
        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);
        }
コード例 #4
0
            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);
                }
            }
コード例 #5
0
ファイル: DiskChunkCache.cs プロジェクト: Xamarui/BTDB
 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;
 }
コード例 #6
0
ファイル: DiskChunkCache.cs プロジェクト: Xamarui/BTDB
 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);
 }
コード例 #7
0
ファイル: ChunkStorageInKV.cs プロジェクト: Xamarui/BTDB
 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;
 }
コード例 #8
0
ファイル: ChunkStorageInKV.cs プロジェクト: Xamarui/BTDB
 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);
     }
 }