[CARBONDATA-2230]Add a path into table path to store lock files and delete useless segment lock files before loading
This closes #2045 Project: http://git-wip-us.apache.org/repos/asf/carbondata/repo Commit: http://git-wip-us.apache.org/repos/asf/carbondata/commit/0609fc52 Tree: http://git-wip-us.apache.org/repos/asf/carbondata/tree/0609fc52 Diff: http://git-wip-us.apache.org/repos/asf/carbondata/diff/0609fc52 Branch: refs/heads/carbonfile Commit: 0609fc52cdb472121aa93350925674cec194b068 Parents: dbec6f9 Author: Zhang Zhichao <[email protected]> Authored: Thu Mar 8 15:18:09 2018 +0800 Committer: Jacky Li <[email protected]> Committed: Mon Mar 19 00:16:13 2018 +0800 ---------------------------------------------------------------------- .../core/constants/CarbonCommonConstants.java | 11 +++++ .../core/datastore/impl/FileFactory.java | 12 +++++- .../carbondata/core/locks/CarbonLockUtil.java | 34 ++++++++++++++++ .../carbondata/core/locks/HdfsFileLock.java | 35 +++++++++------- .../carbondata/core/locks/LocalFileLock.java | 34 +++++++--------- .../carbondata/core/locks/S3FileLock.java | 42 +++++++++----------- .../carbondata/core/locks/ZooKeeperLocking.java | 7 ++-- .../statusmanager/SegmentStatusManager.java | 2 + .../carbondata/core/util/CarbonProperties.java | 20 ++++++++++ .../core/util/path/CarbonTablePath.java | 32 ++++++++++++++- .../org/apache/spark/util/AlterTableUtil.scala | 3 +- 11 files changed, 166 insertions(+), 66 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/carbondata/blob/0609fc52/core/src/main/java/org/apache/carbondata/core/constants/CarbonCommonConstants.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/carbondata/core/constants/CarbonCommonConstants.java b/core/src/main/java/org/apache/carbondata/core/constants/CarbonCommonConstants.java index b0e3536..1b135dc 100644 --- a/core/src/main/java/org/apache/carbondata/core/constants/CarbonCommonConstants.java +++ b/core/src/main/java/org/apache/carbondata/core/constants/CarbonCommonConstants.java @@ -1588,6 +1588,17 @@ public final class CarbonCommonConstants { public static final String CARBON_SHOW_DATAMAPS_DEFAULT = "true"; + /** + * Currently the segment lock files are not deleted immediately when unlock, + * this value indicates the number of hours the segment lock files will be preserved. + */ + @CarbonProperty + public static final String CARBON_SEGMENT_LOCK_FILES_PRESERVE_HOURS = + "carbon.segment.lock.files.preserve.hours"; + + // default value is 2 days + public static final String CARBON_SEGMENT_LOCK_FILES_PRESERVE_HOURS_DEFAULT = "48"; + private CarbonCommonConstants() { } } http://git-wip-us.apache.org/repos/asf/carbondata/blob/0609fc52/core/src/main/java/org/apache/carbondata/core/datastore/impl/FileFactory.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/carbondata/core/datastore/impl/FileFactory.java b/core/src/main/java/org/apache/carbondata/core/datastore/impl/FileFactory.java index ef84fb3..1529649 100644 --- a/core/src/main/java/org/apache/carbondata/core/datastore/impl/FileFactory.java +++ b/core/src/main/java/org/apache/carbondata/core/datastore/impl/FileFactory.java @@ -192,8 +192,7 @@ public final class FileFactory { } /** - * This method checks the given path exists or not and also is it file or - * not if the performFileCheck is true + * This method checks the given path exists or not. * * @param filePath - Path * @param fileType - FileType Local/HDFS @@ -202,6 +201,15 @@ public final class FileFactory { return getCarbonFile(filePath).isFileExist(filePath, fileType); } + /** + * This method checks the given path exists or not. + * + * @param filePath - Path + */ + public static boolean isFileExist(String filePath) throws IOException { + return isFileExist(filePath, getFileType(filePath)); + } + public static boolean createNewFile(String filePath, FileType fileType) throws IOException { return createNewFile(filePath, fileType, true, null); } http://git-wip-us.apache.org/repos/asf/carbondata/blob/0609fc52/core/src/main/java/org/apache/carbondata/core/locks/CarbonLockUtil.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/carbondata/core/locks/CarbonLockUtil.java b/core/src/main/java/org/apache/carbondata/core/locks/CarbonLockUtil.java index c399ef4..5ac2bc9 100644 --- a/core/src/main/java/org/apache/carbondata/core/locks/CarbonLockUtil.java +++ b/core/src/main/java/org/apache/carbondata/core/locks/CarbonLockUtil.java @@ -19,8 +19,13 @@ package org.apache.carbondata.core.locks; import org.apache.carbondata.common.logging.LogService; import org.apache.carbondata.common.logging.LogServiceFactory; +import org.apache.carbondata.core.datastore.filesystem.CarbonFile; +import org.apache.carbondata.core.datastore.filesystem.CarbonFileFilter; +import org.apache.carbondata.core.datastore.impl.FileFactory; import org.apache.carbondata.core.metadata.AbsoluteTableIdentifier; +import org.apache.carbondata.core.metadata.schema.table.CarbonTable; import org.apache.carbondata.core.util.CarbonProperties; +import org.apache.carbondata.core.util.path.CarbonTablePath; /** * This class contains all carbon lock utilities @@ -107,4 +112,33 @@ public class CarbonLockUtil { } } + /** + * Currently the segment lock files are not deleted immediately when unlock, + * so it needs to delete expired lock files before delete loads. + */ + public static void deleteExpiredSegmentLockFiles(CarbonTable carbonTable) { + final long currTime = System.currentTimeMillis(); + final long segmentLockFilesPreservTime = + CarbonProperties.getInstance().getSegmentLockFilesPreserveHours(); + AbsoluteTableIdentifier absoluteTableIdentifier = carbonTable.getAbsoluteTableIdentifier(); + String lockFilesDir = CarbonTablePath + .getLockFilesDirPath(absoluteTableIdentifier.getTablePath()); + CarbonFile[] files = FileFactory.getCarbonFile(lockFilesDir) + .listFiles(new CarbonFileFilter() { + + @Override public boolean accept(CarbonFile pathName) { + if (CarbonTablePath.isSegmentLockFilePath(pathName.getName())) { + if ((currTime - pathName.getLastModifiedTime()) > segmentLockFilesPreservTime) { + return true; + } + } + return false; + } + } + ); + + for (CarbonFile file : files) { + file.delete(); + } + } } http://git-wip-us.apache.org/repos/asf/carbondata/blob/0609fc52/core/src/main/java/org/apache/carbondata/core/locks/HdfsFileLock.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/carbondata/core/locks/HdfsFileLock.java b/core/src/main/java/org/apache/carbondata/core/locks/HdfsFileLock.java index be98f7d..3c28f9d 100644 --- a/core/src/main/java/org/apache/carbondata/core/locks/HdfsFileLock.java +++ b/core/src/main/java/org/apache/carbondata/core/locks/HdfsFileLock.java @@ -22,35 +22,38 @@ import java.io.IOException; import org.apache.carbondata.common.logging.LogService; import org.apache.carbondata.common.logging.LogServiceFactory; -import org.apache.carbondata.core.constants.CarbonCommonConstants; import org.apache.carbondata.core.datastore.impl.FileFactory; import org.apache.carbondata.core.metadata.AbsoluteTableIdentifier; +import org.apache.carbondata.core.util.path.CarbonTablePath; /** * This class is used to handle the HDFS File locking. - * This is acheived using the concept of acquiring the data out stream using Append option. + * This is achieved using the concept of acquiring the data out stream using Append option. */ public class HdfsFileLock extends AbstractCarbonLock { private static final LogService LOGGER = LogServiceFactory.getLogService(HdfsFileLock.class.getName()); /** - * location hdfs file location + * lockFilePath is the location of the lock file. */ - private String location; + private String lockFilePath; - private DataOutputStream dataOutputStream; + /** + * lockFileDir is the directory of the lock file. + */ + private String lockFileDir; - private static String tmpPath; + private DataOutputStream dataOutputStream; /** * @param lockFileLocation * @param lockFile */ public HdfsFileLock(String lockFileLocation, String lockFile) { - this.location = lockFileLocation - + CarbonCommonConstants.FILE_SEPARATOR + lockFile; - LOGGER.info("HDFS lock path:" + this.location); + this.lockFileDir = CarbonTablePath.getLockFilesDirPath(lockFileLocation); + this.lockFilePath = CarbonTablePath.getLockFilePath(lockFileLocation, lockFile); + LOGGER.info("HDFS lock path:" + this.lockFilePath); initRetry(); } @@ -58,7 +61,7 @@ public class HdfsFileLock extends AbstractCarbonLock { * @param lockFilePath */ public HdfsFileLock(String lockFilePath) { - this.location = lockFilePath; + this.lockFilePath = lockFilePath; initRetry(); } @@ -75,11 +78,15 @@ public class HdfsFileLock extends AbstractCarbonLock { */ @Override public boolean lock() { try { - if (!FileFactory.isFileExist(location, FileFactory.getFileType(location))) { - FileFactory.createNewLockFile(location, FileFactory.getFileType(location)); + if (null != this.lockFileDir && + !FileFactory.isFileExist(lockFileDir)) { + FileFactory.mkdirs(lockFileDir, FileFactory.getFileType(lockFileDir)); + } + if (!FileFactory.isFileExist(lockFilePath)) { + FileFactory.createNewLockFile(lockFilePath, FileFactory.getFileType(lockFilePath)); } - dataOutputStream = - FileFactory.getDataOutputStreamUsingAppend(location, FileFactory.getFileType(location)); + dataOutputStream = FileFactory.getDataOutputStreamUsingAppend(lockFilePath, + FileFactory.getFileType(lockFilePath)); return true; http://git-wip-us.apache.org/repos/asf/carbondata/blob/0609fc52/core/src/main/java/org/apache/carbondata/core/locks/LocalFileLock.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/carbondata/core/locks/LocalFileLock.java b/core/src/main/java/org/apache/carbondata/core/locks/LocalFileLock.java index e3b3126..6983562 100644 --- a/core/src/main/java/org/apache/carbondata/core/locks/LocalFileLock.java +++ b/core/src/main/java/org/apache/carbondata/core/locks/LocalFileLock.java @@ -26,10 +26,10 @@ import java.nio.file.StandardOpenOption; import org.apache.carbondata.common.logging.LogService; import org.apache.carbondata.common.logging.LogServiceFactory; -import org.apache.carbondata.core.constants.CarbonCommonConstants; import org.apache.carbondata.core.datastore.impl.FileFactory; import org.apache.carbondata.core.metadata.AbsoluteTableIdentifier; import org.apache.carbondata.core.util.CarbonUtil; +import org.apache.carbondata.core.util.path.CarbonTablePath; /** * This class handles the file locking in the local file system. @@ -37,9 +37,14 @@ import org.apache.carbondata.core.util.CarbonUtil; */ public class LocalFileLock extends AbstractCarbonLock { /** - * location is the location of the lock file. + * lockFilePath is the location of the lock file. */ - private String location; + private String lockFilePath; + + /** + * lockFileDir is the directory of the lock file. + */ + private String lockFileDir; /** * channel is the FileChannel of the lock file. @@ -52,27 +57,18 @@ public class LocalFileLock extends AbstractCarbonLock { private FileLock fileLock; /** - * lock file - */ - private String lockFile; - - private String lockFilePath; - - /** * LOGGER for logging the messages. */ private static final LogService LOGGER = LogServiceFactory.getLogService(LocalFileLock.class.getName()); - - /** * @param lockFileLocation * @param lockFile */ public LocalFileLock(String lockFileLocation, String lockFile) { - this.location = lockFileLocation; - this.lockFile = lockFile; + this.lockFileDir = CarbonTablePath.getLockFilesDirPath(lockFileLocation); + this.lockFilePath = CarbonTablePath.getLockFilePath(lockFileLocation, lockFile); initRetry(); } @@ -92,13 +88,11 @@ public class LocalFileLock extends AbstractCarbonLock { */ @Override public boolean lock() { try { - if (!FileFactory.isFileExist(location, FileFactory.getFileType(location))) { - FileFactory.mkdirs(location, FileFactory.getFileType(location)); + if (!FileFactory.isFileExist(lockFileDir)) { + FileFactory.mkdirs(lockFileDir, FileFactory.getFileType(lockFileDir)); } - lockFilePath = location + CarbonCommonConstants.FILE_SEPARATOR + - lockFile; - if (!FileFactory.isFileExist(lockFilePath, FileFactory.getFileType(location))) { - FileFactory.createNewLockFile(lockFilePath, FileFactory.getFileType(location)); + if (!FileFactory.isFileExist(lockFilePath)) { + FileFactory.createNewLockFile(lockFilePath, FileFactory.getFileType(lockFilePath)); } channel = FileChannel.open(Paths.get(lockFilePath), StandardOpenOption.WRITE, http://git-wip-us.apache.org/repos/asf/carbondata/blob/0609fc52/core/src/main/java/org/apache/carbondata/core/locks/S3FileLock.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/carbondata/core/locks/S3FileLock.java b/core/src/main/java/org/apache/carbondata/core/locks/S3FileLock.java index 8836960..464becb 100644 --- a/core/src/main/java/org/apache/carbondata/core/locks/S3FileLock.java +++ b/core/src/main/java/org/apache/carbondata/core/locks/S3FileLock.java @@ -22,10 +22,9 @@ import java.io.IOException; import org.apache.carbondata.common.logging.LogService; import org.apache.carbondata.common.logging.LogServiceFactory; -import org.apache.carbondata.core.constants.CarbonCommonConstants; -import org.apache.carbondata.core.datastore.filesystem.CarbonFile; import org.apache.carbondata.core.datastore.impl.FileFactory; import org.apache.carbondata.core.metadata.AbsoluteTableIdentifier; +import org.apache.carbondata.core.util.path.CarbonTablePath; /** * This class is used to handle the S3 File locking. @@ -36,9 +35,14 @@ public class S3FileLock extends AbstractCarbonLock { private static final LogService LOGGER = LogServiceFactory.getLogService(S3FileLock.class.getName()); /** - * location s3 file location + * lockFilePath is the location of the lock file. */ - private String location; + private String lockFilePath; + + /** + * lockFileDir is the directory of the lock file. + */ + private String lockFileDir; private DataOutputStream dataOutputStream; @@ -55,8 +59,9 @@ public class S3FileLock extends AbstractCarbonLock { * @param lockFile */ public S3FileLock(String lockFileLocation, String lockFile) { - this.location = lockFileLocation + CarbonCommonConstants.FILE_SEPARATOR + lockFile; - LOGGER.info("S3 lock path:" + this.location); + this.lockFileDir = CarbonTablePath.getLockFilesDirPath(lockFileLocation); + this.lockFilePath = CarbonTablePath.getLockFilePath(lockFileLocation, lockFile); + LOGGER.info("S3 lock path:" + this.lockFilePath); initRetry(); } @@ -71,21 +76,6 @@ public class S3FileLock extends AbstractCarbonLock { status = true; } catch (IOException e) { status = false; - } finally { - CarbonFile carbonFile = - FileFactory.getCarbonFile(location, FileFactory.getFileType(location)); - if (carbonFile.exists()) { - if (carbonFile.delete()) { - LOGGER.info("Deleted the lock file " + location); - } else { - LOGGER.error("Not able to delete the lock file " + location); - status = false; - } - } else { - LOGGER.error( - "Not able to delete the lock file because it is not existed in location " + location); - status = false; - } } } return status; @@ -96,11 +86,15 @@ public class S3FileLock extends AbstractCarbonLock { */ @Override public boolean lock() { try { - if (!FileFactory.isFileExist(location, FileFactory.getFileType(location))) { - FileFactory.createNewLockFile(location, FileFactory.getFileType(location)); + if (!FileFactory.isFileExist(lockFileDir)) { + FileFactory.mkdirs(lockFileDir, FileFactory.getFileType(lockFileDir)); + } + if (!FileFactory.isFileExist(lockFilePath)) { + FileFactory.createNewLockFile(lockFilePath, FileFactory.getFileType(lockFilePath)); } dataOutputStream = - FileFactory.getDataOutputStreamUsingAppend(location, FileFactory.getFileType(location)); + FileFactory.getDataOutputStreamUsingAppend(lockFilePath, + FileFactory.getFileType(lockFilePath)); return true; } catch (IOException e) { LOGGER.error(e, e.getMessage()); http://git-wip-us.apache.org/repos/asf/carbondata/blob/0609fc52/core/src/main/java/org/apache/carbondata/core/locks/ZooKeeperLocking.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/carbondata/core/locks/ZooKeeperLocking.java b/core/src/main/java/org/apache/carbondata/core/locks/ZooKeeperLocking.java index 1de5004..5a055ab 100644 --- a/core/src/main/java/org/apache/carbondata/core/locks/ZooKeeperLocking.java +++ b/core/src/main/java/org/apache/carbondata/core/locks/ZooKeeperLocking.java @@ -25,6 +25,7 @@ import org.apache.carbondata.common.logging.LogServiceFactory; import org.apache.carbondata.core.constants.CarbonCommonConstants; import org.apache.carbondata.core.metadata.AbsoluteTableIdentifier; import org.apache.carbondata.core.util.CarbonProperties; +import org.apache.carbondata.core.util.path.CarbonTablePath; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.KeeperException; @@ -88,12 +89,12 @@ public class ZooKeeperLocking extends AbstractCarbonLock { */ public ZooKeeperLocking(String lockLocation, String lockFile) { this.lockName = lockFile; - this.tableIdFolder = zooKeeperLocation + CarbonCommonConstants.FILE_SEPARATOR + lockLocation; + this.tableIdFolder = zooKeeperLocation + CarbonCommonConstants.FILE_SEPARATOR + + CarbonTablePath.getLockFilesDirPath(lockLocation); initialize(); - this.lockTypeFolder = zooKeeperLocation + CarbonCommonConstants.FILE_SEPARATOR + lockLocation - + CarbonCommonConstants.FILE_SEPARATOR + lockFile; + this.lockTypeFolder = tableIdFolder + CarbonCommonConstants.FILE_SEPARATOR + lockFile; try { createBaseNode(); // if exists returns null then path doesnt exist. so creating. http://git-wip-us.apache.org/repos/asf/carbondata/blob/0609fc52/core/src/main/java/org/apache/carbondata/core/statusmanager/SegmentStatusManager.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/carbondata/core/statusmanager/SegmentStatusManager.java b/core/src/main/java/org/apache/carbondata/core/statusmanager/SegmentStatusManager.java index f466018..aa73fee 100755 --- a/core/src/main/java/org/apache/carbondata/core/statusmanager/SegmentStatusManager.java +++ b/core/src/main/java/org/apache/carbondata/core/statusmanager/SegmentStatusManager.java @@ -909,6 +909,8 @@ public class SegmentStatusManager { } } } + // delete the expired segment lock files + CarbonLockUtil.deleteExpiredSegmentLockFiles(carbonTable); } } http://git-wip-us.apache.org/repos/asf/carbondata/blob/0609fc52/core/src/main/java/org/apache/carbondata/core/util/CarbonProperties.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/carbondata/core/util/CarbonProperties.java b/core/src/main/java/org/apache/carbondata/core/util/CarbonProperties.java index 6fd087b..acc266c 100644 --- a/core/src/main/java/org/apache/carbondata/core/util/CarbonProperties.java +++ b/core/src/main/java/org/apache/carbondata/core/util/CarbonProperties.java @@ -1382,4 +1382,24 @@ public final class CarbonProperties { return thresholdSize; } + /** + * Get the number of hours the segment lock files will be preserved. + * It will be converted to microseconds to return. + */ + public long getSegmentLockFilesPreserveHours() { + long preserveSeconds; + try { + int preserveHours = Integer.parseInt(CarbonProperties.getInstance() + .getProperty(CarbonCommonConstants.CARBON_SEGMENT_LOCK_FILES_PRESERVE_HOURS, + CarbonCommonConstants.CARBON_SEGMENT_LOCK_FILES_PRESERVE_HOURS_DEFAULT)); + preserveSeconds = preserveHours * 3600 * 1000L; + } catch (NumberFormatException exc) { + LOGGER.error( + "The segment lock files preserv hours is invalid. Using the default value " + + CarbonCommonConstants.CARBON_SEGMENT_LOCK_FILES_PRESERVE_HOURS_DEFAULT); + preserveSeconds = Integer.parseInt( + CarbonCommonConstants.CARBON_SEGMENT_LOCK_FILES_PRESERVE_HOURS_DEFAULT) * 3600 * 1000L; + } + return preserveSeconds; + } } http://git-wip-us.apache.org/repos/asf/carbondata/blob/0609fc52/core/src/main/java/org/apache/carbondata/core/util/path/CarbonTablePath.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/carbondata/core/util/path/CarbonTablePath.java b/core/src/main/java/org/apache/carbondata/core/util/path/CarbonTablePath.java index 50c5a31..a37d5cd 100644 --- a/core/src/main/java/org/apache/carbondata/core/util/path/CarbonTablePath.java +++ b/core/src/main/java/org/apache/carbondata/core/util/path/CarbonTablePath.java @@ -22,6 +22,7 @@ import org.apache.carbondata.core.constants.CarbonCommonConstants; import org.apache.carbondata.core.datastore.filesystem.CarbonFile; import org.apache.carbondata.core.datastore.filesystem.CarbonFileFilter; import org.apache.carbondata.core.datastore.impl.FileFactory; +import org.apache.carbondata.core.locks.LockUsage; import org.apache.carbondata.core.metadata.ColumnarFormatVersion; import org.apache.hadoop.fs.Path; @@ -41,6 +42,7 @@ public class CarbonTablePath { private static final String PARTITION_PREFIX = "Part"; private static final String DATA_PART_PREFIX = "part-"; private static final String BATCH_PREFIX = "_batchno"; + private static final String LOCK_DIR = "LockFiles"; public static final String TABLE_STATUS_FILE = "tablestatus"; public static final String CARBON_DATA_EXT = ".carbondata"; @@ -633,4 +635,32 @@ public class CarbonTablePath { return getMetadataPath(tablePath) + CarbonCommonConstants.FILE_SEPARATOR + "segments"; } -} \ No newline at end of file + /** + * Get the lock files directory + */ + public static String getLockFilesDirPath(String tablePath) { + return tablePath + CarbonCommonConstants.FILE_SEPARATOR + LOCK_DIR; + } + + /** + * Get the lock file + */ + public static String getLockFilePath(String tablePath, String lockType) { + return getLockFilesDirPath(tablePath) + CarbonCommonConstants.FILE_SEPARATOR + lockType; + } + + /** + * Get the segment lock file according to table path and segment load name + */ + public static String getSegmentLockFilePath(String tablePath, String loadName) { + return getLockFilesDirPath(tablePath) + CarbonCommonConstants.FILE_SEPARATOR + + addSegmentPrefix(loadName) + LockUsage.LOCK; + } + + /** + * return true if this lock file is a segment lock file otherwise false. + */ + public static boolean isSegmentLockFilePath(String lockFileName) { + return lockFileName.startsWith(SEGMENT_PREFIX) && lockFileName.endsWith(LockUsage.LOCK); + } +} http://git-wip-us.apache.org/repos/asf/carbondata/blob/0609fc52/integration/spark2/src/main/scala/org/apache/spark/util/AlterTableUtil.scala ---------------------------------------------------------------------- diff --git a/integration/spark2/src/main/scala/org/apache/spark/util/AlterTableUtil.scala b/integration/spark2/src/main/scala/org/apache/spark/util/AlterTableUtil.scala index 9c2c7e7..45e956a 100644 --- a/integration/spark2/src/main/scala/org/apache/spark/util/AlterTableUtil.scala +++ b/integration/spark2/src/main/scala/org/apache/spark/util/AlterTableUtil.scala @@ -113,8 +113,7 @@ object AlterTableUtil { tablePath: String): Unit = { val lockLocation = tablePath locks.zip(locksAcquired).foreach { case (carbonLock, lockType) => - val lockFilePath = lockLocation + CarbonCommonConstants.FILE_SEPARATOR + - lockType + val lockFilePath = CarbonTablePath.getLockFilePath(lockLocation, lockType) if (carbonLock.releaseLockManually(lockFilePath)) { LOGGER.info(s"Alter table lock released successfully: ${ lockType }") } else {
