Skip to content

Commit 4b50846

Browse files
committed
new trait
1 parent 8a6de63 commit 4b50846

File tree

5 files changed

+37
-10
lines changed

5 files changed

+37
-10
lines changed

src/connector/src/macros.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -319,8 +319,8 @@ macro_rules! impl_connector_properties {
319319

320320
$crate::paste! {
321321
impl ConnectorProperties {
322-
pub async fn create_split_enumerator(self, context: $crate::source::base::SourceEnumeratorContextRef) -> $crate::error::ConnectorResult<Box<dyn SplitEnumerator>> {
323-
let enumerator: Box<dyn SplitEnumerator> = match self {
322+
pub async fn create_split_enumerator(self, context: $crate::source::base::SourceEnumeratorContextRef) -> $crate::error::ConnectorResult<Box<dyn AnySplitEnumerator>> {
323+
let enumerator: Box<dyn AnySplitEnumerator> = match self {
324324
$(
325325
ConnectorProperties::$variant_name(prop) =>
326326
Box::new(prop.create_split_enumerator(context).await?),

src/connector/src/source/base.rs

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ pub trait SourceProperties: TryFromBTreeMap + Clone + WithOptions + std::fmt::De
8181
type Split: SplitMetaData
8282
+ TryFrom<SplitImpl, Error = crate::error::ConnectorError>
8383
+ Into<SplitImpl>;
84-
type SplitEnumerator;
84+
type SplitEnumerator: SplitEnumerator<Properties = Self, Split = Self::Split>;;
8585
type SplitReader: SplitReader<Split = Self::Split, Properties = Self>;
8686

8787
/// Load additional info from `PbSource`. Currently only used by CDC.
@@ -190,13 +190,34 @@ pub async fn create_split_readers<P: SourceProperties>(
190190
/// [`SplitEnumerator`] fetches the split metadata from the external source service.
191191
/// NOTE: It runs in the meta server, so probably it should be moved to the `meta` crate.
192192
#[async_trait]
193-
pub trait SplitEnumerator: Send {
194-
async fn list_splits(&mut self) -> Result<Vec<SplitImpl>>;
193+
pub trait SplitEnumerator: Sized {
194+
type Split: SplitMetaData + Into<SplitImpl> + Send;
195+
type Properties;
196+
197+
async fn new(properties: Self::Properties, context: SourceEnumeratorContextRef)
198+
-> Result<Self>;
199+
async fn list_splits(&mut self) -> Result<Vec<Self::Split>>;
195200
}
196201

197202
pub type SourceContextRef = Arc<SourceContext>;
198203
pub type SourceEnumeratorContextRef = Arc<SourceEnumeratorContext>;
199204

205+
/// Dyn-compatible [`SplitEnumerator`].
206+
#[async_trait]
207+
pub trait AnySplitEnumerator: Send {
208+
async fn list_splits(&mut self) -> Result<Vec<SplitImpl>>;
209+
}
210+
211+
#[async_trait]
212+
impl<T: SplitEnumerator> AnySplitEnumerator for T {
213+
async fn list_splits(&mut self) -> Result<Vec<SplitImpl>> {
214+
(self as &mut dyn SplitEnumerator)
215+
.list_splits()
216+
.await
217+
.map(|s| s.into_iter().map(|s| s.into()).collect())
218+
}
219+
}
220+
200221
/// The max size of a chunk yielded by source stream.
201222
pub const MAX_CHUNK_SIZE: usize = 1024;
202223

src/meta/service/src/cloud_service.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ use std::sync::LazyLock;
1818
use async_trait::async_trait;
1919
use regex::Regex;
2020
use risingwave_connector::error::ConnectorResult;
21-
use risingwave_connector::source::{ConnectorProperties, SourceEnumeratorContext, SplitEnumerator};
21+
use risingwave_connector::source::{
22+
AnySplitEnumerator, ConnectorProperties, SourceEnumeratorContext, SplitEnumerator,
23+
};
2224
use risingwave_connector::WithOptionsSecResolved;
2325
use risingwave_pb::cloud_service::cloud_service_server::CloudService;
2426
use risingwave_pb::cloud_service::rw_cloud_validate_source_response::{Error, ErrorType};
@@ -78,7 +80,7 @@ impl CloudService for CloudServiceImpl {
7880

7981
async fn new_enumerator(
8082
props: ConnectorProperties,
81-
) -> ConnectorResult<Box<dyn SplitEnumerator>> {
83+
) -> ConnectorResult<Box<dyn AnySplitEnumerator>> {
8284
props
8385
.create_split_enumerator(SourceEnumeratorContext::dummy().into())
8486
.await

src/meta/src/rpc/ddl_controller.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ use risingwave_common::util::stream_graph_visitor::{
3232
use risingwave_common::{bail, bail_not_implemented, hash, must_match};
3333
use risingwave_connector::connector_common::validate_connection;
3434
use risingwave_connector::error::ConnectorError;
35-
use risingwave_connector::source::{ConnectorProperties, SourceEnumeratorContext, SplitEnumerator};
35+
use risingwave_connector::source::{
36+
AnySplitEnumerator, ConnectorProperties, SourceEnumeratorContext, SplitEnumerator,
37+
};
3638
use risingwave_connector::WithOptionsSecResolved;
3739
use risingwave_meta_model::object::ObjectType;
3840
use risingwave_meta_model::{
@@ -651,7 +653,7 @@ impl DdlController {
651653

652654
async fn new_enumerator_for_validate(
653655
source_props: ConnectorProperties,
654-
) -> Result<Box<dyn SplitEnumerator>, ConnectorError> {
656+
) -> Result<Box<dyn AnySplitEnumerator>, ConnectorError> {
655657
source_props
656658
.create_split_enumerator(SourceEnumeratorContext::dummy().into())
657659
.await

src/meta/src/stream/source_manager/worker.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15+
use risingwave_connector::source::AnySplitEnumerator;
16+
1517
use super::*;
1618

1719
const MAX_FAIL_CNT: u32 = 10;
@@ -30,7 +32,7 @@ pub struct ConnectorSourceWorker {
3032
source_name: String,
3133
current_splits: SharedSplitMapRef,
3234
// XXX: box or arc?
33-
enumerator: Box<dyn SplitEnumerator>,
35+
enumerator: Box<dyn AnySplitEnumerator>,
3436
period: Duration,
3537
metrics: Arc<MetaMetrics>,
3638
connector_properties: ConnectorProperties,

0 commit comments

Comments
 (0)