HADOOP-16108. Tail Follow Interval Should Allow To Specify The Sleep Interval To Save Unnecessary RPC's. Contributed by Ayush Saxena.
This commit is contained in:
parent
cf4aeccfa0
commit
00c5ffaee2
|
@ -28,6 +28,8 @@ import org.apache.hadoop.fs.FSDataInputStream;
|
||||||
import org.apache.hadoop.fs.PathIsDirectoryException;
|
import org.apache.hadoop.fs.PathIsDirectoryException;
|
||||||
import org.apache.hadoop.io.IOUtils;
|
import org.apache.hadoop.io.IOUtils;
|
||||||
|
|
||||||
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a listing of all files in that match the file patterns.
|
* Get a listing of all files in that match the file patterns.
|
||||||
*/
|
*/
|
||||||
|
@ -40,20 +42,37 @@ class Tail extends FsCommand {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final String NAME = "tail";
|
public static final String NAME = "tail";
|
||||||
public static final String USAGE = "[-f] <file>";
|
public static final String USAGE = "[-f] [-s <sleep interval>] <file>";
|
||||||
public static final String DESCRIPTION =
|
public static final String DESCRIPTION =
|
||||||
"Show the last 1KB of the file.\n" +
|
"Show the last 1KB of the file.\n"
|
||||||
"-f: Shows appended data as the file grows.\n";
|
+ "-f: Shows appended data as the file grows.\n"
|
||||||
|
+ "-s: With -f , "
|
||||||
|
+ "defines the sleep interval between iterations in milliseconds.\n";
|
||||||
|
|
||||||
private long startingOffset = -1024;
|
private long startingOffset = -1024;
|
||||||
private boolean follow = false;
|
private boolean follow = false;
|
||||||
private long followDelay = 5000; // milliseconds
|
private long followDelay = 5000; // milliseconds
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
public long getFollowDelay() {
|
||||||
|
return followDelay;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void processOptions(LinkedList<String> args) throws IOException {
|
protected void processOptions(LinkedList<String> args) throws IOException {
|
||||||
CommandFormat cf = new CommandFormat(1, 1, "f");
|
CommandFormat cf = new CommandFormat(1, 1, "f");
|
||||||
|
cf.addOptionWithValue("s");
|
||||||
cf.parse(args);
|
cf.parse(args);
|
||||||
follow = cf.getOpt("f");
|
follow = cf.getOpt("f");
|
||||||
|
if (follow) {
|
||||||
|
String sleep = cf.getOptValue("s");
|
||||||
|
if (sleep != null && !sleep.isEmpty()) {
|
||||||
|
long sleepInterval = Long.parseLong(sleep);
|
||||||
|
if (sleepInterval > 0) {
|
||||||
|
followDelay = sleepInterval;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: HADOOP-7234 will add glob support; for now, be backwards compat
|
// TODO: HADOOP-7234 will add glob support; for now, be backwards compat
|
||||||
|
|
|
@ -0,0 +1,57 @@
|
||||||
|
/**
|
||||||
|
* 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.hadoop.fs.shell;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class to verify Tail shell command.
|
||||||
|
*/
|
||||||
|
public class TestTail {
|
||||||
|
|
||||||
|
// check follow delay with -s parameter.
|
||||||
|
@Test
|
||||||
|
public void testSleepParameter() throws IOException {
|
||||||
|
Tail tail = new Tail();
|
||||||
|
LinkedList<String> options = new LinkedList<String>();
|
||||||
|
options.add("-f");
|
||||||
|
options.add("-s");
|
||||||
|
options.add("10000");
|
||||||
|
options.add("/path");
|
||||||
|
tail.processOptions(options);
|
||||||
|
assertEquals(10000, tail.getFollowDelay());
|
||||||
|
}
|
||||||
|
|
||||||
|
// check follow delay without -s parameter.
|
||||||
|
@Test
|
||||||
|
public void testFollowParameter() throws IOException {
|
||||||
|
Tail tail = new Tail();
|
||||||
|
LinkedList<String> options = new LinkedList<String>();
|
||||||
|
options.add("-f");
|
||||||
|
options.add("/path");
|
||||||
|
tail.processOptions(options);
|
||||||
|
// Follow delay should be the default 5000 ms.
|
||||||
|
assertEquals(5000, tail.getFollowDelay());
|
||||||
|
}
|
||||||
|
}
|
|
@ -1001,7 +1001,7 @@
|
||||||
<comparators>
|
<comparators>
|
||||||
<comparator>
|
<comparator>
|
||||||
<type>RegexpComparator</type>
|
<type>RegexpComparator</type>
|
||||||
<expected-output>^-tail \[-f\] <file> :\s*</expected-output>
|
<expected-output>^-tail \[-f\] \[-s <sleep interval>\] <file> :\s*</expected-output>
|
||||||
</comparator>
|
</comparator>
|
||||||
<comparator>
|
<comparator>
|
||||||
<type>RegexpComparator</type>
|
<type>RegexpComparator</type>
|
||||||
|
@ -1011,6 +1011,10 @@
|
||||||
<type>RegexpComparator</type>
|
<type>RegexpComparator</type>
|
||||||
<expected-output>^( |\t)*-f\s+Shows appended data as the file grows.( )*</expected-output>
|
<expected-output>^( |\t)*-f\s+Shows appended data as the file grows.( )*</expected-output>
|
||||||
</comparator>
|
</comparator>
|
||||||
|
<comparator>
|
||||||
|
<type>RegexpComparator</type>
|
||||||
|
<expected-output>^( |\t)*-s\s+With -f , defines the sleep interval between iterations in milliseconds.( )*</expected-output>
|
||||||
|
</comparator>
|
||||||
</comparators>
|
</comparators>
|
||||||
</test>
|
</test>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue