Thanks for the explanation Greg. I think that having even 64 bytes would be useful for most scenarios I can think of, and in the worst case it could be used to provide a unique identifier to retrieve a larger blob. On Mon, Jun 5, 2017 at 11:04 AM, Gregory Farnum <gfarnum@xxxxxxxxxx> wrote: > > > On Mon, Jun 5, 2017 at 10:43 AM Noah Watkins <noahwatkins@xxxxxxxxx> wrote: >> >> I haven't taken the time to really grok why the limitation exists >> (e.g. i'd be interested in to know if it's fundamental). There is a >> comment here: >> >> https://github.com/ceph/ceph/blob/master/src/osd/PrimaryLogPG.cc#L3221 > > > We need to send back identical data if an operation is retried (because, > say, an OSD failed and we're sending it to the new primary). That's not > possible if an op performs a read (which it returns) and then write, because > that (or a later op) may have overwritten the data being read. > > Fixing it would require we persist the entire returned bufferlist, which > isn't feasible in general. There's a proposal that gets floated periodically > about letting write ops return up to 64 bytes or something, and persisting > those in the pglog for reliable delivery on retries. But I don't recall if > anybody's actually made progress on it. (We did get *closer* to real work > last time, at least.) > -Greg > >> >> >> >> - Noah >> >> On Sat, Jun 3, 2017 at 8:18 PM, Zheyuan Chen <zchen137@xxxxxxxx> wrote: >> >> Unfortunately, this isn't a bug. Rados clears any returned data from >> >> an object class method if the operation also writes to the object. >> > >> > Do you have any idea why RADOS behaves like this? >> > >> > >> > >> > On Sat, Jun 3, 2017 at 9:30 AM, Noah Watkins <noahwatkins@xxxxxxxxx> >> > wrote: >> >> >> >> Comments inline >> >> >> >> > ---------- Forwarded message ---------- >> >> > From: Zheyuan Chen <zchen137@xxxxxxxx> >> >> > Date: Sat, Jun 3, 2017 at 1:45 PM >> >> > Subject: Bug report: unexpected behavior when executing >> >> > Lua object class >> >> > To: ceph-users@xxxxxxxxxxxxxx >> >> > >> >> > Bug 1: I can not get returned output in the first script. "data" is >> >> > always empty. >> >> > >> >> >> import rados, json >> >> >> cluster = rados.Rados(conffile='') >> >> >> cluster.connect() >> >> >> ioctx = cluster.open_ioctx('data') >> >> >> cmd = { >> >> >> "script": """ >> >> >> function test(input, output) >> >> >> data = bufferlist.new() >> >> >> data:append("test") >> >> >> objclass.write_full(data, #data) >> >> >> output:append("Here is the return value") >> >> >> end >> >> >> objclass.register(test) >> >> >> """, >> >> >> "handler": "test", >> >> >> "input": "", >> >> >> } >> >> >> # I can not get returned data >> >> >> ret, data = ioctx.execute('test', 'lua', 'eval_json', >> >> >> json.dumps(cmd)) >> >> >> print ret, data >> >> >> >> Unfortunately, this isn't a bug. Rados clears any returned data from >> >> an object class method if the operation also writes to the object. >> >> >> >> > Bug 2: >> >> > The returned mtime is always 0. >> >> >> >> This might be a bug, but there are a few things to rule out. Did you >> >> write to the object before running stat? There is also a test case >> >> here: can you try to run them? >> >> >> >> >> >> >> >> https://github.com/ceph/ceph/blob/master/src/test/cls_lua/test_cls_lua.cc#L679 >> >> >> >> - Noah >> > >> > >> _______________________________________________ >> ceph-users mailing list >> ceph-users@xxxxxxxxxxxxxx >> http://lists.ceph.com/listinfo.cgi/ceph-users-ceph.com _______________________________________________ ceph-users mailing list ceph-users@xxxxxxxxxxxxxx http://lists.ceph.com/listinfo.cgi/ceph-users-ceph.com