Igor Gariev (gariev) wrote in changelog,
Igor Gariev
gariev
changelog

[livejournal] r20299: LJSUP-10124: [internal] Make user cluste...

Committer: gariev
LJSUP-10124: [internal] Make user cluster DB switching dynamically
U   trunk/cgi-bin/LJ/DBUtil.pm
U   trunk/cgi-bin/LJ/User.pm
U   trunk/cgi-bin/ljdb.pl
U   trunk/cgi-bin/ljlib.pl
Modified: trunk/cgi-bin/LJ/DBUtil.pm
===================================================================
--- trunk/cgi-bin/LJ/DBUtil.pm	2011-10-12 18:20:17 UTC (rev 20298)
+++ trunk/cgi-bin/LJ/DBUtil.pm	2011-10-13 00:47:07 UTC (rev 20299)
@@ -15,14 +15,25 @@
     print STDERR " - cluster $cid... " if $verbose;
 
     # find approparite db server to connect to
-    my $role = "cluster$cid";
-    if (my $ab = $LJ::CLUSTER_PAIR_ACTIVE{$cid}) {
-        $role .= "b" if $ab eq 'a';
-        $role .= "a" if $ab eq 'b';
-
-        print STDERR "{active=$ab, using=$role}\n" if $verbose;
+    my $role;
+    if ($LJ::IS_DEV_SERVER) {
+        $role = "cluster$cid";
     } else {
-        die "invalid cluster: $cid ?\n";
+        my $block_id = 'cluster_config.rc';
+        my $block = LJ::ExtBlock->load_by_id($block_id, {cache_valid => 15});
+        if ($block && $block->data->{$cid}) {
+            my $c = $block->data->{$cid};
+            my $ab = ($c->{'active'} eq 'a') ? 'b' : 'a';
+            if ($c->{'dead'} && ($c->{'dead'} eq $ab) {
+                ## oops, inactive db is dead
+                warn " inactivve DB $ab is marked dead";
+                return;
+            } else {
+                $role = "cluster${cid}$ab";
+            }
+        } else {
+            $role = "cluster${cid}a";
+        }
     }
 
     $LJ::DBIRole->clear_req_cache();
@@ -53,8 +64,7 @@
     my $clid = shift;
     my $verbose = shift;
     
-    my $dbr = ($LJ::IS_DEV_SERVER) ?
-        LJ::get_cluster_reader($clid) : LJ::DBUtil->get_inactive_db($clid);
+    my $dbr = LJ::DBUtil->get_inactive_db($clid);
     unless ($dbr) {
         warn "Using master database for cluster #$clid"
             if $verbose;

Modified: trunk/cgi-bin/LJ/User.pm
===================================================================
--- trunk/cgi-bin/LJ/User.pm	2011-10-12 18:20:17 UTC (rev 20298)
+++ trunk/cgi-bin/LJ/User.pm	2011-10-13 00:47:07 UTC (rev 20299)
@@ -3472,15 +3472,6 @@
     return LJ::load_userid($inviterid);
 }
 
-# front-end to LJ::cmd_buffer_add, which has terrible interface
-#   cmd: scalar
-#   args: hashref
-sub cmd_buffer_add {
-    my ($u, $cmd, $args) = @_;
-    $args ||= {};
-    return LJ::cmd_buffer_add($u->{clusterid}, $u->{userid}, $cmd, $args);
-}
-
 sub subscriptions {
     my $u = shift;
     return LJ::Subscription->subscriptions_of_user($u);
@@ -6112,60 +6103,60 @@
     return 0 unless $dbcm;
 
     my @keys = qw(
-        bio:#
-        cctry_uid:#
-        commsettings:#
-        dayct:#
-        fgrp:#
-        friendofs:#
-        friendofs2:#
-        friends:#
-        friends2:#
-        ident:#
-        inbox:newct:#
-        intids:#
-        invites:#
-        jablastseen:#
-        jabuser:#
-        kws:#
-        lastcomm:#
-        linkobj:#
-        log2ct:#
-        log2lt:#
-        logtag:#
-        mcrate:#
-        memct:#
-        memkwcnt:#
-        memkwid:#
-        msn:mutual_friends_wlids:uid=#
-        prtcfg:#
-        pw:#
-        rate:tracked:#
-        rcntalk:#
-        s1overr:#
-        s1uc:#
-        saui:#
-        subscriptions_count:#
-        supportpointsum:#
-        synd:#
-        tags2:#
-        talk2ct:#
-        talkleftct:#
-        tc:#
-        timeactive:#
-        timezone_guess:#
-        tu:#
-        txtmsgsecurity:#
-        uid2uniqs:#
-        upiccom:#
-        upicinf:#
-        upicquota:#
-        upicurl:#
-        userid:#
+        bio:*
+        cctry_uid:*
+        commsettings:*
+        dayct:*
+        fgrp:*
+        friendofs:*
+        friendofs2:*
+        friends:*
+        friends2:*
+        ident:*
+        inbox:newct:*
+        intids:*
+        invites:*
+        jablastseen:*
+        jabuser:*
+        kws:*
+        lastcomm:*
+        linkobj:*
+        log2ct:*
+        log2lt:*
+        logtag:*
+        mcrate:*
+        memct:*
+        memkwcnt:*
+        memkwid:*
+        msn:mutual_friends_wlids:uid=*
+        prtcfg:*
+        pw:*
+        rate:tracked:*
+        rcntalk:*
+        s1overr:*
+        s1uc:*
+        saui:*
+        subscriptions_count:*
+        supportpointsum:*
+        synd:*
+        tags2:*
+        talk2ct:*
+        talkleftct:*
+        tc:*
+        timeactive:*
+        timezone_guess:*
+        tu:*
+        txtmsgsecurity:*
+        uid2uniqs:*
+        upiccom:*
+        upicinf:*
+        upicquota:*
+        upicurl:*
+        userid:*
     );
 
     foreach my $key (@keys) {
-        $key =~ s/#/$u->{userid}/g;
+        $key =~ s/\*/$u->{userid}/g;
         LJ::MemCache::delete([ $u->{userid}, $key ]);
     }
 
@@ -9024,7 +9015,7 @@
                                                 );
                 $sclient->insert($job);
             } else {
-                LJ::cmd_buffer_add($u->{clusterid}, $u->{userid}, 'dirty', { what => 'friends' });
+                die "No schwartz client found";
             }
         };
     }

Modified: trunk/cgi-bin/ljdb.pl
===================================================================
--- trunk/cgi-bin/ljdb.pl	2011-10-12 18:20:17 UTC (rev 20298)
+++ trunk/cgi-bin/ljdb.pl	2011-10-13 00:47:07 UTC (rev 20299)
@@ -184,37 +184,6 @@
     return $LJ::DBIRole->get_dbh_conn( _connection_options(), $fdsn );
 }
 
-sub backup_in_progress {
-    my $name = shift;
-    my $dbh = dbh_by_role("master")
-        or die "Couldn't contact master to find name of '$name'";
-
-    # return 0 if this a/b is the active side, as wecan't ever have a backup of active side in progress
-    my ($cid, $is_a_or_b) = user_cluster_details($name);
-    if ($cid) {
-        my $active_ab = $LJ::CLUSTER_PAIR_ACTIVE{$cid} or
-            die "Neither 'a' nor 'b' is active for clusterid $cid?\n";
-        die "Bogus active side" unless $active_ab =~ /^[ab]$/;
-
-        # can't have a backup in progress for an active a/b side.  short-circuit
-        # and don't even ask the database, as it might lie if the process
-        # was killed or something
-        return 0 if $active_ab eq $is_a_or_b;
-    }
-
-    my $fdsn = $dbh->selectrow_array("SELECT rootfdsn FROM dbinfo WHERE name=?", undef, $name);
-    die "No rootfdsn found for db name '$name'\n" unless $fdsn;
-    $fdsn =~ /\bhost=([\w\.\-]+)/ or die "Can't find host for database '$name'";
-    my $host = $1;
-
-    eval "use IO::Socket::INET; 1;" or die;
-    my $sock = IO::Socket::INET->new(PeerAddr => "$host:7602")  or return 0;
-    print $sock "is_backup_in_progress\r\n";
-    my $answer = <$sock>;
-    chomp $answer;
-    return $answer eq "1";
-}
-
 sub user_cluster_details {
     my $name = shift;
     my $dbh = dbh_by_role("master") or die;
@@ -345,15 +314,7 @@
 # </LJFUNC>
 sub get_cluster_reader
 {
-    my $arg = shift;
-    my $id = isu($arg) ? $arg->{'clusterid'} : $arg;
-    my @roles = ("cluster${id}slave", "cluster${id}");
-    if (my $ab = $LJ::CLUSTER_PAIR_ACTIVE{$id}) {
-        $ab = lc($ab);
-        # master-master cluster
-        @roles = ("cluster${id}${ab}") if $ab eq "a" || $ab eq "b";
-    }
-    return LJ::get_dbh(@roles);
+    return LJ::get_cluster_master(@_);
 }
 
 # <LJFUNC>
@@ -368,12 +329,7 @@
 # </LJFUNC>
 sub get_cluster_def_reader
 {
-    my @dbh_opts = scalar(@_) == 2 ? (shift @_) : ();
-    my $arg = shift;
-    my $id = LJ::isu($arg) ? $arg->{'clusterid'} : $arg;
-    return LJ::get_cluster_reader(@dbh_opts, $id) if
-        $LJ::DEF_READER_ACTUALLY_SLAVE{$id};
-    return LJ::get_dbh(@dbh_opts, LJ::master_role($id));
+    return LJ::get_cluster_master(@_);
 }
 
 # <LJFUNC>
@@ -397,13 +353,15 @@
 # returns the DBI::Role role name of a cluster master given a clusterid
 sub master_role {
     my $id = shift;
-    my $role = "cluster${id}";
-    if (my $ab = $LJ::CLUSTER_PAIR_ACTIVE{$id}) {
-        $ab = lc($ab);
-        # master-master cluster
-        $role = "cluster${id}${ab}" if $ab eq "a" || $ab eq "b";
+    
+    if ($LJ::IS_DEV_SERVER) {
+        return "cluster${id}";
+    } else {
+        my $block_id = 'cluster_config.rc';
+        my $block = LJ::ExtBlock->load_by_id($block_id, {cache_valid => 15});
+        my $ab = ($block && $block->data->{$id}->{'active'}) ? $block->data->{$id}->{'active'} : 'a';
+        return "cluster${id}${ab}";
     }
-    return $role;
 }
 
 # <LJFUNC>
@@ -559,8 +517,7 @@
     my $opts = shift || {};
     
     foreach my $cluster_id (@LJ::CLUSTERS) {
-        my $dbr = ($LJ::IS_DEV_SERVER) ?
-            LJ::get_cluster_reader($cluster_id) : LJ::DBUtil->get_inactive_db($cluster_id, $opts->{verbose});
+        my $dbr = LJ::DBUtil->get_inactive_db($cluster_id, $opts->{verbose});
         $coderef->($cluster_id, $dbr);
     }
 }

Modified: trunk/cgi-bin/ljlib.pl
===================================================================
--- trunk/cgi-bin/ljlib.pl	2011-10-12 18:20:17 UTC (rev 20298)
+++ trunk/cgi-bin/ljlib.pl	2011-10-13 00:47:07 UTC (rev 20299)
@@ -1102,18 +1102,8 @@
     my $max_hints = $LJ::MAX_SCROLLBACK_LASTN;  # temporary
     my $sort_key = "revttime";
 
-    my $clusterid = $u->{'clusterid'} + 0;
-    my @sources = ("cluster$clusterid");
+    my $logdb = LJ::get_cluster_def_reader($u);
 
-    if (my $ab = $LJ::CLUSTER_PAIR_ACTIVE{$clusterid}) {
-        @sources = ("cluster${clusterid}${ab}");
-    }
-
-    unshift @sources, ("cluster${clusterid}lite", "cluster${clusterid}slave")
-        if $opts->{'clustersource'} eq "slave";
-
-    my $logdb = LJ::get_dbh(@sources);
-
     # community/friend views need to post by log time, not event time
     $sort_key = "rlogtime" if ($opts->{'order'} eq "logtime" ||
                                $opts->{'friendsview'});
@@ -2485,73 +2475,6 @@
 }
 
 # <LJFUNC>
-# name: LJ::cmd_buffer_add
-# des: Schedules some command to be run sometime in the future which would
-#      be too slow to do synchronously with the web request.  An example
-#      is deleting a journal entry, which requires recursing through a lot
-#      of tables and deleting all the appropriate stuff.
-# args: db, journalid, cmd, hargs
-# des-db: Global db handle to run command on, or user clusterid if cluster
-# des-journalid: Journal id command affects.  This is indexed in the
-#                [dbtable[cmdbuffer]] table, so that all of a user's queued
-#                actions can be run before that user is potentially moved
-#                between clusters.
-# des-cmd: Text of the command name.  30 chars max.
-# des-hargs: Hashref of command arguments.
-# </LJFUNC>
-sub cmd_buffer_add
-{
-    my ($db, $journalid, $cmd, $args) = @_;
-
-    return 0 unless $cmd;
-
-    my $cid = ref $db ? 0 : $db+0;
-    $db = $cid ? LJ::get_cluster_master($cid) : $db;
-    my $ab = $LJ::CLUSTER_PAIR_ACTIVE{$cid};
-
-    return 0 unless $db;
-
-    my $arg_str;
-    if (ref $args eq 'HASH') {
-        foreach (sort keys %$args) {
-            $arg_str .= LJ::eurl($_) . "=" . LJ::eurl($args->{$_}) . "&";
-        }
-        chop $arg_str;
-    } else {
-        $arg_str = $args || "";
-    }
-
-    my $rv;
-    if ($ab eq 'a' || $ab eq 'b') {
-        # get a lock
-        my $locked = $db->selectrow_array("SELECT GET_LOCK('cmd-buffer-$cid',10)");
-        return 0 unless $locked; # 10 second timeout elapsed
-
-        # a or b -- a goes odd, b goes even!
-        my $max = $db->selectrow_array('SELECT MAX(cbid) FROM cmdbuffer');
-        $max += $ab eq 'a' ? ($max & 1 ? 2 : 1) : ($max & 1 ? 1 : 2);
-
-        # insert command
-        $db->do('INSERT INTO cmdbuffer (cbid, journalid, instime, cmd, args) ' .
-                'VALUES (?, ?, NOW(), ?, ?)', undef,
-                $max, $journalid, $cmd, $arg_str);
-        $rv = $db->err ? 0 : 1;
-
-        # release lock
-        $db->selectrow_array("SELECT RELEASE_LOCK('cmd-buffer-$cid')");
-    } else {
-        # old method
-        $db->do("INSERT INTO cmdbuffer (journalid, cmd, instime, args) ".
-                "VALUES (?, ?, NOW(), ?)", undef,
-                $journalid, $cmd, $arg_str);
-        $rv = $db->err ? 0 : 1;
-    }
-
-    return $rv;
-}
-
-
-# <LJFUNC>
 # name: LJ::get_keyword_id
 # class:
 # des: Get the id for a keyword.
@@ -3150,12 +3073,6 @@
         return;
     }
 
-    # cluster switchovers
-    if ($cmd eq 'cluster_switch') {
-        $LJ::CLUSTER_PAIR_ACTIVE{ $arg->{'cluster'} } = $arg->{ 'role' };
-        return;
-    }
-
     if ($cmd eq LJ::AdTargetedInterests->procnotify_key) {
         LJ::AdTargetedInterests->reload;
         return;

Tags: gariev, livejournal, pl, pm
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 0 comments