Page MenuHomePhabricator

Standardise and improve checking for active connections
Open, Needs TriagePublic

Description

When checking for active connections, such as in depooling, instead of waiting until only the desired connections are active (i.e. replication user, orchestrator user, cumin user, etc) code will do a wild-card search.
For depooling, it is done via:

def _fetch_instance_connections_count_wikiusers(ins: MInst) -> int:                                                                                                                                                                                                                                                             
    """Count database instance connections matching wiki-related users."""                                                                                                                                                                                                                                                      
    sql = "SELECT COUNT(*) AS cnt FROM information_schema.processlist WHERE user LIKE '%%wiki%%'"                                                                                                                                                                                                                               
    row = ins.fetch_one_row(sql, ())                                                                                                                                                                                                                                                                                            
    return int(row["cnt"])

For the rolling restarts, it is done differently, including the time in between checks:

def depool(self, ticket: Optional[str]) -> bool:                                                                                                                                                                                                                                                                            
    # TODO: check if it's depoolable                                                                                                                                                                                                                                                                                        
    run("dbctl instance {} depool".format(self.host))                                                                                                                                                                                                                                                                       
    run('dbctl config commit -b -m "Depooling {} ({})"'.format(self.host, ticket))                                                                                                                                                                                                                                          
    start_depool_time = time.time()                                                                                                                                                                                                                                                                                         
    while True:                                                                                                                                                                                                                                                                                                             
        if (time.time() - start_depool_time) > 3600:                                                                                                                                                                                                                                                                        
            print("Depool timed out, repooling")                                                                                                                                                                                                                                                                            
            self.repool(ticket)                                                                                                                                                                                                                                                                                             
            return False                                                                                                                                                                                                                                                                                                    
        if self.has_traffic() and "--run" in sys.argv:                                                                                                                                                                                                                                                                      
            print("Sleeping for the traffic to drain")                                                                                                                                                                                                                                                                      
            time.sleep(60)                                                                                                                                                                                                                                                                                                  
        else:                                                                                                                                                                                                                                                                                                               
            break                                                                                                                                                                                                                                                                                                           
    return True

def has_traffic(self) -> bool:                                                                                                                                                                                                                                                                                              
    # TODO: Make the users check more strict and include root                                                                                                                                                                                                                                                               
    result = self.run_sql("SELECT * FROM information_schema.processlist WHERE User like '%wiki%';")                                                                                                                                                                                                                         
    return bool(result)

For the ES rolling restarts, there doesn't appear to be a check:

step("depool", "Depooling")                                                                                                                                                                                                                                                                                               
dbctl.instance.depool(host.hostname)                                                                                                                                                                                                                                                                                      
dbctl_commit_change(dbctl, host.dc, f"Depool {host.hostname}")                                                                                                                                                                                                                                                            
                                                                                                                                                                                                                                                                                                                          
step("drain", "Wait for connection draining after depool")                                                                                                                                                                                                                                                                
time.sleep(60 * 3)

The following may not be exhaustive, but it shows that there are some other cases too:

auto_schema/auto_schema/tests/test_functional_run.py
553:            '''db-mysql db1165 -N -e "SELECT * FROM information_schema.processlist WHERE User like '%wiki%';"''',
644:db-mysql db1165 -N -e "SELECT * FROM information_schema.processlist WHERE User like '%wiki%';"
735:            '''db-mysql db1165 -N -e "SELECT * FROM information_schema.processlist WHERE User like '%wiki%';"''',
757:            '''db-mysql dbNNNN -N -e "SELECT * FROM information_schema.processlist WHERE User like '%wiki%';"'''
758:            '''db-mysql dbNNNN -N -e "SELECT * FROM information_schema.processlist WHERE User like '%wiki%';"''',
759:            '''db-mysql dbNNNN -N -e "SELECT * FROM information_schema.processlist WHERE User like '%wiki%';"''',
864:db-mysql db1165 -N -e "SELECT * FROM information_schema.processlist WHERE User like '%wiki%';"
927:db-mysql db1168 -N -e "SELECT * FROM information_schema.processlist WHERE User like '%wiki%';"
987:db-mysql db1173 -N -e "SELECT * FROM information_schema.processlist WHERE User like '%wiki%';"
1047:db-mysql db1180 -N -e "SELECT * FROM information_schema.processlist WHERE User like '%wiki%';"
1235:            '''db-mysql db1168 -N -e "SELECT * FROM information_schema.processlist WHERE User like '%wiki%';"'''
1236:            '''db-mysql db1168 -N -e "SELECT * FROM information_schema.processlist WHERE User like '%wiki%';"''',
1237:            '''db-mysql db1168 -N -e "SELECT * FROM information_schema.processlist WHERE User like '%wiki%';"''',
1321:db-mysql db1168 -N -e "SELECT * FROM information_schema.processlist WHERE User like '%wiki%';"
1484:            '''db-mysql db1165 -N -e "SELECT * FROM information_schema.processlist WHERE User like '%wiki%';"''',
1489:            '''db-mysql db1175 -N -e "SELECT * FROM information_schema.processlist WHERE User like '%wiki%';"''',
1499:            '''db-mysql db1179 -N -e "SELECT * FROM information_schema.processlist WHERE User like '%wiki%';"''',

auto_schema/auto_schema/tests/test_replica_set.py
135:            '''db-mysql dbNNNN -N -e "SELECT * FROM information_schema.processlist WHERE User like '%wiki%';"''',

auto_schema/auto_schema/host.py
67:        result = self.run_sql("SELECT * FROM information_schema.processlist WHERE User like '%wiki%';")

cookbooks/cookbooks/sre/mysql/depool.py
57:    sql = "SELECT COUNT(*) AS cnt FROM information_schema.processlist WHERE user LIKE '%%wiki%%'"
85:        FROM information_schema.processlist GROUP BY user, command"""

cookbooks/tests/unit/sre/mysql/depool_test.py
70:    sql = "SELECT COUNT(*) AS cnt FROM information_schema.processlist WHERE user LIKE '%%wiki%%'"

scripts/__snapshots__/test_rolling_restart.ambr
24:    sql 'SELECT * FROM information_schema.processlist WHERE User like '%dump%';'
46:    sql 'SELECT * FROM information_schema.processlist WHERE User like '%dump%';'
72:    sql 'SELECT * FROM information_schema.processlist WHERE User like '%dump%';'
94:    sql 'SELECT * FROM information_schema.processlist WHERE User like '%dump%';'
120:    sql 'SELECT * FROM information_schema.processlist WHERE User like '%dump%';'
142:    sql 'SELECT * FROM information_schema.processlist WHERE User like '%dump%';'
168:    sql 'SELECT * FROM information_schema.processlist WHERE User like '%dump%';'
190:    sql 'SELECT * FROM information_schema.processlist WHERE User like '%dump%';'
216:    sql 'SELECT * FROM information_schema.processlist WHERE User like '%dump%';'
238:    sql 'SELECT * FROM information_schema.processlist WHERE User like '%dump%';'
264:    sql 'SELECT * FROM information_schema.processlist WHERE User like '%dump%';'
286:    sql 'SELECT * FROM information_schema.processlist WHERE User like '%dump%';'
312:    sql 'SELECT * FROM information_schema.processlist WHERE User like '%dump%';'
334:    sql 'SELECT * FROM information_schema.processlist WHERE User like '%dump%';'
360:    sql 'SELECT * FROM information_schema.processlist WHERE User like '%dump%';'
382:    sql 'SELECT * FROM information_schema.processlist WHERE User like '%dump%';'
408:    sql 'SELECT * FROM information_schema.processlist WHERE User like '%dump%';'
430:    sql 'SELECT * FROM information_schema.processlist WHERE User like '%dump%';'
456:    sql 'SELECT * FROM information_schema.processlist WHERE User like '%dump%';'
478:    sql 'SELECT * FROM information_schema.processlist WHERE User like '%dump%';'
504:    sql 'SELECT * FROM information_schema.processlist WHERE User like '%dump%';'
526:    sql 'SELECT * FROM information_schema.processlist WHERE User like '%dump%';'
552:    sql 'SELECT * FROM information_schema.processlist WHERE User like '%dump%';'
574:    sql 'SELECT * FROM information_schema.processlist WHERE User like '%dump%';'

scripts/rolling_restart.py
320:            res = host_section.run_sql(r"SELECT * FROM information_schema.processlist WHERE User like '%dump%';")
329:        res = host.run_sql(r"SELECT * FROM information_schema.processlist WHERE User like '%dump%';")

scripts/test_rolling_restart.py
63:            "SELECT * FROM information_schema.processlist WHERE User like '%dump%';",