blob: 9ff262f8e639f949c031087cabac9b8536dd1aa8 [file] [log] [blame]
/*
* 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.common.util;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hudi.common.table.marker.MarkerType;
import org.apache.hudi.common.testutils.HoodieCommonTestHarness;
import org.apache.hudi.exception.HoodieException;
import org.apache.hudi.hadoop.fs.HadoopFSUtils;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import static org.apache.hudi.common.util.MarkerUtils.MARKER_TYPE_FILENAME;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
class TestMarkerUtils extends HoodieCommonTestHarness {
private FileSystem fs;
@BeforeEach
public void setup() {
initPath();
fs = HadoopFSUtils.getFs(basePath, new Configuration());
}
@Test
public void testReadMarkerType() throws IOException {
// mock markers file
String markerDir = this.basePath + "/.hoodie/.temp/testReadMarkerType/";
if (MarkerUtils.doesMarkerTypeFileExist(fs, markerDir)) {
MarkerUtils.deleteMarkerTypeFile(fs, markerDir);
}
try {
// marker file does not exist
assertEquals(Option.empty(), MarkerUtils.readMarkerType(fs, markerDir),
"File does not exist, should be empty");
// HUDI-6440: Fallback to default Marker Type if the content of marker file is empty
assertTrue(writeEmptyMarkerTypeToFile(fs, markerDir), "Failed to create empty marker type file");
assertEquals(Option.empty(), MarkerUtils.readMarkerType(fs, markerDir),
"File exists but empty, should be empty");
// marker type is DIRECT
MarkerUtils.deleteMarkerTypeFile(fs, markerDir);
MarkerUtils.writeMarkerTypeToFile(MarkerType.DIRECT, fs, markerDir);
assertEquals(Option.of(MarkerType.DIRECT), MarkerUtils.readMarkerType(fs, markerDir),
"File exists and contains DIRECT, should be DIRECT");
// marker type is TIMELINE_SERVER_BASED
MarkerUtils.deleteMarkerTypeFile(fs, markerDir);
MarkerUtils.writeMarkerTypeToFile(MarkerType.TIMELINE_SERVER_BASED, fs, markerDir);
assertEquals(Option.of(MarkerType.TIMELINE_SERVER_BASED), MarkerUtils.readMarkerType(fs, markerDir),
"File exists and contains TIMELINE_SERVER_BASED, should be TIMELINE_SERVER_BASED");
} finally {
MarkerUtils.deleteMarkerTypeFile(fs, markerDir);
}
}
private boolean writeEmptyMarkerTypeToFile(FileSystem fileSystem, String markerDir) {
Path markerTypeFilePath = new Path(markerDir, MARKER_TYPE_FILENAME);
try {
return fileSystem.createNewFile(markerTypeFilePath);
} catch (IOException e) {
throw new HoodieException("Failed to create marker type file " + markerTypeFilePath, e);
}
}
}