As you probably know, one cannot delete a Cloud Files container without deleting all the objects inside it first. This can take quite a bit of time if you have many objects in your container.

I had to delete about 30GB of data in a container and it was taking forever. I discovered a script by Fernando Florez which utilizes the Python Gevent library and Pyrax SDK to do a speedy container deletion. The Gevent library contains Greenlet which does micro-threading. Executing this script sends deletion requests to Cloud Files concurrently, drastically reducing total deletion time.

This method assumes you are utilizing a Python virtual environment and that you have activated it.

Install Pyrax

pip install pyrax

Install Libevent

curl -L -O https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
tar xzf libevent-2.0.21-stable.tar.gz
cd libevent-2.0.21-stable
./configure --prefix="$VIRTUAL_ENV"
make && make install
cd $VIRTUAL_ENV/..

Install Greenlet and Gevent

pip install greenlet
pip install gevent --global-option "-L$VIRTUAL_ENV/lib"  --global-option "-I$VIRTUAL_ENV/include"

Test Gevent

Enter a Python interactive shell and try to import Gevent. If you do not get any errors you should be good.

python
import gevent

Delete All Objects in Container

Be sure to specify your region, i.e. DFW, ORD, etc.

from gevent import monkey
from gevent.pool import Pool
from gevent import Timeout
monkey.patch_all()
import pyrax

if __name__ == '__main__':
pool = Pool(100)
pyrax.set_setting('identity_type', 'rackspace')
pyrax.set_setting('verify_ssl', False)
pyrax.set_setting("region", 'region')
pyrax.set_credentials('username', 'api_key')

cf = pyrax.cloudfiles
container = cf.get_container('container_name')
objects = container.get_objects(full_listing=True)
def delete_object(obj):
# added timeout of 5 seconds just in case
with Timeout(5, False):
          try:
              obj.delete()
          except:
              pass
  for obj in objects:
      pool.spawn(delete_object, obj)
  pool.join()


Comments

comments powered by Disqus