diff --git a/cameleer3-server-app/src/main/java/com/cameleer3/server/app/config/StorageBeanConfig.java b/cameleer3-server-app/src/main/java/com/cameleer3/server/app/config/StorageBeanConfig.java index 001f666e..06def6ba 100644 --- a/cameleer3-server-app/src/main/java/com/cameleer3/server/app/config/StorageBeanConfig.java +++ b/cameleer3-server-app/src/main/java/com/cameleer3/server/app/config/StorageBeanConfig.java @@ -110,8 +110,8 @@ public class StorageBeanConfig { WriteBuffer processorBatchBuffer, DiagramStore diagramStore) { return new ChunkAccumulator( - executionBuffer::offer, - processorBatchBuffer::offer, + executionBuffer::offerOrWarn, + processorBatchBuffer::offerOrWarn, diagramStore, java.time.Duration.ofMinutes(5)); } diff --git a/cameleer3-server-app/src/main/java/com/cameleer3/server/app/diagram/ElkDiagramRenderer.java b/cameleer3-server-app/src/main/java/com/cameleer3/server/app/diagram/ElkDiagramRenderer.java index e357711f..6c846f97 100644 --- a/cameleer3-server-app/src/main/java/com/cameleer3/server/app/diagram/ElkDiagramRenderer.java +++ b/cameleer3-server-app/src/main/java/com/cameleer3/server/app/diagram/ElkDiagramRenderer.java @@ -884,6 +884,7 @@ public class ElkDiagramRenderer implements DiagramRenderer { } private ElkNode getElkRoot(ElkNode node) { + if (node == null) return null; ElkNode current = node; while (current.getParent() != null) { current = current.getParent(); diff --git a/cameleer3-server-core/src/main/java/com/cameleer3/server/core/ingestion/WriteBuffer.java b/cameleer3-server-core/src/main/java/com/cameleer3/server/core/ingestion/WriteBuffer.java index 46a7be35..29450a72 100644 --- a/cameleer3-server-core/src/main/java/com/cameleer3/server/core/ingestion/WriteBuffer.java +++ b/cameleer3-server-core/src/main/java/com/cameleer3/server/core/ingestion/WriteBuffer.java @@ -38,6 +38,16 @@ public class WriteBuffer { return queue.offer(item); } + /** + * Offer an item, logging a warning if the buffer is full. + * Use this as a {@code Consumer} when the caller cannot handle backpressure. + */ + public void offerOrWarn(T item) { + if (!queue.offer(item)) { + log.warn("WriteBuffer full (capacity={}), item dropped", capacity); + } + } + /** * Offer a batch of items with all-or-nothing semantics. * If the buffer does not have enough remaining capacity for the entire batch,