mirror of
https://github.com/featurebasedb/featurebase.git
synced 2026-08-28 10:54:59 +00:00
This commit refactors the anti-entropy system to fetch data from all replicated blocks and only set/clear bits which deviate from the consensus between all blocks. An example of this is if 3 nodes had the following bits set for a single bitmap: Node A: 1 2 3 Node B: 2 4 Node C: 1 2 4 Then only bits which are set on a majority will be set. In this case bits 1, 2, & 4 are set but 3 only exists on a single node. The node performing the merge would then determine the following set/clear diffs for each node: Node A: clear(3), set(4) Node B: set(1) Node C: none Once the merge is performed and all nodes receive their diff instructions then the nodes will be in sync: Node A: 1 2 4 Node B: 1 2 4 Node C: 1 2 4 There still exists situations where bits can be reset. If Node A is up and Node B & C are down then Node A's bits will be reset once B & C come back online. We should add write consistency settings for incoming writes so that we can ensure that a quorum is written to before returning a success. This is outside the scope of this commit though.
92 lines
1.7 KiB
Protocol Buffer
92 lines
1.7 KiB
Protocol Buffer
package internal;
|
|
|
|
message Bitmap {
|
|
repeated Chunk Chunks = 1;
|
|
repeated Attr Attrs = 2;
|
|
}
|
|
|
|
message Chunk {
|
|
required uint64 Key = 1;
|
|
repeated uint64 Value = 2;
|
|
}
|
|
|
|
message Pair {
|
|
required uint64 Key = 1;
|
|
required uint64 Count = 2;
|
|
}
|
|
|
|
message Bit {
|
|
required uint64 BitmapID = 1;
|
|
required uint64 ProfileID = 2;
|
|
}
|
|
|
|
message Profile {
|
|
required uint64 ID = 1;
|
|
repeated Attr Attrs = 2;
|
|
}
|
|
|
|
message Attr {
|
|
required string Key = 1;
|
|
optional string StringValue = 2;
|
|
optional uint64 UintValue = 3;
|
|
optional bool BoolValue = 4;
|
|
}
|
|
|
|
message AttrMap {
|
|
repeated Attr Attrs = 1;
|
|
}
|
|
|
|
message QueryRequest {
|
|
required string DB = 1;
|
|
required string Query = 2;
|
|
repeated uint64 Slices = 3;
|
|
optional bool Profiles = 4;
|
|
optional int64 Timestamp = 5;
|
|
optional uint32 Quantum = 6;
|
|
optional bool Remote = 7;
|
|
}
|
|
|
|
message QueryResponse {
|
|
optional string Err = 1;
|
|
repeated QueryResult Results = 2;
|
|
repeated Profile Profiles = 3;
|
|
}
|
|
|
|
message QueryResult {
|
|
optional Bitmap Bitmap = 1;
|
|
optional uint64 N = 2;
|
|
repeated Pair Pairs = 3;
|
|
optional bool Changed = 4;
|
|
}
|
|
|
|
message ImportRequest {
|
|
required string DB = 1;
|
|
required string Frame = 2;
|
|
required uint64 Slice = 3;
|
|
repeated uint64 BitmapIDs = 4;
|
|
repeated uint64 ProfileIDs = 5;
|
|
}
|
|
|
|
message ImportResponse {
|
|
optional string Err = 1;
|
|
}
|
|
|
|
message BlockDataRequest {
|
|
required string DB = 1;
|
|
required string Frame = 2;
|
|
required uint64 Slice = 3;
|
|
required uint64 Block = 4;
|
|
}
|
|
|
|
message BlockDataResponse {
|
|
repeated uint64 BitmapIDs = 1;
|
|
repeated uint64 ProfileIDs = 2;
|
|
}
|
|
|
|
message Cache {
|
|
repeated uint64 BitmapIDs = 1;
|
|
}
|
|
|
|
message SliceMaxResponse {
|
|
required uint64 SliceMax = 1;
|
|
}
|