@@ -96,36 +96,65 @@ impl Sharder {
96
96
}
97
97
98
98
#[ derive( Clone , Error , Debug ) ]
99
- pub enum ShardingError {
100
- #[ error( "ShardInfo parameters missing" ) ]
101
- MissingShardInfoParameter ,
102
- #[ error( "ShardInfo parameters missing after unwrapping" ) ]
103
- MissingUnwrapedShardInfoParameter ,
104
- #[ error( "ShardInfo contains an invalid number of shards (0)" ) ]
99
+ pub ( crate ) enum ShardingError {
100
+ /// This indicates that we are most likely connected to a Cassandra cluster.
101
+ /// Unless, there is some serious bug in Scylla.
102
+ #[ error( "Server did not provide any sharding information" ) ]
103
+ NoShardInfo ,
104
+
105
+ /// A bug in scylla. Some of the parameters are present, while others are missing.
106
+ #[ error( "Missing some sharding info parameters" ) ]
107
+ MissingSomeShardInfoParameters ,
108
+
109
+ /// A bug in Scylla. All parameters are present, but some do not contain any values.
110
+ #[ error( "Missing some sharding info parameter values" ) ]
111
+ MissingShardInfoParameterValues ,
112
+
113
+ /// A bug in Scylla. Number of shards is equal to zero.
114
+ #[ error( "Sharding info contains an invalid number of shards (0)" ) ]
105
115
ZeroShards ,
106
- #[ error( "ParseIntError encountered while getting ShardInfo" ) ]
116
+
117
+ /// A bug in Scylla. Failed to parse string to number.
118
+ #[ error( "Failed to parse a sharding info parameter's value: {0}" ) ]
107
119
ParseIntError ( #[ from] std:: num:: ParseIntError ) ,
108
120
}
109
121
122
+ const SHARD_ENTRY : & str = "SCYLLA_SHARD" ;
123
+ const NR_SHARDS_ENTRY : & str = "SCYLLA_NR_SHARDS" ;
124
+ const MSB_IGNORE_ENTRY : & str = "SCYLLA_SHARDING_IGNORE_MSB" ;
125
+
110
126
impl < ' a > TryFrom < & ' a HashMap < String , Vec < String > > > for ShardInfo {
111
127
type Error = ShardingError ;
112
128
fn try_from ( options : & ' a HashMap < String , Vec < String > > ) -> Result < Self , Self :: Error > {
113
- let shard_entry = options. get ( "SCYLLA_SHARD" ) ;
114
- let nr_shards_entry = options. get ( "SCYLLA_NR_SHARDS" ) ;
115
- let msb_ignore_entry = options. get ( "SCYLLA_SHARDING_IGNORE_MSB" ) ;
116
- if shard_entry. is_none ( ) || nr_shards_entry. is_none ( ) || msb_ignore_entry. is_none ( ) {
117
- return Err ( ShardingError :: MissingShardInfoParameter ) ;
118
- }
119
- if shard_entry. unwrap ( ) . is_empty ( )
120
- || nr_shards_entry. unwrap ( ) . is_empty ( )
121
- || msb_ignore_entry. unwrap ( ) . is_empty ( )
122
- {
123
- return Err ( ShardingError :: MissingUnwrapedShardInfoParameter ) ;
124
- }
125
- let shard = shard_entry. unwrap ( ) . first ( ) . unwrap ( ) . parse :: < u16 > ( ) ?;
126
- let nr_shards = nr_shards_entry. unwrap ( ) . first ( ) . unwrap ( ) . parse :: < u16 > ( ) ?;
129
+ let shard_entry = options. get ( SHARD_ENTRY ) ;
130
+ let nr_shards_entry = options. get ( NR_SHARDS_ENTRY ) ;
131
+ let msb_ignore_entry = options. get ( MSB_IGNORE_ENTRY ) ;
132
+
133
+ // Unwrap entries.
134
+ let ( shard_entry, nr_shards_entry, msb_ignore_entry) =
135
+ match ( shard_entry, nr_shards_entry, msb_ignore_entry) {
136
+ ( Some ( shard_entry) , Some ( nr_shards_entry) , Some ( msb_ignore_entry) ) => {
137
+ ( shard_entry, nr_shards_entry, msb_ignore_entry)
138
+ }
139
+ // All parameters are missing - most likely a Cassandra cluster.
140
+ ( None , None , None ) => return Err ( ShardingError :: NoShardInfo ) ,
141
+ // At least one of the parameters is present, but some are missing. A bug in Scylla.
142
+ _ => return Err ( ShardingError :: MissingSomeShardInfoParameters ) ,
143
+ } ;
144
+
145
+ // Further unwrap entries (they should be the first entries of their corresponding Vecs).
146
+ let ( Some ( shard_entry) , Some ( nr_shards_entry) , Some ( msb_ignore_entry) ) = (
147
+ shard_entry. first ( ) ,
148
+ nr_shards_entry. first ( ) ,
149
+ msb_ignore_entry. first ( ) ,
150
+ ) else {
151
+ return Err ( ShardingError :: MissingShardInfoParameterValues ) ;
152
+ } ;
153
+
154
+ let shard = shard_entry. parse :: < u16 > ( ) ?;
155
+ let nr_shards = nr_shards_entry. parse :: < u16 > ( ) ?;
127
156
let nr_shards = ShardCount :: new ( nr_shards) . ok_or ( ShardingError :: ZeroShards ) ?;
128
- let msb_ignore = msb_ignore_entry. unwrap ( ) . first ( ) . unwrap ( ) . parse :: < u8 > ( ) ?;
157
+ let msb_ignore = msb_ignore_entry. parse :: < u8 > ( ) ?;
129
158
Ok ( ShardInfo :: new ( shard, nr_shards, msb_ignore) )
130
159
}
131
160
}
0 commit comments