blob: 565b257607f145b8d801a81bdd7a18e06c8d8f3c [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.iotdb.db.utils;
import org.apache.iotdb.db.sync.conf.SyncSenderDescriptor;
import java.io.File;
import java.text.DecimalFormat;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class SyncUtils {
private static final String IP_SEPARATOR = "\\.";
private SyncUtils() {}
/**
* This method is to get a snapshot file seriesPath according to a tsfile seriesPath. Due to
* multiple directories, it's necessary to make a snapshot in the same disk. It's used by sync
* sender.
*/
public static File getSnapshotFile(File file) {
String relativeFilePath =
file.getParentFile().getParentFile().getParentFile().getName()
+ File.separator
+ file.getParentFile().getParentFile().getName()
+ File.separator
+ file.getParentFile().getName()
+ File.separator
+ file.getName();
String snapshotDir = SyncSenderDescriptor.getInstance().getConfig().getSnapshotPath();
if (!new File(snapshotDir).exists()) {
new File(snapshotDir).mkdirs();
}
return new File(snapshotDir, relativeFilePath);
}
/** Verify sending list is empty or not It's used by sync sender. */
public static boolean isEmpty(Map<String, Map<Long, Map<Long, Set<File>>>> sendingFileList) {
for (Entry<String, Map<Long, Map<Long, Set<File>>>> entry : sendingFileList.entrySet()) {
for (Entry<Long, Map<Long, Set<File>>> vgEntry : entry.getValue().entrySet()) {
for (Entry<Long, Set<File>> innerEntry : vgEntry.getValue().entrySet()) {
if (!innerEntry.getValue().isEmpty()) {
return false;
}
}
}
}
return true;
}
/**
* Verify IP address with IP white list which contains more than one IP segment. It's used by sync
* sender.
*/
public static boolean verifyIPSegment(String ipWhiteList, String ipAddress) {
String[] ipSegments = ipWhiteList.split(",");
for (String IPsegment : ipSegments) {
int subnetMask = Integer.parseInt(IPsegment.substring(IPsegment.indexOf('/') + 1));
IPsegment = IPsegment.substring(0, IPsegment.indexOf('/'));
if (verifyIP(IPsegment, ipAddress, subnetMask)) {
return true;
}
}
return false;
}
/** Verify IP address with IP segment. */
private static boolean verifyIP(String ipSegment, String ipAddress, int subnetMark) {
String ipSegmentBinary;
String ipAddressBinary;
String[] ipSplits = ipSegment.split(IP_SEPARATOR);
DecimalFormat df = new DecimalFormat("00000000");
StringBuilder ipSegmentBuilder = new StringBuilder();
for (String IPsplit : ipSplits) {
ipSegmentBuilder.append(
df.format(Integer.parseInt(Integer.toBinaryString(Integer.parseInt(IPsplit)))));
}
ipSegmentBinary = ipSegmentBuilder.toString();
ipSegmentBinary = ipSegmentBinary.substring(0, subnetMark);
ipSplits = ipAddress.split(IP_SEPARATOR);
StringBuilder ipAddressBuilder = new StringBuilder();
for (String IPsplit : ipSplits) {
ipAddressBuilder.append(
df.format(Integer.parseInt(Integer.toBinaryString(Integer.parseInt(IPsplit)))));
}
ipAddressBinary = ipAddressBuilder.toString();
ipAddressBinary = ipAddressBinary.substring(0, subnetMark);
return ipAddressBinary.equals(ipSegmentBinary);
}
}