const std::string BENCH_LASTRUN_METADATA = "benchmark_last_metadata";
const std::string BENCH_PREFIX = "benchmark_data";
+const std::string BENCH_OBJ_NAME = BENCH_PREFIX + "_%s_%d_object%d";
+
static char cached_hostname[30] = {0};
int cached_pid = 0;
return oss.str();
}
-static std::string generate_object_name(int objnum, int pid = 0)
+// this is 8x faster than previous impl based on chained, deduped functions call
+static std::string generate_object_name_fast(int objnum, int pid = 0)
{
- std::ostringstream oss;
- oss << generate_object_prefix(pid) << "_object" << objnum;
- return oss.str();
+ if (cached_hostname[0] == 0) {
+ gethostname(cached_hostname, sizeof(cached_hostname)-1);
+ cached_hostname[sizeof(cached_hostname)-1] = 0;
+ }
+
+ if (pid)
+ cached_pid = pid;
+ else if (!cached_pid)
+ cached_pid = getpid();
+
+ char name[512];
+ int n = snprintf(&name[0], sizeof(name), BENCH_OBJ_NAME.c_str(), cached_hostname, cached_pid, objnum);
+ assert(n > 0 && n < (int)sizeof(name));
+ return std::string(&name[0], (size_t)n);
}
static void sanitize_object_contents (bench_data *data, size_t length) {
//set up writes so I can start them together
for (int i = 0; i<concurrentios; ++i) {
- name[i] = generate_object_name(i / writes_per_object);
+ name[i] = generate_object_name_fast(i / writes_per_object);
contents[i] = new bufferlist();
snprintf(data.object_contents, data.op_size, "I'm the %16dth op!", i);
contents[i]->append(data.object_contents, data.op_size);
}
lock.Unlock();
//create new contents and name on the heap, and fill them
- newName = generate_object_name(data.started / writes_per_object);
+ newName = generate_object_name_fast(data.started / writes_per_object);
newContents = contents[slot];
snprintf(newContents->c_str(), data.op_size, "I'm the %16dth op!", data.started);
// we wrote to buffer, going around internal crc cache, so invalidate it now.
//set up initial reads
for (int i = 0; i < concurrentios; ++i) {
- name[i] = generate_object_name(i / writes_per_object, pid);
+ name[i] = generate_object_name_fast(i / writes_per_object, pid);
contents[i] = new bufferlist();
}
}
}
- newName = generate_object_name(data.started / writes_per_object, pid);
+ newName = generate_object_name_fast(data.started / writes_per_object, pid);
index[slot] = data.started;
lock.Unlock();
completion_wait(slot);
//set up initial reads
for (int i = 0; i < concurrentios; ++i) {
- name[i] = generate_object_name(i / writes_per_object, pid);
+ name[i] = generate_object_name_fast(i / writes_per_object, pid);
contents[i] = new bufferlist();
}
}
rand_id = rand() % num_objects;
- newName = generate_object_name(rand_id / writes_per_object, pid);
+ newName = generate_object_name_fast(rand_id / writes_per_object, pid);
index[slot] = rand_id;
release_completion(slot);
//set up initial removes
for (int i = 0; i < concurrentios; ++i) {
- name[i] = generate_object_name(i, prevPid);
+ name[i] = generate_object_name_fast(i, prevPid);
}
//start initial removes
lc.cond.Wait(lock);
}
lock.Unlock();
- newName = generate_object_name(data.started, prevPid);
+ newName = generate_object_name_fast(data.started, prevPid);
completion_wait(slot);
lock.Lock();
r = completion_ret(slot);