mirror of
https://github.com/ceph/ceph
synced 2025-03-05 07:48:55 +00:00
Stuffs kinda in a weird state...weird extcap compile error...cap caching
on client buffer not totally done git-svn-id: https://ceph.svn.sf.net/svnroot/ceph@1141 29311d96-e01e-0410-9327-a35deaab8ce9
This commit is contained in:
parent
1e0a427691
commit
73f4d1c4e5
@ -2784,6 +2784,9 @@ int Client::write(fh_t fh, const char *buf, off_t size, off_t offset,
|
||||
|
||||
dout(10) << "cur file size is " << in->inode.size << " wr size " << in->file_wr_size << endl;
|
||||
|
||||
ExtCap *write_ext_cap = in->get_ext_cap(uid);
|
||||
assert(write_ext_cap);
|
||||
|
||||
// do we have write file cap?
|
||||
while (!lazy && (in->file_caps() & CAP_FILE_WR) == 0) {
|
||||
dout(7) << " don't have write cap, waiting" << endl;
|
||||
@ -2813,7 +2816,7 @@ int Client::write(fh_t fh, const char *buf, off_t size, off_t offset,
|
||||
assert(objectcacher);
|
||||
|
||||
// write (this may block!)
|
||||
in->fc.write(offset, size, blist, client_lock);
|
||||
in->fc.write(offset, size, blist, client_lock, write_ext_cap);
|
||||
|
||||
} else {
|
||||
// legacy, inconsistent synchronous write.
|
||||
@ -2830,7 +2833,7 @@ int Client::write(fh_t fh, const char *buf, off_t size, off_t offset,
|
||||
dout(20) << " sync write start " << onfinish << endl;
|
||||
|
||||
filer->write(in->inode, offset, size, blist, 0,
|
||||
onfinish, onsafe
|
||||
onfinish, onsafe, write_ext_cap
|
||||
//, 1+((int)g_clock.now()) / 10 //f->pos // hack hack test osd revision snapshots
|
||||
);
|
||||
|
||||
|
@ -136,7 +136,7 @@ int FileCache::read(off_t offset, size_t size, bufferlist& blist, Mutex& client_
|
||||
return r;
|
||||
}
|
||||
|
||||
void FileCache::write(off_t offset, size_t size, bufferlist& blist, Mutex& client_lock)
|
||||
void FileCache::write(off_t offset, size_t size, bufferlist& blist, Mutex& client_lock, ExtCap *write_ext_cap)
|
||||
{
|
||||
// inc writing counter
|
||||
num_writing++;
|
||||
@ -146,10 +146,10 @@ void FileCache::write(off_t offset, size_t size, bufferlist& blist, Mutex& clien
|
||||
oc->wait_for_write(size, client_lock);
|
||||
|
||||
// async, caching, non-blocking.
|
||||
oc->file_write(inode, offset, size, blist);
|
||||
oc->file_write(inode, offset, size, blist, write_ext_cap);
|
||||
} else {
|
||||
// atomic, synchronous, blocking.
|
||||
oc->file_atomic_sync_write(inode, offset, size, blist, client_lock);
|
||||
oc->file_atomic_sync_write(inode, offset, size, blist, client_lock, write_ext_cap);
|
||||
}
|
||||
|
||||
// dec writing counter
|
||||
|
@ -7,6 +7,8 @@ using namespace std;
|
||||
#include "common/Cond.h"
|
||||
#include "mds/Capability.h"
|
||||
|
||||
#include "crypto/CryptoLib.h"
|
||||
using namespace CryptoLib;
|
||||
#include "crypto/ExtCap.h"
|
||||
|
||||
class ObjectCacher;
|
||||
@ -60,7 +62,8 @@ class FileCache {
|
||||
|
||||
int read(off_t offset, size_t size, bufferlist& blist, Mutex& client_lock,
|
||||
ExtCap *read_ext_cap=0); // may block.
|
||||
void write(off_t offset, size_t size, bufferlist& blist, Mutex& client_lock); // may block.
|
||||
void write(off_t offset, size_t size, bufferlist& blist, Mutex& client_lock,
|
||||
ExtCap *write_ext_cap=0); // may block.
|
||||
|
||||
};
|
||||
|
||||
|
@ -14,6 +14,7 @@
|
||||
#ifndef __EXTCAP_H
|
||||
#define __EXTCAP_H
|
||||
|
||||
#include "include/types.h"
|
||||
#include "include/buffer.h"
|
||||
#include "mds/Capability.h"
|
||||
|
||||
@ -22,6 +23,8 @@ using namespace std;
|
||||
#include "crypto/CryptoLib.h"
|
||||
using namespace CryptoLib;
|
||||
|
||||
#include "common/Clock.h"
|
||||
|
||||
class ExtCap {
|
||||
private:
|
||||
struct cap_data_t {
|
||||
|
@ -18,6 +18,8 @@
|
||||
#include <iomanip>
|
||||
using namespace std;
|
||||
|
||||
#include "crypto/ExtCap.h"
|
||||
|
||||
|
||||
typedef __uint32_t objectrev_t;
|
||||
|
||||
|
@ -2858,6 +2858,16 @@ void OSD::op_read(MOSDOp *op)//, PG *pg)
|
||||
//<< " in " << *pg
|
||||
<< endl;
|
||||
|
||||
// verify the capability
|
||||
ExtCap *op_capability = op->get_capability();
|
||||
if (op_capability) {
|
||||
cout << "OSD recieved a capability" << endl;
|
||||
if (op_capability->verif_extcap(monmap->get_key()))
|
||||
cout << "OSD successfully verified capability" << endl;
|
||||
else
|
||||
cout << "OSD failed to verify capability" << endl;
|
||||
}
|
||||
|
||||
long r = 0;
|
||||
bufferlist bl;
|
||||
|
||||
@ -3202,13 +3212,18 @@ void OSD::op_modify(MOSDOp *op, PG *pg)
|
||||
|
||||
// check for capability
|
||||
ExtCap *op_capability = op->get_capability();
|
||||
if (op_capability) {
|
||||
cout << "OSD recieved a capability" << endl;
|
||||
if (op_capability && op->get_op() == OSD_OP_WRITE) {
|
||||
cout << "OSD recieved a write with a capability" << endl;
|
||||
if (op_capability->verif_extcap(monmap->get_key()))
|
||||
cout << "OSD successfully verified capability" << endl;
|
||||
else
|
||||
cout << "OSD failed to verify capability" << endl;
|
||||
}
|
||||
else if (op->get_op() == OSD_OP_WRITE) {
|
||||
cout << "Received write with no capability" << endl;
|
||||
}
|
||||
else
|
||||
cout << "Received " << opname << " with no capability" << endl;
|
||||
|
||||
// locked by someone else?
|
||||
// for _any_ op type -- eg only the locker can unlock!
|
||||
|
@ -102,9 +102,13 @@ class Filer {
|
||||
bufferlist& bl,
|
||||
int flags,
|
||||
Context *onack,
|
||||
Context *oncommit,
|
||||
Context *oncommit, ExtCap* write_cap=0,
|
||||
objectrev_t rev=0) {
|
||||
Objecter::OSDWrite *wr = new Objecter::OSDWrite(bl);
|
||||
Objecter::OSDWrite *wr;
|
||||
if (!write_cap) // we should always pass a cap
|
||||
wr = new Objecter::OSDWrite(bl);
|
||||
else
|
||||
wr = new Objecter::OSDWrite(bl, write_cap);
|
||||
file_to_extents(inode, offset, len, wr->extents, rev);
|
||||
return objecter->modifyx(wr, onack, oncommit) > 0 ? 0:-1;
|
||||
}
|
||||
|
@ -356,7 +356,7 @@ ObjectCacher::BufferHead *ObjectCacher::Object::map_write(Objecter::OSDWrite *wr
|
||||
left -= glen;
|
||||
continue; // more?
|
||||
}
|
||||
}
|
||||
s }
|
||||
}
|
||||
|
||||
// set versoin
|
||||
@ -454,7 +454,7 @@ void ObjectCacher::bh_read_finish(object_t oid, off_t start, size_t length, buff
|
||||
}
|
||||
|
||||
|
||||
void ObjectCacher::bh_write(BufferHead *bh)
|
||||
void ObjectCacher::bh_write(BufferHead *bh, ExtCap *write_cap)
|
||||
{
|
||||
dout(7) << "bh_write " << *bh << endl;
|
||||
|
||||
@ -464,7 +464,7 @@ void ObjectCacher::bh_write(BufferHead *bh)
|
||||
|
||||
// go
|
||||
tid_t tid = objecter->write(bh->ob->get_oid(), bh->start(), bh->length(), bh->bl,
|
||||
onack, oncommit);
|
||||
onack, oncommit, write_cap);
|
||||
|
||||
// set bh last_write_tid
|
||||
onack->tid = tid;
|
||||
@ -824,6 +824,7 @@ int ObjectCacher::writex(Objecter::OSDWrite *wr, inodeno_t ino)
|
||||
{
|
||||
utime_t now = g_clock.now();
|
||||
|
||||
// grab all objects in the extent
|
||||
for (list<ObjectExtent>::iterator ex_it = wr->extents.begin();
|
||||
ex_it != wr->extents.end();
|
||||
ex_it++) {
|
||||
@ -832,7 +833,9 @@ int ObjectCacher::writex(Objecter::OSDWrite *wr, inodeno_t ino)
|
||||
|
||||
// map it all into a single bufferhead.
|
||||
BufferHead *bh = o->map_write(wr);
|
||||
|
||||
// set security cap in bh
|
||||
bh->bh_cap = wr->modify_cap;
|
||||
|
||||
// adjust buffer pointers (ie "copy" data into my cache)
|
||||
// this is over a single ObjectExtent, so we know that
|
||||
// - there is one contiguous bh
|
||||
@ -863,7 +866,7 @@ int ObjectCacher::writex(Objecter::OSDWrite *wr, inodeno_t ino)
|
||||
map<off_t,BufferHead*>::iterator p = o->data.find(bh->start());
|
||||
if (p != o->data.begin()) {
|
||||
p--;
|
||||
if (p->second->is_dirty()) {
|
||||
if (p->second->is_dirty() && p->second->bh_cap == bh->bh_cap) {
|
||||
o->merge_left(p->second,bh);
|
||||
bh = p->second;
|
||||
}
|
||||
@ -872,7 +875,8 @@ int ObjectCacher::writex(Objecter::OSDWrite *wr, inodeno_t ino)
|
||||
p = o->data.find(bh->start());
|
||||
p++;
|
||||
if (p != o->data.end() &&
|
||||
p->second->is_dirty())
|
||||
p->second->is_dirty() &&
|
||||
p->second->bh_cap == bh->bh_cap)
|
||||
o->merge_left(p->second,bh);
|
||||
}
|
||||
|
||||
@ -1270,8 +1274,9 @@ bool ObjectCacher::flush(Object *ob)
|
||||
continue;
|
||||
}
|
||||
if (!bh->is_dirty()) continue;
|
||||
|
||||
bh_write(bh);
|
||||
// get capability for write back
|
||||
ExtCap *write_cap = ob->ocap;
|
||||
bh_write(bh, write_cap);
|
||||
clean = false;
|
||||
}
|
||||
return clean;
|
||||
|
@ -23,6 +23,10 @@
|
||||
#include "Objecter.h"
|
||||
#include "Filer.h"
|
||||
|
||||
//#include "crypto/CryptoLib.h"
|
||||
//using namespace CryptoLib;
|
||||
//#include "crypto/ExtCap.h"
|
||||
|
||||
class Objecter;
|
||||
class Objecter::OSDRead;
|
||||
class Objecter::OSDWrite;
|
||||
@ -55,6 +59,9 @@ class ObjectCacher {
|
||||
bufferlist bl;
|
||||
tid_t last_write_tid; // version of bh (if non-zero)
|
||||
utime_t last_write;
|
||||
|
||||
// security cap
|
||||
ExtCap *bh_cap;
|
||||
|
||||
map< off_t, list<Context*> > waitfor_read;
|
||||
|
||||
@ -110,7 +117,7 @@ class ObjectCacher {
|
||||
ObjectCacher *oc;
|
||||
object_t oid; // this _always_ is oid.rev=0
|
||||
inodeno_t ino;
|
||||
objectrev_t rev; // last rev we're written
|
||||
objectrev_t rev; // last rev we're written
|
||||
|
||||
public:
|
||||
map<off_t, BufferHead*> data;
|
||||
@ -344,7 +351,7 @@ class ObjectCacher {
|
||||
|
||||
// io
|
||||
void bh_read(BufferHead *bh, ExtCap* read_ext_cap=0);
|
||||
void bh_write(BufferHead *bh);
|
||||
void bh_write(BufferHead *bh, ExtCap *write_cap=0);
|
||||
|
||||
void trim(off_t max=-1);
|
||||
void flush(off_t amount=0);
|
||||
@ -493,9 +500,13 @@ class ObjectCacher {
|
||||
|
||||
int file_write(inode_t& inode,
|
||||
off_t offset, size_t len,
|
||||
bufferlist& bl,
|
||||
bufferlist& bl, ExtCap *write_ext_cap,
|
||||
objectrev_t rev=0) {
|
||||
Objecter::OSDWrite *wr = new Objecter::OSDWrite(bl);
|
||||
Objecter::OSDWrite *wr;
|
||||
if (!write_ext_cap)
|
||||
wr = new Objecter::OSDWrite(bl);
|
||||
else
|
||||
wr = new Objecter::OSDWrite(bl, write_ext_cap);
|
||||
filer.file_to_extents(inode, offset, len, wr->extents);
|
||||
return writex(wr, inode.ino);
|
||||
}
|
||||
@ -520,7 +531,7 @@ class ObjectCacher {
|
||||
int file_atomic_sync_write(inode_t& inode,
|
||||
off_t offset, size_t len,
|
||||
bufferlist& bl,
|
||||
Mutex &lock,
|
||||
Mutex &lock, ExtCap *write_ext_cap=0,
|
||||
objectrev_t rev=0) {
|
||||
Objecter::OSDWrite *wr = new Objecter::OSDWrite(bl);
|
||||
filer.file_to_extents(inode, offset, len, wr->extents);
|
||||
|
@ -586,9 +586,13 @@ void Objecter::handle_osd_read_reply(MOSDOpReply *m)
|
||||
|
||||
tid_t Objecter::write(object_t oid, off_t off, size_t len, bufferlist &bl,
|
||||
Context *onack, Context *oncommit,
|
||||
objectrev_t rev)
|
||||
ExtCap *write_ext_cap, objectrev_t rev)
|
||||
{
|
||||
OSDWrite *wr = new OSDWrite(bl);
|
||||
OSDWrite *wr;
|
||||
if (write_ext_cap)
|
||||
wr = new OSDWrite(bl, write_ext_cap);
|
||||
else
|
||||
wr = new OSDWrite(bl);
|
||||
wr->extents.push_back(ObjectExtent(oid, off, len));
|
||||
wr->extents.front().pgid = osdmap->object_to_pg( oid, g_OSD_FileLayout );
|
||||
wr->extents.front().buffer_extents[0] = len;
|
||||
@ -662,6 +666,9 @@ tid_t Objecter::modifyx_submit(OSDModify *wr, ObjectExtent &ex, tid_t usetid)
|
||||
m->set_length(ex.length);
|
||||
m->set_offset(ex.start);
|
||||
m->set_rev(ex.rev);
|
||||
// only cap for a write, fix later
|
||||
if (wr->modify_cap && wr->op == OSD_OP_WRITE)
|
||||
m->set_capability(wr->modify_cap);
|
||||
|
||||
if (wr->tid_version.count(tid))
|
||||
m->set_version(wr->tid_version[tid]); // we're replaying this op!
|
||||
|
@ -85,8 +85,10 @@ class Objecter {
|
||||
map<tid_t, ObjectExtent> waitfor_ack;
|
||||
map<tid_t, eversion_t> tid_version;
|
||||
map<tid_t, ObjectExtent> waitfor_commit;
|
||||
ExtCap *modify_cap;
|
||||
|
||||
OSDModify(int o) : op(o), onack(0), oncommit(0) {}
|
||||
OSDModify(int o, ExtCap* cap) : op(o), onack(0), oncommit(0), modify_cap(cap) {}
|
||||
};
|
||||
|
||||
// write (includes the bufferlist)
|
||||
@ -94,6 +96,7 @@ class Objecter {
|
||||
public:
|
||||
bufferlist bl;
|
||||
OSDWrite(bufferlist &b) : OSDModify(OSD_OP_WRITE), bl(b) {}
|
||||
OSDWrite(bufferlist &b, ExtCap *write_cap) : OSDModify(OSD_OP_WRITE, write_cap), bl(b) {}
|
||||
};
|
||||
|
||||
|
||||
@ -186,10 +189,10 @@ class Objecter {
|
||||
|
||||
// even lazier
|
||||
tid_t read(object_t oid, off_t off, size_t len, bufferlist *bl,
|
||||
Context *onfinish, ExtCap* read_ext_cap=0,
|
||||
Context *onfinish, ExtCap *read_ext_cap=0,
|
||||
objectrev_t rev=0);
|
||||
tid_t write(object_t oid, off_t off, size_t len, bufferlist &bl,
|
||||
Context *onack, Context *oncommit,
|
||||
Context *onack, Context *oncommit, ExtCap *write_ext_cap=0,
|
||||
objectrev_t rev=0);
|
||||
tid_t zero(object_t oid, off_t off, size_t len,
|
||||
Context *onack, Context *oncommit,
|
||||
|
Loading…
Reference in New Issue
Block a user