File: store_io.c

package info (click to toggle)
squid 2.7.STABLE9-2.1
  • links: PTS
  • area: main
  • in suites: squeeze
  • size: 13,876 kB
  • ctags: 14,016
  • sloc: ansic: 114,686; sh: 5,472; makefile: 1,362; perl: 1,359; awk: 40; sql: 8
file content (162 lines) | stat: -rw-r--r-- 4,339 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#include "squid.h"

static struct {
    struct {
	int calls;
	int select_fail;
	int create_fail;
	int success;
    } create;
    struct {
	int calls;
	int success;
	int open_fail;
	int loadav_fail;
    } open;
} store_io_stats;

OBJH storeIOStats;

/*
 * submit a request to create a cache object for writing.
 * The StoreEntry structure is sent as a hint to the filesystem
 * to what will be stored in this object, to allow the filesystem
 * to select different polices depending on object size or type.
 */
storeIOState *
storeCreate(StoreEntry * e, STIOCB * file_callback, STIOCB * close_callback, void *callback_data)
{
    squid_off_t objsize;
    sdirno dirn;
    SwapDir *SD;
    storeIOState *sio;

    store_io_stats.create.calls++;
    /* This is just done for logging purposes */
    objsize = objectLen(e);
    if (objsize != -1)
	objsize += e->mem_obj->swap_hdr_sz;

    /*
     * Pick the swapdir
     * We assume that the header has been packed by now ..
     */
    dirn = storeDirSelectSwapDir(e);
    if (dirn == -1) {
	debug(20, 2) ("storeCreate: no valid swapdirs for this object\n");
	store_io_stats.create.select_fail++;
	return NULL;
    }
    debug(20, 2) ("storeCreate: Selected dir '%d' for obj size '%" PRINTF_OFF_T "'\n", dirn, objsize);
    SD = &Config.cacheSwap.swapDirs[dirn];

    /* Now that we have a fs to use, call its storeCreate function */
    sio = SD->obj.create(SD, e, file_callback, close_callback, callback_data);
    if (NULL == sio)
	store_io_stats.create.create_fail++;
    else
	store_io_stats.create.success++;
    return sio;
}


/*
 * storeOpen() is purely for reading ..
 */
storeIOState *
storeOpen(StoreEntry * e, STFNCB * file_callback, STIOCB * callback,
    void *callback_data)
{
    int load;
    storeIOState *sio;

    SwapDir *SD = &Config.cacheSwap.swapDirs[e->swap_dirn];
    store_io_stats.open.calls++;
    load = SD->checkload(SD, ST_OP_OPEN);
    if (load < 0 || load > 1000) {
	store_io_stats.open.loadav_fail++;
	return NULL;
    }
    sio = SD->obj.open(SD, e, file_callback, callback, callback_data);
    if (sio == NULL) {
	store_io_stats.open.open_fail++;
    } else {
	store_io_stats.open.success++;
    }
    return sio;
}

void
storeClose(storeIOState * sio)
{
    SwapDir *SD = &Config.cacheSwap.swapDirs[sio->swap_dirn];
    if (sio->flags.closing)
	return;
    sio->flags.closing = 1;
    SD->obj.close(SD, sio);
}

void
storeRead(storeIOState * sio, char *buf, size_t size, squid_off_t offset, STRCB * callback, void *callback_data)
{
    SwapDir *SD = &Config.cacheSwap.swapDirs[sio->swap_dirn];
    (SD->obj.read) (SD, sio, buf, size, offset, callback, callback_data);
}

void
storeWrite(storeIOState * sio, char *buf, size_t size, FREE * free_func)
{
    SwapDir *SD = &Config.cacheSwap.swapDirs[sio->swap_dirn];
    squid_off_t offset = sio->write_offset;
    sio->write_offset += size;
    (SD->obj.write) (SD, sio, buf, size, offset, free_func);
}

void
storeUnlink(StoreEntry * e)
{
    SwapDir *SD = INDEXSD(e->swap_dirn);
    SD->obj.unlink(SD, e);
}

void
storeRecycle(StoreEntry * e)
{
    if (e->swap_dirn >= 0 && !storeEntryLocked(e)) {
	SwapDir *SD = INDEXSD(e->swap_dirn);

	/* Expire the object */
	storeExpireNow(e);
	storeReleaseRequest(e);

	/* Make the cache_dir forget about it */
	SD->obj.recycle(SD, e);
    }
    /* Finally make the store layer forget about this object */
    storeRelease(e);
}


squid_off_t
storeOffset(storeIOState * sio)
{
    return sio->offset;
}

/*
 * Make this non-static so we can register
 * it from storeInit();
 */
void
storeIOStats(StoreEntry * sentry)
{
    storeAppendPrintf(sentry, "Store IO Interface Stats\n");
    storeAppendPrintf(sentry, "create.calls %d\n", store_io_stats.create.calls);
    storeAppendPrintf(sentry, "create.select_fail %d\n", store_io_stats.create.select_fail);
    storeAppendPrintf(sentry, "create.create_fail %d\n", store_io_stats.create.create_fail);
    storeAppendPrintf(sentry, "create.success %d\n", store_io_stats.create.success);
    storeAppendPrintf(sentry, "open.calls %d\n", store_io_stats.open.calls);
    storeAppendPrintf(sentry, "open.success %d\n", store_io_stats.open.success);
    storeAppendPrintf(sentry, "open.loadav_fail %d\n", store_io_stats.open.loadav_fail);
    storeAppendPrintf(sentry, "open.open_fail %d\n", store_io_stats.open.open_fail);
}