MongoDB

2011/6/28
•                  @nobu_k

    •   Preferred Infrastructure (PFI)
    •   Sedue

•   Sedue        MongoDB(1.6)

    •                 CT○

        •   http://slidesha.re/hl8PyL
        •   MongoDB as Search Engine Repository
• oplog
•
• MongoDB
  • https://github.com/mongodb/mongo/
     commits/master/
•                 2011/6/26

    •2
•        pull
oplog


•
•                       2

    • createOplog
    • logOp
    • db/oplog[h,cpp]
•
createOplog


• oplog
•
createOplog
void createOplog() {                                 > use local
  dblock lk;     // DB                               switched to db local
                                                     > show collections
                             // DB.                  me
  const char * ns = "local.oplog.$main";             oplog.$main
                                                     pair.sync
                                                     slaves
                                                     sources
                                                     system.indexes
  bool rs = !cmdLine._replSet.empty();
  if( rs )
      ns = rsoplog;      // "local.oplog.rs";
                         // in db/repl/rs_optime.h


                                 NS
oplog

Client::Context ctx(ns);         //         NS

NamespaceDetails * nsd = nsdetails( ns );

if ( nsd ) {    // oplog
   ...              ...
    ...                    ...
}
• oplog
• ReplicaSet

 •
oplog
•         oplog

•
    1. oplog

    2. BSON       NS

      •                BSON!!

    3. oplog
•
    • Mac
• oplog     capped collection
createOplog
•
    •   db/repl.cpp
    •   db/repl/rs_initialsync.cpp
    •   db/repl/rs_initiate.cpp
•   ReplicaSet



    •
•
    •   dblock
    •   CmdLine
    •   Context
    •   DBDirectClient
    •   NamespaceDetails, nsdetails
•
dblock
•   DB

    •   db/concurrency.h
•   Deprecated
    •                 writelock

•                  dbMutex

    •   scoped_lock

    •   RAII
CmdLine
•
    •   db/cmdline.[h, cpp]
•                                  boost::program_options



•   extern                            2

    •   db/db.cpp //

    •   client/clientOnly.cpp //
Client::Context
•
    •            NS

    •   Client

    •   db/client.[h,cpp]
•   RAII

•   DB
currentClient
•                                   Client

    •            Thread Local

    • boost::thread_specific_ptr<Client>
    • cc(), currenctClient, Context::getClient
•                            DB
DBDirectClient
•
•   DBClientInterface (client/dbclient.h)
•   DBConnector (client/dbclient.h)
•   DBClientWithCommands : public DBClientInterface
    •   DBClientBase : public DBClientWithCommands, public DBConnector
        •   DBDirectClient : public DBClientBase
•   findOne

    •   c.findOne→DBClientInterface::findOne→DBClientInterface::findN→(virtual
           )DBDirectClient::query→DBClientBase::query

        •               DBClientCursor

•
NamespaceDetails
• .ns               (1   )

•
  • Database
  • MongoDataFile
  • Record
•
nsdetails
•           Context NamespaceDetails

    •   db/pdfile.h
•   cc().database()->namespaceIndex->details
•   NamespaceIndex
    •   map<string, NamespaceDetails>

    •
logOp


•
•
oplog
{
    ts:                • oplog   BSON
    op:
    ns:       NS       •
    o: BSON

    o2:
}                      •          o2
•   i : insert
•   u : update
•   d : delete
•   c : db cmd? userCreateNS?
•   db : declares presence of a database
•   n : no op (              )

    •
    •   keep alive
•
logOp
_logOp

void logOp(const char *opstr, const char *ns,
 const BSONObj& obj, BSONObj *patt, bool *b) {
 if ( replSettings.master ) {
   _logOp(opstr, ns, 0, obj, patt, b);
 }

    logOpForSharding( opstr , ns , obj , patt );
}
_logOp
•
    • _logOpOld
    • _logOpRS
    • etc?
•
_logOpOld
•
• Record theDataFileMgr
  • fast_oplog_insert!!
•               (       mmap
    )
append_O_Obj
• partial ”o”+
•        BSONBuilder



 •
 • repeatedly          ed
_logOpRS


•
logOp


•
• grep it!
• applyOperation_inlock
• pretouch
We are hiring           !
•
    •
    •
•
    •
•
    •
    •   OSS

    •
•             (´   ω   `)

第一回MongoDBソースコードリーディング

  • 1.
  • 2.
    @nobu_k • Preferred Infrastructure (PFI) • Sedue • Sedue MongoDB(1.6) • CT○ • http://slidesha.re/hl8PyL • MongoDB as Search Engine Repository
  • 3.
  • 4.
    • MongoDB • https://github.com/mongodb/mongo/ commits/master/ • 2011/6/26 •2 • pull
  • 5.
  • 6.
    2 • createOplog • logOp • db/oplog[h,cpp] •
  • 7.
  • 8.
    createOplog void createOplog() { > use local dblock lk; // DB switched to db local > show collections // DB. me const char * ns = "local.oplog.$main"; oplog.$main pair.sync slaves sources system.indexes bool rs = !cmdLine._replSet.empty(); if( rs ) ns = rsoplog; // "local.oplog.rs"; // in db/repl/rs_optime.h NS
  • 9.
    oplog Client::Context ctx(ns); // NS NamespaceDetails * nsd = nsdetails( ns ); if ( nsd ) { // oplog ... ... ... ... }
  • 10.
  • 11.
    oplog • oplog • 1. oplog 2. BSON NS • BSON!! 3. oplog
  • 12.
    • Mac • oplog capped collection
  • 13.
    createOplog • • db/repl.cpp • db/repl/rs_initialsync.cpp • db/repl/rs_initiate.cpp • ReplicaSet •
  • 14.
    • dblock • CmdLine • Context • DBDirectClient • NamespaceDetails, nsdetails •
  • 15.
    dblock • DB • db/concurrency.h • Deprecated • writelock • dbMutex • scoped_lock • RAII
  • 16.
    CmdLine • • db/cmdline.[h, cpp] • boost::program_options • extern 2 • db/db.cpp // • client/clientOnly.cpp //
  • 17.
    Client::Context • • NS • Client • db/client.[h,cpp] • RAII • DB
  • 18.
    currentClient • Client • Thread Local • boost::thread_specific_ptr<Client> • cc(), currenctClient, Context::getClient • DB
  • 19.
    DBDirectClient • • DBClientInterface (client/dbclient.h) • DBConnector (client/dbclient.h) • DBClientWithCommands : public DBClientInterface • DBClientBase : public DBClientWithCommands, public DBConnector • DBDirectClient : public DBClientBase • findOne • c.findOne→DBClientInterface::findOne→DBClientInterface::findN→(virtual )DBDirectClient::query→DBClientBase::query • DBClientCursor •
  • 20.
    NamespaceDetails • .ns (1 ) • • Database • MongoDataFile • Record •
  • 21.
    nsdetails • Context NamespaceDetails • db/pdfile.h • cc().database()->namespaceIndex->details • NamespaceIndex • map<string, NamespaceDetails> •
  • 22.
  • 23.
    oplog { ts: • oplog BSON op: ns: NS • o: BSON o2: } • o2
  • 24.
    i : insert • u : update • d : delete • c : db cmd? userCreateNS? • db : declares presence of a database • n : no op ( ) • • keep alive •
  • 25.
    logOp _logOp void logOp(const char*opstr, const char *ns, const BSONObj& obj, BSONObj *patt, bool *b) { if ( replSettings.master ) { _logOp(opstr, ns, 0, obj, patt, b); } logOpForSharding( opstr , ns , obj , patt ); }
  • 26.
    _logOp • • _logOpOld • _logOpRS • etc? •
  • 27.
    _logOpOld • • Record theDataFileMgr • fast_oplog_insert!! • ( mmap )
  • 28.
    append_O_Obj • partial ”o”+ • BSONBuilder • • repeatedly ed
  • 29.
  • 30.
  • 31.
  • 32.
    We are hiring ! • • • • • • • • OSS • • (´ ω `)