~jorge/charms/precise/mysql/fix-metadata

« back to all changes in this revision

Viewing changes to hooks/config-changed

  • Committer: Clint Byrum
  • Date: 2012-08-21 21:08:46 UTC
  • Revision ID: clint@ubuntu.com-20120821210846-1gpq845w8aa9ibau
make dataset-size dynamic based on system memory

Show diffs side-by-side

added added

removed removed

Lines of Context:
6
6
import re
7
7
import hashlib
8
8
import os
 
9
from string import upper
9
10
 
10
11
num_re = re.compile('^[0-9]+$')
11
12
 
 
13
# Going for the biggest page size to avoid wasted bytes. InnoDB page size is
 
14
# 16MB
 
15
PAGE_SIZE = 16*1024*1024
 
16
 
12
17
configs=json.loads(check_output(['config-get','--format=json']))
13
18
 
 
19
def get_memtotal():
 
20
    with open('/proc/meminfo') as meminfo_file:
 
21
        meminfo = {}
 
22
        for line in meminfo_file:
 
23
            (key, mem) = line.split(':', 2)
 
24
            if key == 'MemTotal':
 
25
                (mtot, modifier) = mem.strip().split(' ')
 
26
                return '%s%s' % (mtot, upper(modifier[0]))
 
27
 
 
28
 
14
29
# There should be a library for this
15
30
def human_to_bytes(human):
16
31
    if num_re.match(human):
19
34
    modifier=human[-1]
20
35
    if modifier in factors:
21
36
        return int(human[:-1]) * factors[modifier]
22
 
    raise Exception("Can only convert K,M,G, or T")
 
37
    if modifier == '%':
 
38
        total_ram = human_to_bytes(get_memtotal())
 
39
        factor = int(human[:-1]) * 0.01
 
40
        pctram = total_ram * factor
 
41
        return int(pctram - (pctram % PAGE_SIZE))
 
42
    raise ValueError("Can only convert K,M,G, or T")
23
43
 
24
44
# smart-calc stuff in the configs
25
45
dataset_bytes = human_to_bytes(configs['dataset-size'])
26
46
 
 
47
check_call(['juju-log','-l','INFO','dataset size in bytes: %d' % dataset_bytes])
 
48
 
27
49
if configs['query-cache-size'] == -1 and configs['query-cache-type'] in ['ON','DEMAND']:
28
 
    configs['query-cache-size'] = int(dataset_bytes * 0.20)
29
 
    dataset_bytes -= configs['query-cache-size']
 
50
    qcache_bytes = (dataset_bytes * 0.20)
 
51
    qcache_bytes = int(qcache_bytes - (qcache_bytes % PAGE_SIZE))
 
52
    configs['query-cache-size'] = qcache_bytes
 
53
    dataset_bytes -= qcache_bytes
30
54
 
31
55
# 5.5 allows the words, but not 5.1
32
56
if configs['query-cache-type'] == 'ON':