static ENGINE_ERROR_CODE do_item_dcp_step(struct default_engine *engine, struct dcp_connection *connection, const void *cookie, struct dcp_message_producers *producers) { ENGINE_ERROR_CODE ret = ENGINE_DISCONNECT; while (connection->it == NULL) { if (!do_item_walk_cursor(engine, &connection->cursor, 1, item_dcp_iterfunc, connection, &ret)) { /* find next slab class to look at.. */ bool linked = false; int ii; for (ii = connection->cursor.slabs_clsid + 1; ii < POWER_LARGEST && !linked; ++ii) { if (engine->items.heads[ii] != NULL) { /* add the item at the tail */ do_item_link_cursor(engine, &connection->cursor, ii); linked = true; } } if (!linked) { break; } } } if (connection->it != NULL) { rel_time_t current_time = engine->server.core->get_current_time(); rel_time_t exptime = connection->it->exptime; if (exptime != 0 && exptime < current_time) { const hash_key* key = item_get_key(connection->it); ret = producers->expiration(cookie, connection->opaque, hash_key_get_client_key(key), hash_key_get_client_key_len(key), item_get_cas(connection->it), 0, 0, 0, NULL, 0); if (ret == ENGINE_SUCCESS) { do_item_unlink(engine, connection->it); do_item_release(engine, connection->it); } } else { ret = producers->mutation(cookie, connection->opaque, connection->it, 0, 0, 0, 0, NULL, 0, 0); } if (ret == ENGINE_SUCCESS) { connection->it = NULL; } } else { return ENGINE_DISCONNECT; } return ret; }
static void item_scrub_class(struct default_engine *engine, hash_item *cursor) { ENGINE_ERROR_CODE ret; bool more; do { pthread_mutex_lock(&engine->cache_lock); more = do_item_walk_cursor(engine, cursor, 200, item_scrub, NULL, &ret); pthread_mutex_unlock(&engine->cache_lock); if (ret != ENGINE_SUCCESS) { break; } } while (more); }
static void item_scrub_class(struct default_engine *engine, hash_item *cursor) { ENGINE_ERROR_CODE ret; bool more; do { cb_mutex_enter(&engine->items.lock); more = do_item_walk_cursor(engine, cursor, 200, item_scrub, NULL, &ret); cb_mutex_exit(&engine->items.lock); if (ret != ENGINE_SUCCESS) { break; } } while (more); }
static tap_event_t do_item_tap_walker(struct default_engine *engine, const void *cookie, item **itm, void **es, uint16_t *nes, uint8_t *ttl, uint16_t *flags, uint32_t *seqno, uint16_t *vbucket) { ENGINE_ERROR_CODE r; struct tap_client *client = engine->server.cookie->get_engine_specific(cookie); if (client == NULL) { return TAP_DISCONNECT; } *es = NULL; *nes = 0; *ttl = (uint8_t)-1; *seqno = 0; *flags = 0; *vbucket = 0; client->it = NULL; do { if (!do_item_walk_cursor(engine, &client->cursor, 1, item_tap_iterfunc, client, &r)) { /* find next slab class to look at.. */ bool linked = false; int ii; for (ii = client->cursor.slabs_clsid + 1; ii < POWER_LARGEST && !linked; ++ii) { if (engine->items.heads[ii] != NULL) { /* add the item at the tail */ do_item_link_cursor(engine, &client->cursor, ii); linked = true; } } if (!linked) { break; } } } while (client->it == NULL); *itm = client->it; return (*itm == NULL) ? TAP_DISCONNECT : TAP_MUTATION; }