Dryad/DryadLinqGraphManager/Program.cs

159 lines
5.3 KiB
C#

/*
Copyright (c) Microsoft Corporation
All rights reserved.
Licensed 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
THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER
EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF
TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions and
limitations under the License.
*/
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using Microsoft.Research.Dryad;
namespace Microsoft.Research.Dryad.GraphManager
{
class Program
{
static Uri dfsDirectory;
static void ExceptionHandler(object sender, UnhandledExceptionEventArgs args)
{
int result = unchecked((int)LinqToDryadException.E_FAIL);
Exception e = args.ExceptionObject as Exception;
string errorString = "Unknown exception";
if (e != null)
{
result = System.Runtime.InteropServices.Marshal.GetHRForException(e);
errorString = e.ToString();
DryadLogger.LogCritical(errorString);
System.Threading.Thread.Sleep(10 * 1000);
}
DebugHelper.StopLogging(result, errorString, DateTime.Now.ToLocalTime(), dfsDirectory);
if (Debugger.IsAttached)
{
Debugger.Break();
}
else
{
DrLogging.WriteMiniDump();
}
// We need to Exit, since other threads in the GM
// are likely to still be running.
Environment.Exit(result);
}
static int Main(string[] args)
{
Console.WriteLine("{0} starting up in {1}", Environment.CommandLine, Environment.CurrentDirectory);
bool waitForDebugger = false;
List<string> tempArgs = new List<string>();
// Record start time so we can report it once logging has been initialized
DateTime startTime = DateTime.Now.ToLocalTime();
// Set unhandled exception handler to catch anything thrown from
// Microsoft.Hpc.Query.GraphManager.dll
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(ExceptionHandler);
dfsDirectory = null;
foreach (string arg in args)
{
if (String.Compare(arg, "--break", StringComparison.OrdinalIgnoreCase) == 0)
{
waitForDebugger = true;
}
else if (arg.StartsWith("--dfs="))
{
dfsDirectory = DebugHelper.AddDfsJobDirectoryFromArgs(arg);
}
else
{
tempArgs.Add(arg);
}
}
args = tempArgs.ToArray();
if (waitForDebugger)
{
DebugHelper.WaitForDebugger();
}
//
// Configure tracing
//
DebugHelper.InitializeLogging(startTime);
//
// Run the Graph Manager
//
int retCode = 0;
string errorString = null;
try
{
LinqToDryadJM jm = new LinqToDryadJM();
retCode = jm.Run(dfsDirectory, args, out errorString);
}
catch (Exception e)
{
retCode = System.Runtime.InteropServices.Marshal.GetHRForException(e);
if (retCode == 0)
{
errorString = e.ToString();
DryadLogger.LogCritical(errorString);
retCode = unchecked((int)LinqToDryadException.E_FAIL);
}
else
{
errorString = String.Format("{0}: {1}", retCode, e);
DryadLogger.LogCritical(errorString);
}
System.Threading.Thread.Sleep(10 * 1000);
}
DebugHelper.StopLogging(retCode, errorString, DateTime.Now.ToLocalTime(), dfsDirectory);
// NOTE: We don't want to log critical errors twice, so here we're assuming that
// if the GM exited "gracefully" and returned an error code instead of throwing
// an exception, that it has already logged the error.
if (retCode != 0)
{
// If the Graph Manager already started executing, we need to exit the process.
// Exiting the thread (returning from Main) will not necessarily cause the GM's
// worker threads to exit
// TODO: Consider deleting temp output stream from DSC
// requires that we have access to the URI at this point, though
Environment.Exit(retCode);
}
//
// Cleanup all vertex tasks in case any became
// unreachable.
//
return retCode;
}
}
}