[
https://issues.apache.org/jira/browse/S2GRAPH-169?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16224463#comment-16224463
]
ASF GitHub Bot commented on S2GRAPH-169:
----------------------------------------
Github user daewon commented on the issue:
https://github.com/apache/incubator-s2graph/pull/126
Overall it seems to be a good refactoring to organize the layers.
During review, the [Q] Type parameter used for Storage Trait seems
unnecessary.
Because each RPC is used only in the concrete implementation and is not
exposed.
For the TypeParameter(Q) to be useful, some implementations(eg: FetchXXX)
should be provided using buildRequest.
I made a PR that removed it.
Please review.
[PR LINK](https://github.com/SteamShon/incubator-s2graph/pull/13)
> Separate multiple functionalities on Storage class into multiple Interface.
> ---------------------------------------------------------------------------
>
> Key: S2GRAPH-169
> URL: https://issues.apache.org/jira/browse/S2GRAPH-169
> Project: S2Graph
> Issue Type: Improvement
> Affects Versions: 0.2.1
> Reporter: DOYUNG YOON
> Assignee: DOYUNG YOON
> Fix For: 0.2.1
>
> Original Estimate: 168h
> Remaining Estimate: 168h
>
> h2. Background
> S2Graph has been used HBase as default storage layer from the beginning, but
> supporting more storage backend other than HBase has been discussed.
> Support for various storag backend is important, since users with different
> storage backend setup can try S2Graph as graph layer easily.
> h2. Problem Statement
> To add new storage backend into S2Graph, one have to extends Storage class.
> Current implementation on Storage class has following logical components.
> # Mutate: given KeyValue which is physical representation for Edge/Vertex,
> responsible to actually store them into physical storage backend using
> storage backend specific client.
> # Fetch: given QueryRequest/Vertex/Edge, fetch KeyValue from storage backend,
> then translate them into Edge/Vertex.
> # Write-Write Conflict Resolve: with storage backend that provide optimistic
> concurrency control, resolving write-write conflict on same SnapshotEdge with
> EdgeId to keep index edge consistent.
> # Serialize/Deserializer: given common representation for KeyValue,
> SKeyValue, translate them to/from actual physical storage backend’s KeyValue.
> Mutate require Serialize to convert SKeyValue to storage layer’s specific
> KeyValue, and Fetch require Deserialize to convert from storage backend
> specific KeyValue to common SKeyValue
> # Management: management storage backend’s resources such as client
> connection and tables.
> Current implementation does all above in one single class Storage, and it
> makes adding new storage backend hard since it is not clear what need to be
> override for new storage backend.
> Users who want to add new storage backend implementation need to go through
> lots of method which is not neccessery to be overrided, and it is also hard
> to test/debug new implementation.
> h2. Related Jiras
> S2GRAPH-1 Add Redis storage(Key/Value storage) engine for S2Graph
> S2GRAPH-166 Provide embeddable storage baackend using RocksDB.
> h2. Suggestion
> Explicitly separate functionalities on Storage class and make each
> functionalities testable.
> Overrall interface suggestion for Storage which orchestrate above
> functionalities.
> {noformat}
> abstract class Storage[Q](val graph: S2Graph,
> val config: Config) {
> /* Storage backend specific resource management */
> val management: StorageManagement
> /* Physically store given KeyValue into backend storage. */
> val mutator: StorageWritable
> /*
> * Given QueryRequest/Vertex/Edge, fetch KeyValue from storage
> * then convert them into Edge/Vertex
> */
> val fetcher: StorageReadable[Q]
> /*
> * Serialize Edge/Vertex, to common KeyValue, SKeyValue that
> * can be stored aligned to backend storage's physical schema.
> * Also Deserialize storage backend's KeyValue to SKeyValue.
> */
> val serDe: StorageSerDe
> /*
> * Common helper to translate SKeyValue to Edge/Vertex and vice versa.
> * Note that it require storage backend specific implementation for
> serialize/deserialize.
> */
> lazy val io: StorageIO = new StorageIO(graph, serDe)
> /*
> * Common helper to resolve write-write conflict on snapshot edge with same
> EdgeId.
> * Note that it require storage backend specific implementations for
> * all of StorageWritable, StorageReadable, StorageSerDe, StorageIO
> */
> lazy val conflictResolver: WriteWriteConflictResolver = new
> WriteWriteConflictResolver(graph, serDe, io, mutator, fetcher)
> }
> {noformat}
> By explicitly separate functionalities, each storage backend implementation
> explicitly knows what they need to implement. Also test can be easy. For
> example, one only need to initialize new implementation of StorageSerDe, not
> entire Storage to test if it’s serialize/deserialize works correctly.
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)