void* store_data(void* args) { write_args* thread_args = (write_args*)args; KineticEntry* entry = &(thread_args->entry); int32_t objIndex; for (objIndex = 0; ByteBuffer_BytesRemaining(thread_args->data) > 0; objIndex++) { // Configure meta-data char keySuffix[8]; snprintf(keySuffix, sizeof(keySuffix), "%02d", objIndex); entry->key.bytesUsed = strlen(thread_args->keyPrefix); ByteBuffer_AppendCString(&entry->key, keySuffix); entry->synchronization = KINETIC_SYNCHRONIZATION_WRITEBACK; // Prepare the next chunk of data to store ByteBuffer_AppendArray(&entry->value, ByteBuffer_Consume(&thread_args->data, KINETIC_OBJ_SIZE)); // Store the data slice KineticStatus status = KineticClient_Put(thread_args->session, entry, NULL); if (status != KINETIC_STATUS_SUCCESS) { fprintf(stderr, "Failed writing entry %d to disk w/status: %s", objIndex+1, Kinetic_GetStatusDescription(status)); return (void*)NULL; } } printf("File stored successfully to Kinetic device across %d entries!\n", objIndex); return (void*)NULL; }
void* kinetic_put(void* kinetic_arg) { struct kinetic_thread_arg* arg = kinetic_arg; KineticEntry* entry = &(arg->entry); int32_t objIndex = 0; while (ByteBuffer_BytesRemaining(arg->data) > 0) { // Configure meta-data char keySuffix[8]; snprintf(keySuffix, sizeof(keySuffix), "_%02d", objIndex); entry->key.bytesUsed = arg->keyPrefixLength; ByteBuffer_AppendCString(&entry->key, keySuffix); // Move dbVersion back to newVersion, since successful PUTs do this // in order to sync with the actual entry on disk if (entry->newVersion.array.data == NULL) { entry->newVersion = entry->dbVersion; entry->dbVersion = BYTE_BUFFER_NONE; } // Prepare the next chunk of data to store ByteBuffer_AppendArray( &entry->value, ByteBuffer_Consume( &arg->data, MIN(ByteBuffer_BytesRemaining(arg->data), KINETIC_OBJ_SIZE) ) ); // Store the data slice LOGF("Storing a data slice (%u bytes)", entry->value.bytesUsed); KineticStatus status = KineticClient_Put(arg->sessionHandle, entry); TEST_ASSERT_EQUAL_KineticStatus(KINETIC_STATUS_SUCCESS, status); LOGF("KineticClient put to disk success, ip:%s", arg->ip); objIndex++; } return (void*)0; }
void store_data(write_args* args) { KineticEntry* entry = &(args->entry); int32_t objIndex = 0; while (ByteBuffer_BytesRemaining(args->data) > 0) { // Configure entry meta-data ByteBuffer_Reset(&entry->key); ByteBuffer_AppendCString(&entry->key, args->keyPrefix); char keySuffix[8]; snprintf(keySuffix, sizeof(keySuffix), "%02d", objIndex); ByteBuffer_AppendCString(&entry->key, keySuffix); // Prepare entry with the next object to store ByteBuffer_Reset(&entry->value); ByteBuffer_AppendArray( &entry->value, ByteBuffer_Consume( &args->data, MIN(ByteBuffer_BytesRemaining(args->data), KINETIC_OBJ_SIZE)) ); // Store the object KineticStatus status = KineticClient_Put(args->session, entry, NULL); if (status != KINETIC_STATUS_SUCCESS) { fprintf(stderr, "Kinetic PUT of object %d to host %s failed w/ status: %s\n", objIndex, args->ip, Kinetic_GetStatusDescription(status)); exit(-1); } objIndex++; } printf("File stored on Kinetic Device across %d entries\n", objIndex); }