[ https://issues.apache.org/jira/browse/IGNITE-15434?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17420884#comment-17420884 ]
Konstantin Orlov commented on IGNITE-15434: ------------------------------------------- [~alapin], another bunch of comments is waiting for you :) > Implement cursor for partitions > ------------------------------- > > Key: IGNITE-15434 > URL: https://issues.apache.org/jira/browse/IGNITE-15434 > Project: Ignite > Issue Type: Improvement > Reporter: Alexander Lapin > Assignee: Alexander Lapin > Priority: Major > Labels: ignite-3 > Time Spent: 2h 50m > Remaining Estimate: 0h > > In order to unblock sql activities in required to have partition scanning > logic. Simple approach would be similar to meta storage range command: > cursors on the client side with corresponding raft commands that will manage > server side storage cursors. However given approach has some disadvantages, > for example, cursor's hasNext(), next(), close() etc are blocking by design > so it might lead (and as it's seen with Meta storage range will lead) to a > deadlock if response retrieval logic is blocked by synchronous get on hasNext > or similar. In order to overcome given issue we might use unblocking cursors > based on reactive flow model. It actually means that client side range/scan > should provide Publisher instance*.* > *Implementation details:* > Within InternalTable class new method was introduced: > {code:java} > /** > * Scans given partition, providing {@link Publisher<BinaryRow>} that > reflectively notifies about partition rows. > * @param p The partition. > * @param tx The transaction. > * @return {@link Publisher<BinaryRow>} t{@link Publisher<BinaryRow>} that > reflectively notifies about partition rows. > */ > @NotNull Publisher<BinaryRow> scan(int p, @Nullable Transaction tx); > {code} > Core publisher logic is implemented inside: > {code:java} > InternalTableImpl.PartitionScanPublisher.PartitionScanSubscription#PartitionScanSubscription > {code} > Please pay attention that inner batching logic is not implemented. > PartitionScanSubscription will request same amount of entries from Storage as > it was specified within subscription.request(). Seems that it doesn't worth > to implement it right now cause event reactive model wasn't approved yet. > Three new partition raft commands and corresponding handlers were added: > * ScanInitCommand > * ScanRetrieveBatchCommand > * ScanCloseCommand > All given commands are write ones, so it'll lead to full scan replication > over raft nodes. On the one hand such approach leads to transparent remapping > logic that eases sql quey processing logic in case of raft leadership > changes, on the other hand it requires more time for replication and more > space within raft log for such commands. In future such strong restrictions > might be be weakened. > -- This message was sent by Atlassian Jira (v8.3.4#803005)