diff --git a/changelog.html b/changelog.html
index f669f3b0ab5669c15584b65b7cc4177d5c1c1ea9..86209f4e8836aa8a0e79cae001c21e3caa74c397 100644
--- a/changelog.html
+++ b/changelog.html
@@ -55,6 +55,9 @@ Upcoming changes
+ -
+ Gracefully handle old slave.jar to avoid AbstractMethodError
+ (thread)
-
Debian packages now do log rotation
(issue 8641)
diff --git a/core/src/main/java/hudson/FilePath.java b/core/src/main/java/hudson/FilePath.java
index 6fbba0a5194e280b4452ba4fb5900ab7a91d8118..57c3fa2133e4da3572b613a3a0167f3664f63fa8 100644
--- a/core/src/main/java/hudson/FilePath.java
+++ b/core/src/main/java/hudson/FilePath.java
@@ -39,6 +39,7 @@ import hudson.remoting.Pipe;
import hudson.remoting.RemoteOutputStream;
import hudson.remoting.VirtualChannel;
import hudson.remoting.RemoteInputStream;
+import hudson.remoting.Which;
import hudson.security.AccessControlled;
import hudson.util.DirScanner;
import hudson.util.IOException2;
@@ -85,6 +86,7 @@ import java.util.List;
import java.util.StringTokenizer;
import java.util.Arrays;
import java.util.Comparator;
+import java.util.logging.Level;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.concurrent.ExecutionException;
@@ -1419,8 +1421,29 @@ public final class FilePath implements Serializable {
});
// make sure the write fully happens before we return.
- if (channel!=null)
- channel.syncLocalIO();
+ syncIO();
+ }
+
+ private void syncIO() throws InterruptedException {
+ try {
+ if (channel!=null)
+ _syncIO();
+ } catch (AbstractMethodError e) {
+ // legacy slave.jar. Handle this gracefully
+ try {
+ LOGGER.log(Level.WARNING,"Looks like an old slave.jar. Please update "+ Which.jarFile(Channel.class)+" to the new version",e);
+ } catch (IOException _) {
+ // really ignore this time
+ }
+ }
+ }
+
+ /**
+ * A pointless function to work around what appears to be a HotSpot problem. See JENKINS-5756 and bug 6933067
+ * on BugParade for more details.
+ */
+ private void _syncIO() throws InterruptedException {
+ channel.syncLocalIO();
}
/**