mirror of
https://github.com/mongodb/mongo.git
synced 2024-11-25 09:19:32 +01:00
b2122dd20a
added storage_engine_metadata to mongo/db/storage/SConscript fixed cleanbb.py so that cleanup() will remove directories as well. fixed unix_socket1.js so that it does not store socket file in data directory
115 lines
3.0 KiB
Python
115 lines
3.0 KiB
Python
#!/usr/bin/env python
|
|
|
|
import re
|
|
import sys
|
|
import os, os.path
|
|
import shutil
|
|
import utils
|
|
import time
|
|
from optparse import OptionParser
|
|
|
|
def shouldKill( c, root=None ):
|
|
|
|
if "smoke.py" in c:
|
|
return False
|
|
|
|
if "emr.py" in c:
|
|
return False
|
|
|
|
if "java" in c:
|
|
return False
|
|
|
|
# if root directory is provided, see if command line matches mongod process running
|
|
# with the same data directory
|
|
|
|
if root and re.compile("(\W|^)mongod(.exe)?\s+.*--dbpath(\s+|=)%s(\s+|$)" % root).search( c ):
|
|
return True
|
|
|
|
if ( c.find( "buildbot" ) >= 0 or c.find( "slave" ) >= 0 ) and c.find( "/mongo/" ) >= 0:
|
|
return True
|
|
|
|
if c.find( "xml-data/build-dir" ) >= 0: # for bamboo
|
|
return True
|
|
|
|
return False
|
|
|
|
def killprocs( signal="", root=None ):
|
|
killed = 0
|
|
|
|
if sys.platform == 'win32':
|
|
return killed
|
|
|
|
l = utils.getprocesslist()
|
|
print( "num procs:" + str( len( l ) ) )
|
|
if len(l) == 0:
|
|
print( "no procs" )
|
|
try:
|
|
print( execsys( "/sbin/ifconfig -a" ) )
|
|
except Exception,e:
|
|
print( "can't get interfaces" + str( e ) )
|
|
|
|
for x in l:
|
|
x = x.lstrip()
|
|
if not shouldKill( x, root=root ):
|
|
continue
|
|
|
|
pid = x.split( " " )[0]
|
|
print( "killing: " + x )
|
|
utils.execsys( "/bin/kill " + signal + " " + pid )
|
|
killed = killed + 1
|
|
|
|
return killed
|
|
|
|
|
|
def tryToRemove(path):
|
|
for _ in range(60):
|
|
try:
|
|
os.remove(path)
|
|
return True
|
|
except OSError, e:
|
|
errno = getattr(e, 'winerror', None)
|
|
# check for the access denied and file in use WindowsErrors
|
|
if errno in (5, 32):
|
|
print("os.remove(%s) failed, retrying in one second." % path)
|
|
time.sleep(1)
|
|
else:
|
|
raise e
|
|
return False
|
|
|
|
|
|
def cleanup( root , nokill ):
|
|
if nokill:
|
|
print "nokill requested, not killing anybody"
|
|
else:
|
|
if killprocs( root=root ) > 0:
|
|
time.sleep(3)
|
|
killprocs( "-9", root=root )
|
|
|
|
# delete all regular files, directories can stay
|
|
# NOTE: if we delete directories later, we can't delete diskfulltest
|
|
for ( dirpath , dirnames , filenames ) in os.walk( root , topdown=False ):
|
|
for x in filenames:
|
|
foo = dirpath + "/" + x
|
|
if os.path.exists(foo):
|
|
if not tryToRemove(foo):
|
|
raise Exception("Couldn't remove file '%s' after 60 seconds" % foo)
|
|
|
|
# delete all directories under root.
|
|
for directoryEntry in os.listdir(root):
|
|
if directoryEntry == 'diskfulltest':
|
|
continue
|
|
path = root + '/' + directoryEntry
|
|
if os.path.isdir(path):
|
|
shutil.rmtree(path, ignore_errors=True)
|
|
|
|
if __name__ == "__main__":
|
|
parser = OptionParser(usage="read the script")
|
|
parser.add_option("--nokill", dest='nokill', default=False, action='store_true')
|
|
(options, args) = parser.parse_args()
|
|
|
|
root = "/data/db/"
|
|
if len(args) > 0:
|
|
root = args[0]
|
|
|
|
cleanup( root , options.nokill )
|