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
|
#include "squid.h"
#include "Store.h"
#include "MemObject.h"
#include "SwapDir.h"
static struct {
struct {
int calls;
int select_fail;
int create_fail;
int success;
} create;
} 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::Pointer
storeCreate(StoreEntry * e, StoreIOState::STFNCB * file_callback, StoreIOState::STIOCB * close_callback, void *callback_data)
{
assert (e);
ssize_t objsize;
sdirno dirn;
RefCount<SwapDir> SD;
store_io_stats.create.calls++;
/* This is just done for logging purposes */
objsize = e->objectLen();
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) {
debugs(20, 2, "storeCreate: no valid swapdirs for this object");
store_io_stats.create.select_fail++;
return NULL;
}
debugs(20, 2, "storeCreate: Selected dir '" << dirn << "' for obj size '" << objsize << "'");
SD = dynamic_cast<SwapDir *>(INDEXSD(dirn));
/* Now that we have a fs to use, call its storeCreate function */
StoreIOState::Pointer sio = SD->createStoreIO(*e, file_callback, close_callback, callback_data);
if (sio == NULL)
store_io_stats.create.create_fail++;
else
store_io_stats.create.success++;
return sio;
}
/*
* storeOpen() is purely for reading ..
*/
StoreIOState::Pointer
storeOpen(StoreEntry * e, StoreIOState::STFNCB * file_callback, StoreIOState::STIOCB * callback,
void *callback_data)
{
return dynamic_cast<SwapDir *>(e->store().getRaw())->openStoreIO(*e, file_callback, callback, callback_data);
}
void
storeClose(StoreIOState::Pointer sio)
{
if (sio->flags.closing) {
debugs(20,3,HERE << "storeClose: flags.closing already set, bailing");
return;
}
sio->flags.closing = 1;
debugs(20,3,HERE << "storeClose: calling sio->close()");
sio->close();
}
void
storeRead(StoreIOState::Pointer sio, char *buf, size_t size, off_t offset, StoreIOState::STRCB * callback, void *callback_data)
{
sio->read_(buf, size, offset, callback, callback_data);
}
void
storeIOWrite(StoreIOState::Pointer sio, char const *buf, size_t size, off_t offset, FREE * free_func)
{
sio->write(buf,size,offset,free_func);
}
/*
* 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);
}
|