[GitHub] [hudi] yanghua commented on a change in pull request #1842: [HUDI-1037]Introduce a write committed callback hook
yanghua commented on a change in pull request #1842: URL: https://github.com/apache/hudi/pull/1842#discussion_r458873037 ## File path: hudi-client/src/main/java/org/apache/hudi/config/HoodieWriteCommitCallbackConfig.java ## @@ -0,0 +1,106 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + *http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hudi.config; + +import org.apache.hudi.common.config.DefaultHoodieConfig; + +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.Properties; + +/** + * Write callback related config. + */ +public class HoodieWriteCommitCallbackConfig extends DefaultHoodieConfig { + + public static final String CALLBACK_ON = "hoodie.write.commit.callback.on"; + public static final boolean DEFAULT_CALLBACK_ON = false; + + public static final String CALLBACK_CLASS_PROP = "hoodie.write.commit.callback.class"; + public static final String DEFAULT_CALLBACK_CLASS_PROP = "org.apache.hudi.callback.impl.HoodieWriteCommitHttpCallback"; Review comment: Ok, sounds good. ## File path: hudi-client/src/test/java/org/apache/hudi/testutils/HoodieWriteCommitTestHarness.java ## @@ -0,0 +1,92 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hudi.testutils; + +import org.apache.hudi.common.testutils.HoodieCommonTestHarness; +import org.apache.hudi.config.HoodieWriteCommitCallbackConfig; +import org.apache.hudi.config.HoodieWriteConfig; + +import java.io.IOException; + +/** + * The test harness for resource initialization and cleanup. + */ +public class HoodieWriteCommitTestHarness extends HoodieCommonTestHarness { Review comment: ditto ## File path: hudi-client/src/main/java/org/apache/hudi/callback/util/HoodieCommitCallbackFactory.java ## @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + *http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hudi.callback.util; + +import org.apache.hudi.callback.HoodieWriteCommitCallback; +import org.apache.hudi.common.util.ReflectionUtils; +import org.apache.hudi.common.util.StringUtils; +import org.apache.hudi.config.HoodieWriteConfig; +import org.apache.hudi.exception.HoodieCommitCallbackException; + +/** + * Factory help to create {@link HoodieWriteCommitCallback}. + */ +public class HoodieCommitCallbackFactory { + public static HoodieWriteCommitCallback create(HoodieWriteConfig config) { +String callbackClass = config.getCallbackClass(); +if (!StringUtils.isNullOrEmpty(callbackClass)) { + Object instance = ReflectionUtils.loadClass(callbackClass, config); + if (!(instance instanceof HoodieWriteCommitCallback)) { +throw new HoodieCommitCallbackException(callbackClass + " is not a
[GitHub] [hudi] yanghua commented on a change in pull request #1842: [HUDI-1037]Introduce a write committed callback hook
yanghua commented on a change in pull request #1842: URL: https://github.com/apache/hudi/pull/1842#discussion_r457769421 ## File path: hudi-client/src/main/java/org/apache/hudi/callback/HoodieWriteCommitCallback.java ## @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + *http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hudi.callback; + +/** + * A callback interface help to call back when a write commit completes successfully. + */ +public interface HoodieWriteCommitCallback { + + /** + * A callback method the user can implement to provide asynchronous handling of successful write. + * This method will be called when a write operation is committed successfully. + * + * @param commitTime commitTime which is successfully committed + */ + void call(String commitTime); Review comment: Can we provide both commit instant and table name? ## File path: hudi-client/src/main/java/org/apache/hudi/callback/common/HoodieBaseCommitCallbackMessage.java ## @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + *http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hudi.callback.common; + +import java.io.Serializable; + +/** + * Base callback message, which contains commitTime and tableName only for now. + */ +public class HoodieBaseCommitCallbackMessage implements Serializable { Review comment: If we provide the table name as a parameter in `HoodieWriteCommitCallback#call(...)`, then this class is not necessary, IMO. ## File path: hudi-client/src/main/java/org/apache/hudi/callback/client/http/HoodieWriteCallbackHttpClient.java ## @@ -0,0 +1,108 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hudi.callback.client.http; + +import org.apache.http.HttpHeaders; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.hudi.config.HoodieWriteCommitCallbackConfig; +import org.apache.hudi.config.HoodieWriteConfig; +import org.apache.log4j.LogManager; +import org.apache.log4j.Logger; + +import java.io.Closeable; +import java.io.IOException; +import java.util.Properties; + +/** + * Write commit callback http client. + */ +public class HoodieWriteCallbackHttpClient implements Closeable { + + private static final Logger LOG = LogManager.getLogger(HoodieWriteCallbackHttpClient.class); + + public static final String HEADER_KEY_API_KEY = "HUDI-CALLBACK-KEY"; + + private f