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