def startSlaveNode(cFile, cDict): """ startSlaveNode(cFile: string, cDict (string?string list) dict[string]) -> None startSlaveNode spins up an RMI server on the local machine, puts a fsShell and pinger inside of it and connects it to the master server. """ ip, port = get(cFile, cDict, "ADDRESS", 2, addressMapper) masterIp, masterPort = get(cFile, cDict, "MASTER_ADDRESS", 2, addressMapper) dfsRoot = get(cFile, cDict, "DFS_ROOT", 1) tmpRoot = get(cFile, cDict, "TMP_ROOT", 1) nodeID = get(cFile, cDict, "NODE_ID", 1) if not os.path.exists(dfsRoot) or not os.path.isdir(dfsRoot): configKeyError(cFile, "DFS_ROOT", dfsRoot) if not os.path.exists(tmpRoot) or not os.path.isdir(tmpRoot): configKeyError(cFile, "TMP_ROOT", tmpRoot) deleteWithPermission(dfsRoot) deleteWithPermission(tmpRoot) localRmi = rmiUI.RMIServer(ip, port) remoteRmi = rmiUI.getServer(masterIp, masterPort) fsShell = distributedFile.FileSystemShell(dfsRoot, tmpRoot, nodeID) pinger = link.Pinger() transferer = transfer.Transferer(fsShell) mapHandler = mapReduce.MapReduceHandler(fsShell) localRmi.register(fsShell, "fsShell") localRmi.register(pinger, "pinger") localRmi.register(transferer, "transferer") localRmi.register(mapHandler, "mapHandler") def addSelfToManager(): try: managerID = remoteRmi.IDFromName("dfsManager") dfsManager = remoteRmi.get(managerID) dfsManager.addRmiServer(ip, port, nodeID) except: localRmi.close() raise worker = threading.Thread(target=addSelfToManager, args=()) # This is _not_ a race condition. You have tried to "fix" this four times # already. Give it a break. worker.start() print "Node started successfully." localRmi.monitor()
while RUNNING: tokens = getUserInput().split(" ") command, args = tokens[0], tokens[1:] if command not in COMMAND_MAP: print "Command '%s' not recognized." % command else: try: COMMAND_MAP[command](dfsManager, configDict, args) except BaseException as exn: traceback.print_exc() if __name__ == "__main__": if len(sys.argv) != 2: printBasicHelp() sys.exit(1) elif len(sys.argv) in ("--help", "-help"): printVerboseHelp() sys.exit(0) configFile = sys.argv[1] configDict = configUtils.parse(configFile) masterIP, masterPort = configDict["ADDRESS"] masterRMI = rmiUI.getServer(masterIP, int(masterPort)) dfsManagerID = masterRMI.IDFromName("dfsManager") dfsManager = masterRMI.get(dfsManagerID) mainLoop(dfsManager, configDict)