You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ml...@apache.org on 2013/07/25 19:28:43 UTC
git commit: updated refs/heads/master to 74df662
Updated Branches:
refs/heads/master 23e775374 -> 74df66203
Summary: Make vmdata_kvm.py concurrency friendly
Detail: Adds flocks, etc for calling this concurrently, since CLOUDSTACK-3484
made userdata, vmdata, start commands concurrent
Signed-off-by: Marcus Sorensen <ma...@betterservers.com> 1374773177 -0600
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/74df6620
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/74df6620
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/74df6620
Branch: refs/heads/master
Commit: 74df662037d178786fcba92f57f673a7040b1490
Parents: 23e7753
Author: Marcus Sorensen <ma...@betterservers.com>
Authored: Thu Jul 25 11:26:17 2013 -0600
Committer: Marcus Sorensen <ma...@betterservers.com>
Committed: Thu Jul 25 11:28:42 2013 -0600
----------------------------------------------------------------------
.../debian/config/opt/cloud/bin/vmdata_kvm.py | 100 +++++++++++++++----
1 file changed, 82 insertions(+), 18 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/74df6620/patches/systemvm/debian/config/opt/cloud/bin/vmdata_kvm.py
----------------------------------------------------------------------
diff --git a/patches/systemvm/debian/config/opt/cloud/bin/vmdata_kvm.py b/patches/systemvm/debian/config/opt/cloud/bin/vmdata_kvm.py
index bf8baac..f508032 100644
--- a/patches/systemvm/debian/config/opt/cloud/bin/vmdata_kvm.py
+++ b/patches/systemvm/debian/config/opt/cloud/bin/vmdata_kvm.py
@@ -17,6 +17,8 @@
# under the License.
import sys, getopt, json, os, base64
+from fcntl import flock, LOCK_EX, LOCK_UN
+
def main(argv):
fpath = ''
@@ -83,20 +85,37 @@ def createfile(ip, folder, file, data):
if data is not None:
data = base64.b64decode(data)
+ fh = open(dest, "w")
+ exflock(fh)
if data is not None:
- open(dest, "w").write(data)
+ fh.write(data)
else:
- open(dest, "w").write("")
+ fh.write("")
+ unflock(fh)
+ fh.close()
os.chmod(dest, 0644)
if folder == "metadata" or folder == "meta-data":
- if not os.path.exists(metamanifestdir):
+ try:
os.makedirs(metamanifestdir, 0755)
+ except OSError as e:
+ # error 17 is already exists, we do it this way for concurrency
+ if e.errno != 17:
+ print "failed to make directories " + metamanifestdir + " due to :" +e.strerror
+ sys.exit(1)
if os.path.exists(metamanifest):
- if not file in open(metamanifest).read():
- open(metamanifest, "a").write(file + '\n')
+ fh = open(metamanifest, "r+a")
+ exflock(fh)
+ if not file in fh.read():
+ fh.write(file + '\n')
+ unflock(fh)
+ fh.close()
else:
- open(metamanifest, "w").write(file + '\n')
+ fh = open(metamanifest, "w")
+ exflock(fh)
+ fh.write(file + '\n')
+ unflock(fh)
+ fh.close()
if os.path.exists(metamanifest):
os.chmod(metamanifest, 0644)
@@ -106,35 +125,80 @@ def htaccess(ip, folder, file):
htaccessFolder = "/var/www/html/latest"
htaccessFile = htaccessFolder + "/.htaccess"
- if not os.path.exists(htaccessFolder):
+ try:
os.mkdir(htaccessFolder,0755)
+ except OSError as e:
+ # error 17 is already exists, we do it this way for concurrency
+ if e.errno != 17:
+ print "failed to make directories " + htaccessFolder + " due to :" +e.strerror
+ sys.exit(1)
if os.path.exists(htaccessFile):
- if not entry in open(htaccessFile).read():
- open(htaccessFile, "a").write(entry + '\n')
+ fh = open(htaccessFile, "r+a")
+ exflock(fh)
+ if not entry in fh.read():
+ fh.write(entry + '\n')
+ unflock(fh)
+ fh.close()
+ else:
+ fh = open(htaccessFile, "w")
+ exflock(fh)
+ fh.write("Options +FollowSymLinks\nRewriteEngine On\n\n")
+ fh.write(entry + '\n')
+ unflock(fh)
+ fh.close()
entry="Options -Indexes\nOrder Deny,Allow\nDeny from all\nAllow from " + ip
htaccessFolder = "/var/www/html/" + folder + "/" + ip
htaccessFile = htaccessFolder+"/.htaccess"
- if not os.path.exists(htaccessFolder):
+ try:
os.makedirs(htaccessFolder,0755)
-
- open(htaccessFile, "w").write(entry + '\n')
+ except OSError as e:
+ # error 17 is already exists, we do it this way for sake of concurrency
+ if e.errno != 17:
+ print "failed to make directories " + htaccessFolder + " due to :" +e.strerror
+ sys.exit(1)
+
+ fh = open(htaccessFile, "w")
+ exflock(fh)
+ fh.write(entry + '\n')
+ unflock(fh)
+ fh.close()
if folder == "metadata" or folder == "meta-data":
- entry="RewriteRule ^meta-data/(.+)$ ../" + folder + "/%{REMOTE_ADDR}/$1 [L,NC,QSA]"
+ entry = "RewriteRule ^meta-data/(.+)$ ../" + folder + "/%{REMOTE_ADDR}/$1 [L,NC,QSA]"
htaccessFolder = "/var/www/html/latest"
htaccessFile = htaccessFolder + "/.htaccess"
- if not entry in open(htaccessFile).read():
- open(htaccessFile, "a").write(entry + '\n')
+ fh = open(htaccessFile, "r+a")
+ exflock(fh)
+ if not entry in fh.read():
+ fh.write(entry + '\n')
- entry="RewriteRule ^meta-data/$ ../" + folder + "/%{REMOTE_ADDR}/meta-data [L,NC,QSA]"
+ entry = "RewriteRule ^meta-data/$ ../" + folder + "/%{REMOTE_ADDR}/meta-data [L,NC,QSA]"
- if not entry in open(htaccessFile).read():
- open(htaccessFile, "a").write(entry + '\n')
+ fh.seek(0)
+ if not entry in fh.read():
+ fh.write(entry + '\n')
+ unflock(fh)
+ fh.close()
+def exflock(file):
+ try:
+ flock(file, LOCK_EX)
+ except IOError as e:
+ print "failed to lock file" + file.name + " due to : " + e.strerror
+ sys.exit(1)
+ return True
+
+def unflock(file):
+ try:
+ flock(file, LOCK_UN)
+ except IOError:
+ print "failed to unlock file" + file.name + " due to : " + e.strerror
+ sys.exit(1)
+ return True
if __name__ == "__main__":
main(sys.argv[1:])