reverted to 7f9397eb30; needs some cleanups but then we are back online again.... ;)
This commit is contained in:
parent
3745c27c9a
commit
34e73a56f2
5 changed files with 52 additions and 62 deletions
|
|
@ -1,7 +1,6 @@
|
||||||
0.16 - Date ??? Next release is scheduled to christmas 2013
|
0.16 - Date ??? Next release is scheduled to christmas 2013
|
||||||
|
|
||||||
- Added a CHANGELOG file
|
- Added a CHANGELOG file
|
||||||
- Added multi core support by instantiating multiple scheduler instances
|
|
||||||
- Added "gui" command to lish providing an urwid (curses) based interface to
|
- Added "gui" command to lish providing an urwid (curses) based interface to
|
||||||
Linspector
|
Linspector
|
||||||
- Added scheduling status to boot message
|
- Added scheduling status to boot message
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
__version__ = "0.15.3/AMNESIA"
|
__version__ = "0.15/AMNESIA"
|
||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
import datetime
|
import datetime
|
||||||
|
|
@ -29,10 +29,13 @@ import logging.handlers
|
||||||
import os
|
import os
|
||||||
import os.path as path
|
import os.path as path
|
||||||
import sys
|
import sys
|
||||||
|
import multiprocessing
|
||||||
|
from multiprocessing import Pool
|
||||||
|
|
||||||
from linspector.config.parser import FullConfigParser
|
from linspector.config.parser import FullConfigParser
|
||||||
from linspector.core.interface import LinspectorInterface
|
from linspector.core.interface import LinspectorInterface
|
||||||
from linspector.core.worker import LinspectorWorker
|
from linspector.core.job import LinspectorJob
|
||||||
|
from linspector.core.scheduler import LinspectorScheduler
|
||||||
from linspector.frontends.lish import LishFrontend
|
from linspector.frontends.lish import LishFrontend
|
||||||
from linspector.tasks.task import TaskExecutor
|
from linspector.tasks.task import TaskExecutor
|
||||||
|
|
||||||
|
|
@ -60,14 +63,11 @@ def parse_args():
|
||||||
parser.add_argument("-c", "--logcount", default=5, type=int,
|
parser.add_argument("-c", "--logcount", default=5, type=int,
|
||||||
help="maximum number of logfiles in rotation (default: 5)")
|
help="maximum number of logfiles in rotation (default: 5)")
|
||||||
|
|
||||||
parser.add_argument("-i", "--instances", default=1, type=int,
|
|
||||||
help="number of scheduler instances (default: 1)")
|
|
||||||
|
|
||||||
parser.add_argument("-m", "--logsize", default=10485760, type=int,
|
parser.add_argument("-m", "--logsize", default=10485760, type=int,
|
||||||
help="maximum logfile size in bytes (default: 10485760)")
|
help="maximum logfile size in bytes (default: 10485760)")
|
||||||
|
|
||||||
parser.add_argument("-t", "--threads", default=1000, type=int,
|
parser.add_argument("-t", "--threads", default=3500, type=int,
|
||||||
help="maximum number of scheduler threads (default: 1000)")
|
help="maximum number of scheduler threads (default: 3500)")
|
||||||
|
|
||||||
parser.add_argument("-k", "--corethreads", default=0, type=int,
|
parser.add_argument("-k", "--corethreads", default=0, type=int,
|
||||||
help="number of scheduler core threads (default: 0)")
|
help="number of scheduler core threads (default: 0)")
|
||||||
|
|
@ -91,6 +91,14 @@ def parse_args():
|
||||||
return parser.parse_args()
|
return parser.parse_args()
|
||||||
|
|
||||||
|
|
||||||
|
pool = Pool(processes=16)
|
||||||
|
print 'cpu_count() = %d\n' % multiprocessing.cpu_count()
|
||||||
|
|
||||||
|
|
||||||
|
def handle_job(job):
|
||||||
|
result = pool.apply_async(job.handle_call())
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
global lin_conf
|
global lin_conf
|
||||||
args = parse_args()
|
args = parse_args()
|
||||||
|
|
@ -114,26 +122,21 @@ def main():
|
||||||
logger.error(msg)
|
logger.error(msg)
|
||||||
exit()
|
exit()
|
||||||
|
|
||||||
executor = TaskExecutor()
|
scheduler = LinspectorScheduler({"apscheduler.threadpool.core_threads": args.corethreads,
|
||||||
#logger.debug("task executor instance :%s", str(task))
|
"apscheduler.threadpool.max_threads": args.threads})
|
||||||
|
scheduler.start()
|
||||||
|
TaskExecutor.Instance()
|
||||||
|
|
||||||
job_count = 0
|
job_count = 0
|
||||||
for layout in lin_conf.get_enabled_layouts():
|
for layout in lin_conf.get_enabled_layouts():
|
||||||
for hostgroup in layout.get_hostgroups():
|
for hostgroup in layout.get_hostgroups():
|
||||||
job_count += (hostgroup.get_services().__len__() * hostgroup.get_hosts().__len__())
|
job_count += (hostgroup.get_services().__len__() * hostgroup.get_hosts().__len__())
|
||||||
|
|
||||||
workers = []
|
|
||||||
for i in range(0, args.instances):
|
|
||||||
process = LinspectorWorker(args.corethreads, args.threads)
|
|
||||||
workers.append(process)
|
|
||||||
process.daemon = True
|
|
||||||
|
|
||||||
start_date = datetime.datetime.now()
|
start_date = datetime.datetime.now()
|
||||||
time_delta = 0
|
time_delta = 0
|
||||||
jobs = []
|
jobs = []
|
||||||
count = 0
|
count = 0
|
||||||
percent = 0
|
percent = 0
|
||||||
instance = 0
|
|
||||||
for layout in lin_conf.get_enabled_layouts():
|
for layout in lin_conf.get_enabled_layouts():
|
||||||
for hostgroup in layout.get_hostgroups():
|
for hostgroup in layout.get_hostgroups():
|
||||||
for service in hostgroup.get_services():
|
for service in hostgroup.get_services():
|
||||||
|
|
@ -151,22 +154,19 @@ def main():
|
||||||
|
|
||||||
time_delta += float(args.delay)
|
time_delta += float(args.delay)
|
||||||
new_start_date = start_date + datetime.timedelta(seconds=time_delta)
|
new_start_date = start_date + datetime.timedelta(seconds=time_delta)
|
||||||
|
job = LinspectorJob(service,
|
||||||
worker = workers[instance]
|
host,
|
||||||
worker.create_job(jobs, service, host, hostgroup, core, period, start_date=new_start_date, executor=executor)
|
hostgroup.get_members(),
|
||||||
|
core,
|
||||||
instance += 1
|
hostgroup)
|
||||||
if instance == args.instances:
|
scheduler_job = period.createJob(scheduler, job, handle_job, start_date=new_start_date)
|
||||||
instance = 0
|
if scheduler_job is not None:
|
||||||
|
job.set_job(scheduler_job)
|
||||||
|
jobs.append(job)
|
||||||
|
|
||||||
print("\nScheduled " + str(job_count) + " jobs")
|
print("\nScheduled " + str(job_count) + " jobs")
|
||||||
|
|
||||||
schedulers = []
|
interface = LinspectorInterface(jobs, scheduler, lin_conf, root_logger, __version__)
|
||||||
for worker in workers:
|
|
||||||
schedulers.append(worker.get_scheduler())
|
|
||||||
worker.start()
|
|
||||||
|
|
||||||
interface = LinspectorInterface(jobs, schedulers, lin_conf, root_logger, __version__)
|
|
||||||
|
|
||||||
if "jsonrpc_backend" in core and core["jsonrpc_backend"]:
|
if "jsonrpc_backend" in core and core["jsonrpc_backend"]:
|
||||||
from linspector.backends.jsonrpc import JsonrpcBackend
|
from linspector.backends.jsonrpc import JsonrpcBackend
|
||||||
|
|
@ -184,15 +184,13 @@ def main():
|
||||||
if "shutdown_wait" in core:
|
if "shutdown_wait" in core:
|
||||||
shutdown_wait = core["shutdown_wait"]
|
shutdown_wait = core["shutdown_wait"]
|
||||||
|
|
||||||
for worker in workers:
|
scheduler.shutdown(wait=shutdown_wait)
|
||||||
worker.shutdown(shutdown_wait)
|
|
||||||
worker.terminate()
|
|
||||||
|
|
||||||
logging.shutdown()
|
logging.shutdown()
|
||||||
if shutdown_wait:
|
if shutdown_wait:
|
||||||
TaskExecutor.Instance().stop()
|
TaskExecutor.Instance().stop()
|
||||||
else:
|
else:
|
||||||
TaskExecutor.Instance().stop_immediately()
|
TaskExecutor.Instance().stop_immediately()
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
|
@ -21,8 +21,7 @@
|
||||||
"members": ["root"],
|
"members": ["root"],
|
||||||
"hosts": [ "a"],
|
"hosts": [ "a"],
|
||||||
"services":[
|
"services":[
|
||||||
{ "class": "etc/dummy", "args": { "sleep": 1, "fail": true }, "periods": ["fast"], "threshold": 1 },
|
{ "class": "etc/dummy", "args": { "sleep": 1, "fail": true }, "periods": ["fast"], "threshold": 1 }
|
||||||
{ "class": "etc/dummy", "args": { "sleep": 1, "fail": false }, "periods": ["fast"], "threshold": 1 }
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
@ -47,4 +46,4 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -39,7 +39,7 @@ logger = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class LinspectorJob:
|
class LinspectorJob:
|
||||||
def __init__(self, service, host, members, core, hostgroup, executor):
|
def __init__(self, service, host, members, core, hostgroup):
|
||||||
self.service = service
|
self.service = service
|
||||||
self.host = host
|
self.host = host
|
||||||
self.members = members
|
self.members = members
|
||||||
|
|
@ -49,7 +49,6 @@ class LinspectorJob:
|
||||||
self.enabled = True
|
self.enabled = True
|
||||||
self.scheduler_job = None
|
self.scheduler_job = None
|
||||||
self.job_id = self.hex_string()
|
self.job_id = self.hex_string()
|
||||||
self.executor = executor
|
|
||||||
"""
|
"""
|
||||||
NONE job was not executed
|
NONE job was not executed
|
||||||
OK when everything is fine
|
OK when everything is fine
|
||||||
|
|
@ -116,11 +115,8 @@ class LinspectorJob:
|
||||||
for task in member.get_tasks():
|
for task in member.get_tasks():
|
||||||
if self.status.lower() in task.get_task_type().lower():
|
if self.status.lower() in task.get_task_type().lower():
|
||||||
logger.debug("Executing Task of type: " + self.status)
|
logger.debug("Executing Task of type: " + self.status)
|
||||||
try:
|
TaskExecutor.Instance().schedule_task(job_information, task)
|
||||||
|
|
||||||
self.executor.schedule_task(job_information, task)
|
|
||||||
except Exception, e:
|
|
||||||
logger.error("Error while executing: " + str(e))
|
|
||||||
def handle_call(self):
|
def handle_call(self):
|
||||||
logger.debug("handle call")
|
logger.debug("handle call")
|
||||||
logger.debug(self.service)
|
logger.debug(self.service)
|
||||||
|
|
|
||||||
|
|
@ -21,8 +21,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
from logging import getLogger
|
from logging import getLogger
|
||||||
from threading import Event, Thread
|
from threading import Event, Thread
|
||||||
from time import sleep
|
|
||||||
from Queue import Queue
|
|
||||||
from linspector.utils.singleton import Singleton
|
from linspector.utils.singleton import Singleton
|
||||||
|
|
||||||
KEY_TYPE = "type"
|
KEY_TYPE = "type"
|
||||||
|
|
@ -76,11 +74,11 @@ class Task(object):
|
||||||
raise e
|
raise e
|
||||||
|
|
||||||
|
|
||||||
|
@Singleton
|
||||||
class TaskExecutor(object):
|
class TaskExecutor(object):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
logger.debug("init taskExecutor")
|
|
||||||
self.event = Event()
|
self.event = Event()
|
||||||
self.taskInfos = Queue()
|
self.taskInfos = []
|
||||||
task_thread = Thread(target=self._run_worker_thread)
|
task_thread = Thread(target=self._run_worker_thread)
|
||||||
self._instantEnd = False
|
self._instantEnd = False
|
||||||
self._running = True
|
self._running = True
|
||||||
|
|
@ -88,17 +86,20 @@ class TaskExecutor(object):
|
||||||
task_thread.start()
|
task_thread.start()
|
||||||
|
|
||||||
def _run_worker_thread(self):
|
def _run_worker_thread(self):
|
||||||
logger.debug("start running taskExcecutor worker Thread")
|
|
||||||
while self.is_running() or not self.is_instant_end():
|
while self.is_running() or not self.is_instant_end():
|
||||||
|
if len(self.taskInfos) == 0:
|
||||||
|
self.event.clear()
|
||||||
|
self.event.wait()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
logger.debug("try to get queued task from %s", self.taskInfos)
|
msg, task = self.taskInfos[0]
|
||||||
msg, task = self.taskInfos.get()
|
del self.taskInfos[0]
|
||||||
logger.debug("got task %s for msg: %s", str(task), str(msg))
|
if task:
|
||||||
task.execute(msg)
|
logger.debug("Starting Task Execution...")
|
||||||
self.taskInfos.task_done()
|
task.execute(msg)
|
||||||
|
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
logger.error("Error: %s", e.message)
|
logger.error("Error " + str(e))
|
||||||
logger.debug("shutting down TaskExecutor!")
|
|
||||||
|
|
||||||
def is_instant_end(self):
|
def is_instant_end(self):
|
||||||
return self._instantEnd
|
return self._instantEnd
|
||||||
|
|
@ -108,16 +109,13 @@ class TaskExecutor(object):
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
self._running = False
|
self._running = False
|
||||||
|
self.event.set()
|
||||||
|
|
||||||
def stop_immediately(self):
|
def stop_immediately(self):
|
||||||
self._running = False
|
self._running = False
|
||||||
self._instantEnd = True
|
self._instantEnd = True
|
||||||
|
self.event.set()
|
||||||
|
|
||||||
def schedule_task(self, msg, task):
|
def schedule_task(self, msg, task):
|
||||||
try:
|
self.taskInfos.append((msg, task))
|
||||||
logger.debug("appending task '%s' for msg: %s", str(task), str(msg))
|
self.event.set()
|
||||||
self.taskInfos.put((msg, task))
|
|
||||||
logger.debug("into queue: %s ", str(self.taskInfos))
|
|
||||||
except Exception, e:
|
|
||||||
logger.debug("queue is probably full: %s", str(e))
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue