summaryrefslogtreecommitdiff
path: root/src/mongo/db/cloner.h
diff options
context:
space:
mode:
authorBen Becker <ben.becker@10gen.com>2012-12-06 14:38:10 -0800
committerBen Becker <ben.becker@10gen.com>2012-12-06 14:38:10 -0800
commit5e5afe90d148fb93d4c0b05470681d57de5bc3e9 (patch)
tree9d1370fbd01450d7df4b8604d7348f3760c1c701 /src/mongo/db/cloner.h
parent0ed90ac0464147051864d722fc7b7833bbe383b3 (diff)
downloadmongo-5e5afe90d148fb93d4c0b05470681d57de5bc3e9.tar.gz
SERVER-3160: Sort index keys during clone
Diffstat (limited to 'src/mongo/db/cloner.h')
-rw-r--r--src/mongo/db/cloner.h106
1 files changed, 85 insertions, 21 deletions
diff --git a/src/mongo/db/cloner.h b/src/mongo/db/cloner.h
index f42a32fe010..16ae3ec4fc3 100644
--- a/src/mongo/db/cloner.h
+++ b/src/mongo/db/cloner.h
@@ -18,10 +18,94 @@
#pragma once
-#include "jsobj.h"
+#include "mongo/db/jsobj.h"
+#include "mongo/db/sort_phase_one.h"
namespace mongo {
+ class CloneOptions;
+ class IndexSpec;
+ class DBClientBase;
+ class DBClientCursor;
+ class Query;
+
+ class Cloner: boost::noncopyable {
+ public:
+ Cloner();
+ /**
+ * slaveOk - if true it is ok if the source of the data is !ismaster.
+ * useReplAuth - use the credentials we normally use as a replication slave for the cloning
+ * snapshot - use $snapshot mode for copying collections. note this should not be used
+ * when it isn't required, as it will be slower. for example,
+ * repairDatabase need not use it.
+ */
+ void setConnection( DBClientBase *c ) { _conn.reset( c ); }
+
+ /** copy the entire database */
+ bool go(const char *masterHost, string& errmsg, const string& fromdb, bool logForRepl,
+ bool slaveOk, bool useReplAuth, bool snapshot, bool mayYield,
+ bool mayBeInterrupted, int *errCode = 0);
+
+ bool go(const char *masterHost, const CloneOptions& opts, set<string>& clonedColls,
+ string& errmsg, int *errCode = 0);
+
+ bool go(const char *masterHost, const CloneOptions& opts, string& errmsg, int *errCode = 0);
+
+ bool copyCollection(const string& ns, const BSONObj& query, string& errmsg,
+ bool mayYield, bool mayBeInterrupted, bool copyIndexes = true,
+ bool logForRepl = true );
+ /**
+ * validate the cloner query was successful
+ * @param cur Cursor the query was executed on
+ * @param errCode out Error code encountered during the query
+ */
+ static bool validateQueryResults(const auto_ptr<DBClientCursor>& cur, int32_t* errCode);
+
+ /**
+ * @param errmsg out - Error message (if encountered).
+ * @param slaveOk - if true it is ok if the source of the data is !ismaster.
+ * @param useReplAuth - use the credentials we normally use as a replication slave for the
+ * cloning.
+ * @param snapshot - use $snapshot mode for copying collections. note this should not be
+ * used when it isn't required, as it will be slower. for example
+ * repairDatabase need not use it.
+ * @param errCode out - If provided, this will be set on error to the server's error code.
+ * Currently this will only be set if there is an error in the initial
+ * system.namespaces query.
+ */
+ static bool cloneFrom(const char *masterHost, string& errmsg, const string& fromdb,
+ bool logForReplication, bool slaveOk, bool useReplAuth,
+ bool snapshot, bool mayYield, bool mayBeInterrupted,
+ int *errCode = 0);
+
+ static bool cloneFrom(const string& masterHost, const CloneOptions& options,
+ string& errmsg, int* errCode = 0,
+ set<string>* clonedCollections = 0);
+
+ /**
+ * Copy a collection (and indexes) from a remote host
+ */
+ static bool copyCollectionFromRemote(const string& host, const string& ns, string& errmsg);
+
+ private:
+ void copy(const char *from_ns, const char *to_ns, bool isindex, bool logForRepl,
+ bool masterSameProcess, bool slaveOk, bool mayYield, bool mayBeInterrupted,
+ Query q);
+
+ // index presort info
+ typedef struct {
+ IndexSpec spec;
+ SortPhaseOne preSortPhase;
+ } PreSortDetails;
+
+ typedef map<string, PreSortDetails> SortersForIndex; // map from index name to presorter
+ typedef map<string, SortersForIndex> SortersForNS; // map from ns to indices/sorters
+
+ struct Fun;
+ auto_ptr<DBClientBase> _conn;
+ SortersForNS _sortersForNS;
+ };
+
struct CloneOptions {
CloneOptions() {
@@ -50,24 +134,4 @@ namespace mongo {
bool syncIndexes;
};
- bool cloneFrom( const string& masterHost ,
- const CloneOptions& options ,
- string& errmsg /* out */ ,
- int* errCode = 0 /* out */ ,
- set<string>* clonedCollections = 0 /* out */ );
-
- /**
- * @param slaveOk - if true it is ok if the source of the data is !ismaster.
- * @param useReplAuth - use the credentials we normally use as a replication slave for the cloning
- * @param snapshot - use $snapshot mode for copying collections. note this should not be used when it isn't required, as it will be slower.
- * for example repairDatabase need not use it.
- * @param errCode - If provided, this will be set on error to the server's error code. Currently
- * this will only be set if there is an error in the initial system.namespaces query.
- */
- bool cloneFrom(const char *masterHost, string& errmsg, const string& fromdb, bool logForReplication,
- bool slaveOk, bool useReplAuth, bool snapshot, bool mayYield,
- bool mayBeInterrupted, int *errCode = 0);
-
- bool copyCollectionFromRemote(const string& host, const string& ns, string& errmsg);
-
} // namespace mongo