Skip to content

Instantly share code, notes, and snippets.

@RedBeard0531
Forked from anonymous/gist:873505
Created March 16, 2011 23:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save RedBeard0531/873508 to your computer and use it in GitHub Desktop.
Save RedBeard0531/873508 to your computer and use it in GitHub Desktop.
#!/usr/bin/python
from pymongo import Connection
import subprocess
import sys
def advance(cur)
try:
return cur.next()
except StopIteration:
return None
def main():
# Master ought to come first.
(host1, host2, dbname1) = sys.argv[1:5]
# These are hooey that, by murphy's law, I'd have to write if I
# didn't write them.
if (len(sys.argv)) > 4:
dbname2 = sys.argv[5]
else:
dbname2 = dbname1
if (len(sys.argv)) > 5:
port1 = sys.argv[6]
else:
port1="27017"
if (len(sys.argv)) > 6:
port2 = sys.argv[7]
else:
port2="27017"
# Make two connections,
conn1 = Connection(host1, int(port1))
conn2 = Connection(host2, int(port2))
# Get two dbs
db1 = conn1[dbname1]
db2 = conn2[dbname2]
# TODO: check for matching collections
for collname in db1.collection_names():
msg1="Missing from %s: %s %%s" % (host1, collname)
msg2="Missing from %s: %s %%s" % (host2, collname)
# Get two collections.
coll1=db1[collname]
coll2=db2[collname]
# Get two cursors.
cur1=iter(coll1.find(snapshot=True).sort("_id"))
cur2=iter(coll2.find(snapshot=True).sort("_id"))
while True:
doc1 = advance(cur1)
if not doc1: # no more in cur1, exhaust cur2
for doc2 in cur2:
print msg1 % doc2["_id"]
break
doc2 = advance(cur2)
if not doc2:
for doc1 in cur1:
print msg2 % doc1["_id"]
break
id1=doc1["_id"]
id2=doc2["_id"]
if id1 == id2: # same obj
if doc1 != doc2:
print "Skew: %s %s" % (collname, id1)
elif (id1 < id2):
print msg2 % id1
for doc1 in cur1:
id1 = doc1["_id"]
if id1 == id2:
break
else:
print msg2 % id1
else: # id1 > id2
print msg1 % id2
for doc2 in cur2:
id2 = doc2["_id"]
if id1 == id2:
break
else:
print msg1 % id2
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment