Dentry *dn = lookup(req->get_filepath());
inode_t inode;
time_t now = time(NULL);
- if (dn && ((now - dn->inode->last_updated) <= g_conf.client_cache_stat_ttl)) {
+ if (dn &&
+ ((now - dn->inode->last_updated) < g_conf.client_cache_stat_ttl)) {
inode = dn->inode->inode;
dout(10) << "lstat cache hit, age is " << (now - dn->inode->last_updated) << endl;
delete req; // don't need this
break;
case SYNCLIENT_MODE_MAKEDIRS:
make_dirs(sarg1.c_str(), iarg1, iarg2, iarg3);
+ {
+ string root;
+ full_walk(root);
+ }
break;
case SYNCLIENT_MODE_FULLWALK:
full_walk(sarg1);
#define AVG_PER_INODE_SIZE 450
#define MDS_CACHE_MB_TO_INODES(x) ((x)*1000000/AVG_PER_INODE_SIZE)
-#define MDS_CACHE_SIZE MDS_CACHE_MB_TO_INODES( 50 )
+#define MDS_CACHE_SIZE MDS_CACHE_MB_TO_INODES( 500 )
//#define MDS_CACHE_SIZE 25000 //
else if (strcmp(argv[i], "--mds_bal_interval") == 0)
g_conf.mds_bal_interval = atoi(argv[++i]);
+ else if (strcmp(argv[i], "--client_cache_stat_ttl") == 0)
+ g_conf.client_cache_stat_ttl = atoi(argv[++i]);
else if (strcmp(argv[i], "--osd_fsync") == 0)
g_conf.osd_fsync = atoi(argv[++i]);
sync_pos = off;
// discard written bufferlist
+ assert(writing_buffers.count(off) == 1);
delete writing_buffers[off];
writing_buffers.erase(off);
assert(write_buf.length() == append_pos - flush_pos);
// tuck writing buffer away until write finishes
- writing_buffers[flush_pos] = new bufferlist;
- writing_buffers[flush_pos]->claim(write_buf);
+ writing_buffers[append_pos] = new bufferlist;
+ writing_buffers[append_pos]->claim(write_buf);
// write it
mds->filer->write(log_ino,
g_OSD_MDLogLayout,
- writing_buffers[flush_pos]->length(), flush_pos,
- *writing_buffers[flush_pos],
+ writing_buffers[append_pos]->length(), flush_pos,
+ *writing_buffers[append_pos],
0,
new C_LS_Append(this, append_pos));
// schedule a commit for good measure
// NOTE: not strictly necessary.. it's in the log!
// but, if fakemds crashes we'll be less likely to corrupt osddata/* (in leiu of a real recovery mechanism)
- mdstore->commit_dir(newdir, NULL);
+ //mdstore->commit_dir(newdir, NULL);
return;
}
__uint64_t version;
public:
+ bufferlist bl;
+
MDDoCommitDirContext(MDStore *ms, CDir *dir, Context *c, int w) : Context() {
this->ms = ms;
this->dir = dir;
dout(14) << "num " << num << endl;
// put count in buffer
- bufferlist bl;
+ //bufferlist bl;
size_t size = sizeof(num) + dirdata.length();
- bl.append((char*)&size, sizeof(size));
- bl.append((char*)&num, sizeof(num));
- bl.append(dirdata.c_str(), dirdata.length());
- assert(bl.length() == size + sizeof(size));
+ fin->bl.append((char*)&size, sizeof(size));
+ fin->bl.append((char*)&num, sizeof(num));
+ fin->bl.append(dirdata.c_str(), dirdata.length());
+ assert(fin->bl.length() == size + sizeof(size));
// pin inode
dir->auth_pin();
// submit to osd
mds->filer->write( dir->ino(),
g_OSD_MDDirLayout,
- bl.length(), 0,
- bl,
+ fin->bl.length(), 0,
+ fin->bl,
0, //OSD_OP_FLAGS_TRUNCATE, // truncate file/object after end of this write
fin );
}
m->encode_payload();
msg_envelope_t *env = &m->get_envelope();
bufferlist blist = m->get_payload();
+#ifdef TCP_KEEP_CHUNKS
env->nchunks = blist.buffers().size();
+#else
+ env->nchunks = 1;
+#endif
dout(7) << "sending " << *m << " to " << MSG_ADDR_NICE(env->dest) << " (rank " << rank << ")" << endl;
tcp_write( out_sd[rank], (char*)env, sizeof(*env) );
// payload
+#ifdef TCP_KEEP_CHUNKS
+ // send chunk-wise
int i = 0;
for (list<bufferptr>::iterator it = blist.buffers().begin();
it != blist.buffers().end();
tcp_write( out_sd[rank], (*it).c_str(), size );
i++;
}
+#else
+ // one big chunk
+ int size = blist.length();
+ tcp_write( out_sd[rank], (char*)&size, sizeof(size) );
+ for (list<bufferptr>::iterator it = blist.buffers().begin();
+ it != blist.buffers().end();
+ it++) {
+ tcp_write( out_sd[rank], (*it).c_str(), (*it).length() );
+ }
+#endif
sender_lock.Unlock();
// last one?
if (directory.empty()) {
- dout(1) << "shutdown last tcpmessenger on rank " << mpi_rank << " shut down" << endl;
+ dout(2) << "shutdown last tcpmessenger on rank " << mpi_rank << " shut down" << endl;
pthread_t whoami = pthread_self();
client[i] = new Client(mdc, i, new TCPMessenger(MSG_ADDR_CLIENT(i)) );
start++;
}
- cerr << "clients " << clientlist << " on rank " << myrank << " " << hostname << "." << pid << endl;
+ if (clientlist.size())
+ cerr << "clients " << clientlist << " on rank " << myrank << " " << hostname << "." << pid << endl;
// start message loop