コード例 #1
0
 public void Put(byte[] key, byte[] value)
 {
     if (value == null)
     {
         try
         {
             db.Remove(key, columnFamilyHandle, writeOptions);
         }
         catch (RocksDbException e)
         {
             throw new ProcessorStateException($"Error while removing key from store {name}", e);
         }
     }
     else
     {
         try
         {
             db.Put(key, value, columnFamilyHandle, writeOptions);
         }
         catch (RocksDbException e)
         {
             throw new ProcessorStateException($"Error while putting key/value into store {name}", e);
         }
     }
 }
コード例 #2
0
ファイル: RocksDbStorage.cs プロジェクト: ocoanet/Zebus
        public Task Write(IList <MatcherEntry> entriesToPersist)
        {
            foreach (var entry in entriesToPersist)
            {
                var key = CreateKeyBuffer(entry.PeerId);
                FillKey(key, entry.PeerId, entry.MessageId.GetDateTime().Ticks, entry.MessageId.Value);
                if (entry.IsAck)
                {
                    // Ack
                    var bytes = _db.Get(key, _messagesColumnFamily);
                    if (bytes != null)
                    {
                        // Acked message
                        _db.Remove(key, _messagesColumnFamily);
                    }
                    else
                    {
                        // Ack before message
                        _outOfOrderAcks.TryAdd(entry.MessageId, default);
                        _db.Put(key, Array.Empty <byte>(), _acksColumnFamily);
                    }
                }
                else
                {
                    // Message
                    if (!_outOfOrderAcks.TryRemove(entry.MessageId, out _))
                    {
                        // Message before ack
                        _db.Put(key, entry.MessageBytes, _messagesColumnFamily);
                    }
                    else
                    {
                        // Otherwise ignore the message and remove the ack as it has already been acked
                        _db.Remove(key, _acksColumnFamily);
                    }
                }
            }

            foreach (var entry in entriesToPersist.GroupBy(x => x.PeerId))
            {
                UpdateNonAckedCounts(entry);
            }

            return(Task.CompletedTask);
        }