diff options
-rw-r--r-- | .travis.yml | 8 | ||||
-rwxr-xr-x | ci/test-mill-built.sh | 7 | ||||
-rwxr-xr-x | ci/test-mill-release.sh | 7 | ||||
-rwxr-xr-x | ci/test-sbt-built.sh | 7 | ||||
-rw-r--r-- | clientserver/src/mill/clientserver/Client.scala | 9 | ||||
-rw-r--r-- | clientserver/src/mill/clientserver/ClientServer.scala | 22 | ||||
-rw-r--r-- | clientserver/src/mill/clientserver/Server.scala | 40 | ||||
-rw-r--r-- | clientserver/test/src/mill/clientserver/ClientServerTests.scala | 5 |
8 files changed, 69 insertions, 36 deletions
diff --git a/.travis.yml b/.travis.yml index 57a75bef..83ff9b91 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,10 +18,10 @@ matrix: env: CI_SCRIPT=ci/test-mill-built.sh - stage: build env: CI_SCRIPT=ci/test-mill-release.sh - - stage: release - env: CI_SCRIPT="ci/on-master.py ci/release.sh" - - stage: release - env: CI_SCRIPT="ci/on-master.py ci/publish-docs.sh" +# - stage: release +# env: CI_SCRIPT="ci/on-master.py ci/release.sh" +# - stage: release +# env: CI_SCRIPT="ci/on-master.py ci/publish-docs.sh" script: - git fetch --unshallow --tags diff --git a/ci/test-mill-built.sh b/ci/test-mill-built.sh index 44af3876..c12beefe 100755 --- a/ci/test-mill-built.sh +++ b/ci/test-mill-built.sh @@ -12,6 +12,7 @@ target/bin/mill dev.assembly # Second build & run tests using Mill -out/dev/assembly/dest/out.jar all {clientserver,main,scalalib,scalajslib}.test -out/dev/assembly/dest/out.jar integration.test "mill.integration.forked.{AmmoniteTests,BetterFilesTests}" -out/dev/assembly/dest/out.jar dev.assembly +out/dev/assembly/dest/out.jar all clientserver.test +#out/dev/assembly/dest/out.jar all {clientserver,main,scalalib,scalajslib}.test +#out/dev/assembly/dest/out.jar integration.test "mill.integration.forked.{AmmoniteTests,BetterFilesTests}" +#out/dev/assembly/dest/out.jar dev.assembly diff --git a/ci/test-mill-release.sh b/ci/test-mill-release.sh index 838d1960..b9986df0 100755 --- a/ci/test-mill-release.sh +++ b/ci/test-mill-release.sh @@ -11,6 +11,7 @@ git clean -xdf # Second build & run tests using Mill -~/mill-release all {clientserver,main,scalalib,scalajslib}.test -~/mill-release integration.test "mill.integration.forked.{AcyclicTests,JawnTests,UpickleTests}" -~/mill-release dev.assembly +~/mill-release all clientserver.test +#~/mill-release all {clientserver,main,scalalib,scalajslib}.test +#~/mill-release integration.test "mill.integration.forked.{AcyclicTests,JawnTests,UpickleTests}" +#~/mill-release dev.assembly diff --git a/ci/test-sbt-built.sh b/ci/test-sbt-built.sh index 3a85d345..6895088d 100755 --- a/ci/test-sbt-built.sh +++ b/ci/test-sbt-built.sh @@ -8,6 +8,7 @@ git clean -xdf sbt bin/test:assembly # Run tests using Mill built using SBT -target/bin/mill all {clientserver,main,scalalib,scalajslib}.test -target/bin/mill integration.test "mill.integration.local.{AcyclicTests,JawnTests,UpickleTests}" -target/bin/mill dev.assembly +target/bin/mill clientserver.test +#target/bin/mill all {clientserver,main,scalalib,scalajslib}.test +#target/bin/mill integration.test "mill.integration.local.{AcyclicTests,JawnTests,UpickleTests}" +#target/bin/mill dev.assembly diff --git a/clientserver/src/mill/clientserver/Client.scala b/clientserver/src/mill/clientserver/Client.scala index dcf65271..b7a39cb2 100644 --- a/clientserver/src/mill/clientserver/Client.scala +++ b/clientserver/src/mill/clientserver/Client.scala @@ -34,14 +34,17 @@ class Client(lockBase: String, stdout: OutputStream, stderr: OutputStream) extends ClientServer(lockBase){ def run(args: Array[String]) = { - + println("Client Run") val f = new FileOutputStream(runFile) ClientServer.writeArgs(System.console() != null, args, f) f.close() if (locks.processLock.probe()) initServer() while(locks.processLock.probe()) Thread.sleep(3) + println("Client Connect Socket") + val ioSocket = ClientServer.retry(1000, new UnixDomainSocket(ioPath)) + println("Client Connected Socket") val outErr = ioSocket.getInputStream val in = ioSocket.getOutputStream val outPump = new ClientOutputPumper(outErr, stdout, stderr) @@ -52,6 +55,10 @@ class Client(lockBase: String, inThread.setDaemon(true) outThread.start() inThread.start() + println("Client Await Server Lock") + locks.serverLock.await() + println("Client End") + } } diff --git a/clientserver/src/mill/clientserver/ClientServer.scala b/clientserver/src/mill/clientserver/ClientServer.scala index 2cc38859..84ea2e00 100644 --- a/clientserver/src/mill/clientserver/ClientServer.scala +++ b/clientserver/src/mill/clientserver/ClientServer.scala @@ -48,17 +48,27 @@ object ClientServer{ } } - def interruptWith[T](millis: Int, close: => Unit)(t: => T): T = { - var int = true + def interruptWith[T](millis: Int, close: => Unit)(t: => T): Option[T] = { + @volatile var interrupt = true + @volatile var interrupted = false new Thread(() => { Thread.sleep(millis) - if (int) close + if (interrupt) { + close + interrupted = true + } }).start() - try t - finally { + try { + val res = + try Some(t) + catch {case e: Throwable => None} + + if (interrupted) None + else res - int = false + } finally { + interrupt = false } } diff --git a/clientserver/src/mill/clientserver/Server.scala b/clientserver/src/mill/clientserver/Server.scala index ad2e35e4..1271933d 100644 --- a/clientserver/src/mill/clientserver/Server.scala +++ b/clientserver/src/mill/clientserver/Server.scala @@ -3,7 +3,7 @@ package mill.clientserver import java.io._ import java.net.Socket -import org.scalasbt.ipcsocket.UnixDomainServerSocket +import org.scalasbt.ipcsocket.{UnixDomainServerSocket, UnixDomainSocket} trait ServerMain[T]{ def main(args0: Array[String]): Unit = { @@ -11,7 +11,7 @@ trait ServerMain[T]{ args0(0), this, () => System.exit(0), - () => System.currentTimeMillis(), + 60000, new FileLocks(args0(0)) ).run() } @@ -29,30 +29,39 @@ trait ServerMain[T]{ class Server[T](lockBase: String, sm: ServerMain[T], interruptServer: () => Unit, - currentTimeMillis: () => Long, + acceptTimeout: Int, locks: Locks) extends ClientServer(lockBase){ val originalStdout = System.out def run() = { locks.processLock.tryLockBlock{ - var lastRun = currentTimeMillis() - while (currentTimeMillis() - lastRun < 60000) locks.serverLock.lockBlock{ + println("Server Process Lock") + var running = true + while (running) locks.serverLock.lockBlock{ + println("Server Lock") new File(ioPath).delete() + println("Server Accept Socket") val ioSocket = new UnixDomainServerSocket(ioPath) val sockOpt = ClientServer.interruptWith( - 1000, - ioSocket.close() + acceptTimeout, + { + println("Server Socket Timing Out Close") + try new UnixDomainSocket(ioPath).close() + catch{case e: Throwable => } + } ){ - try Some(ioSocket.accept()) - catch{ case e: IOException => None} + ioSocket.accept() } - - sockOpt.foreach{sock => - try handleRun(sock) - catch{case e: Throwable => e.printStackTrace(originalStdout) } - finally lastRun = currentTimeMillis() + sockOpt match{ + case None => running = false + case Some(sock) => + println("Server Handle Run") + try handleRun(sock) + catch{case e: Throwable => e.printStackTrace(originalStdout) } } + println("Server Unlock") } + println("Server Process Unlock") }.getOrElse(throw new Exception("PID already present")) } @@ -88,7 +97,7 @@ class Server[T](lockBase: String, ) t.start() - + println("Server Poll Client/Done") // We cannot simply use Lock#await here, because the filesystem doesn't // realize the clientLock/serverLock are held by different threads in the // two processes and gives a spurious deadlock error @@ -98,6 +107,7 @@ class Server[T](lockBase: String, t.interrupt() t.stop() + println("Server Socket Close") clientSocket.close() } } diff --git a/clientserver/test/src/mill/clientserver/ClientServerTests.scala b/clientserver/test/src/mill/clientserver/ClientServerTests.scala index ecf09ab3..55453c4f 100644 --- a/clientserver/test/src/mill/clientserver/ClientServerTests.scala +++ b/clientserver/test/src/mill/clientserver/ClientServerTests.scala @@ -46,7 +46,7 @@ object ClientServerTests extends TestSuite{ tmpDir.toString, new EchoServer(), () => (), - () => currentTimeMillis, + 1000, locks ).run()).start() } @@ -55,6 +55,7 @@ object ClientServerTests extends TestSuite{ def runClient(arg: String) = { val (in, out, err) = initStreams() locks.clientLock.lockBlock{ + println("Client Lock") val c = new Client( tmpDir.toString, () => spawnEchoServer(), @@ -64,6 +65,7 @@ object ClientServerTests extends TestSuite{ err ) c.run(Array(arg)) + println("Client unlock") (new String(out.toByteArray), new String(err.toByteArray)) } } @@ -99,6 +101,7 @@ object ClientServerTests extends TestSuite{ ) // Make sure the server times out of not used for a while + println("Sleep 2000") currentTimeMillis += 60001 Thread.sleep(2000) assert( |