chore(lsm): some refactoring
	
		
			
	
		
	
	
		
			
				
	
				ci/woodpecker/push/docker Pipeline was successful
				
					Details
				
			
		
	
				
					
				
			
				
	
				ci/woodpecker/push/docker Pipeline was successful
				
					Details
				
			
		
	
							parent
							
								
									e3aad2b5e4
								
							
						
					
					
						commit
						881f2defbe
					
				|  | @ -10,6 +10,15 @@ | |||
|       return res;                                                              \ | ||||
|   } | ||||
| 
 | ||||
| #define LSM_RES2(x, e)                                                         \ | ||||
|   {                                                                            \ | ||||
|     lsm_error res = x;                                                         \ | ||||
|     if (res != lsm_error_ok) {                                                 \ | ||||
|       e;                                                                       \ | ||||
|       return res;                                                              \ | ||||
|     }                                                                          \ | ||||
|   } | ||||
| 
 | ||||
| typedef enum lsm_error { | ||||
|   lsm_error_ok = 0, | ||||
|   lsm_error_failed_alloc = 1, | ||||
|  |  | |||
|  | @ -37,7 +37,7 @@ uint64_t lsm_bt_size(const lsm_bt *bt); | |||
|  * @param bt binary tree to search | ||||
|  * @param key key to search | ||||
|  */ | ||||
| lsm_error lsm_bt_search(void **out, lsm_bt *bt, char key); | ||||
| lsm_error lsm_bt_search(void **out, const lsm_bt *bt, char key); | ||||
| 
 | ||||
| /**
 | ||||
|  * Insert a new data value into the tree with the given key. | ||||
|  |  | |||
|  | @ -143,7 +143,7 @@ void lsm_store_free(lsm_store *store); | |||
|  * @param key key to search | ||||
|  */ | ||||
| lsm_error lsm_store_open_read(lsm_entry_handle **out, lsm_store *store, | ||||
|                               lsm_str *key); | ||||
|                               const lsm_str *key); | ||||
| 
 | ||||
| /**
 | ||||
|  * Open a write handle to the given entry. This handle should only be used for | ||||
|  | @ -155,7 +155,7 @@ lsm_error lsm_store_open_read(lsm_entry_handle **out, lsm_store *store, | |||
|  * @param key key to search | ||||
|  */ | ||||
| lsm_error lsm_store_open_write(lsm_entry_handle **out, lsm_store *store, | ||||
|                                lsm_str *key); | ||||
|                               const lsm_str *key); | ||||
| 
 | ||||
| /**
 | ||||
|  * Close an open entry handle. | ||||
|  | @ -193,7 +193,7 @@ void lsm_entry_remove(lsm_entry_handle *handle); | |||
|  * @param entry entry to append data to | ||||
|  * @param data data to append | ||||
|  */ | ||||
| lsm_error lsm_entry_data_append(lsm_entry_handle *handle, lsm_str *data); | ||||
| lsm_error lsm_entry_data_append(lsm_entry_handle *handle, const lsm_str *data); | ||||
| 
 | ||||
| /**
 | ||||
|  * Same as `lsm_entry_data_append`, except that it takes a direct char array. | ||||
|  |  | |||
|  | @ -107,14 +107,14 @@ uint64_t lsm_str_len(const lsm_str *str); | |||
|  * | ||||
|  * @param str string to return pointer for | ||||
|  */ | ||||
| const char *lsm_str_ptr(lsm_str *str); | ||||
| const char *lsm_str_ptr(const lsm_str *str); | ||||
| 
 | ||||
| /**
 | ||||
|  * Returns the character at the specified position. | ||||
|  * | ||||
|  * @index index of character to return | ||||
|  */ | ||||
| char lsm_str_char(lsm_str *str, uint64_t index); | ||||
| char lsm_str_char(const lsm_str *str, uint64_t index); | ||||
| 
 | ||||
| /**
 | ||||
|  * Take a substring and copy it to a provided string object. | ||||
|  | @ -127,7 +127,7 @@ char lsm_str_char(lsm_str *str, uint64_t index); | |||
|  * or equal to the string's length, out will be a zero-length string. | ||||
|  * @param end exclusive end index for the substring | ||||
|  */ | ||||
| lsm_error lsm_str_substr(lsm_str *out, lsm_str *str, uint64_t start, | ||||
| lsm_error lsm_str_substr(lsm_str *out, const lsm_str *str, uint64_t start, | ||||
|                          uint64_t end); | ||||
| 
 | ||||
| /**
 | ||||
|  | @ -141,7 +141,7 @@ lsm_error lsm_str_substr(lsm_str *out, lsm_str *str, uint64_t start, | |||
|  * @param s2 string to compare s1 to | ||||
|  * @param s2_offset offset inside s2 to start comparing from | ||||
|  */ | ||||
| uint64_t lsm_str_cmp(lsm_str *s1, uint64_t s1_offset, lsm_str *s2, | ||||
| uint64_t lsm_str_cmp(const lsm_str *s1, uint64_t s1_offset, const lsm_str *s2, | ||||
|                      uint64_t s2_offset); | ||||
| 
 | ||||
| /**
 | ||||
|  | @ -151,7 +151,7 @@ uint64_t lsm_str_cmp(lsm_str *s1, uint64_t s1_offset, lsm_str *s2, | |||
|  * @param s2 second string to compare | ||||
|  * @return true if their values are equal, false otherwise | ||||
|  */ | ||||
| bool lsm_str_eq(lsm_str *s1, lsm_str *s2); | ||||
| bool lsm_str_eq(const lsm_str *s1, const lsm_str *s2); | ||||
| 
 | ||||
| /**
 | ||||
|  * Truncate an already initialized string in-place. | ||||
|  |  | |||
|  | @ -30,16 +30,16 @@ void lsm_trie_free(lsm_trie *trie); | |||
|  * @param key key to insert data with | ||||
|  * @param data data to insert | ||||
|  */ | ||||
| lsm_error lsm_trie_insert(lsm_trie *trie, lsm_str *key, void *data); | ||||
| lsm_error lsm_trie_insert(lsm_trie *trie, const lsm_str *key, void *data); | ||||
| 
 | ||||
| /**
 | ||||
|  * Search for an element in the trie. | ||||
|  * | ||||
|  * @param out where to store data opinter, if present | ||||
|  * @param out where to store data pointer, if present | ||||
|  * @param trie trie to search in | ||||
|  * @param key key to search with | ||||
|  */ | ||||
| lsm_error lsm_trie_search(void **data, lsm_trie *trie, lsm_str *key); | ||||
| lsm_error lsm_trie_search(void **out, const lsm_trie *trie, const lsm_str *key); | ||||
| 
 | ||||
| /**
 | ||||
|  * Remove an element from the trie. | ||||
|  | @ -48,7 +48,7 @@ lsm_error lsm_trie_search(void **data, lsm_trie *trie, lsm_str *key); | |||
|  * @param trie trie to remove from | ||||
|  * @param key key to remove | ||||
|  */ | ||||
| lsm_error lsm_trie_remove(void **data, lsm_trie *trie, lsm_str *key); | ||||
| lsm_error lsm_trie_remove(void **out, lsm_trie *trie, const lsm_str *key); | ||||
| 
 | ||||
| /**
 | ||||
|  * Return the size of a trie | ||||
|  |  | |||
|  | @ -71,19 +71,16 @@ lsm_error lsm_bt_insert(lsm_bt *bt, char key, void *data) { | |||
|     return lsm_error_already_present; | ||||
|   } | ||||
| 
 | ||||
|   lsm_bt_node *node; | ||||
| 
 | ||||
|   if (lsm_bt_node_init(&node, key, data) != lsm_error_ok) { | ||||
|   if (lsm_bt_node_init(dest, key, data) != lsm_error_ok) { | ||||
|     return lsm_error_failed_alloc; | ||||
|   } | ||||
| 
 | ||||
|   *dest = node; | ||||
|   bt->size++; | ||||
| 
 | ||||
|   return lsm_error_ok; | ||||
| } | ||||
| 
 | ||||
| lsm_error lsm_bt_search(void **out, lsm_bt *bt, char key) { | ||||
| lsm_error lsm_bt_search(void **out, const lsm_bt *bt, char key) { | ||||
|   lsm_bt_node *node = bt->root; | ||||
| 
 | ||||
|   while ((node != NULL) && (node->key != key)) { | ||||
|  |  | |||
|  | @ -14,13 +14,7 @@ lsm_error lsm_store_init(lsm_store **ptr) { | |||
|     return lsm_error_failed_alloc; | ||||
|   } | ||||
| 
 | ||||
|   lsm_error res = lsm_trie_init(&store->trie); | ||||
| 
 | ||||
|   if (res != lsm_error_ok) { | ||||
|     free(store); | ||||
| 
 | ||||
|     return res; | ||||
|   } | ||||
|   LSM_RES2(lsm_trie_init(&store->trie), free(store)); | ||||
| 
 | ||||
|   pthread_mutex_init(&store->db.lock, NULL); | ||||
|   pthread_mutex_init(&store->idx.lock, NULL); | ||||
|  | @ -35,7 +29,7 @@ uint64_t lsm_store_size(const lsm_store *store) { | |||
| } | ||||
| 
 | ||||
| lsm_error lsm_store_open_read(lsm_entry_handle **out, lsm_store *store, | ||||
|                               lsm_str *key) { | ||||
|                               const lsm_str *key) { | ||||
|   lsm_entry_wrapper *wrapper; | ||||
| 
 | ||||
|   LSM_RES(lsm_trie_search((void **)&wrapper, store->trie, key)); | ||||
|  | @ -54,13 +48,7 @@ lsm_error lsm_store_open_read(lsm_entry_handle **out, lsm_store *store, | |||
|   } | ||||
| 
 | ||||
|   lsm_entry_handle *handle; | ||||
|   lsm_error res = lsm_entry_handle_init(&handle); | ||||
| 
 | ||||
|   if (res != lsm_error_ok) { | ||||
|     pthread_rwlock_unlock(&wrapper->lock); | ||||
| 
 | ||||
|     return res; | ||||
|   } | ||||
|   LSM_RES2(lsm_entry_handle_init(&handle), pthread_rwlock_unlock(&wrapper->lock)); | ||||
| 
 | ||||
|   handle->wrapper = wrapper; | ||||
|   handle->store = store; | ||||
|  | @ -70,9 +58,8 @@ lsm_error lsm_store_open_read(lsm_entry_handle **out, lsm_store *store, | |||
| } | ||||
| 
 | ||||
| lsm_error lsm_store_open_write(lsm_entry_handle **out, lsm_store *store, | ||||
|                                lsm_str *key) { | ||||
|                                const lsm_str *key) { | ||||
|   lsm_entry_wrapper *wrapper; | ||||
| 
 | ||||
|   LSM_RES(lsm_trie_search((void **)&wrapper, store->trie, key)); | ||||
| 
 | ||||
|   // Try to get a write lock on the entry's lock
 | ||||
|  | @ -90,13 +77,7 @@ lsm_error lsm_store_open_write(lsm_entry_handle **out, lsm_store *store, | |||
|   } | ||||
| 
 | ||||
|   lsm_entry_handle *handle; | ||||
|   lsm_error res = lsm_entry_handle_init(&handle); | ||||
| 
 | ||||
|   if (res != lsm_error_ok) { | ||||
|     pthread_rwlock_unlock(&wrapper->lock); | ||||
| 
 | ||||
|     return res; | ||||
|   } | ||||
|   LSM_RES2(lsm_entry_handle_init(&handle), pthread_rwlock_unlock(&wrapper->lock)); | ||||
| 
 | ||||
|   handle->wrapper = wrapper; | ||||
|   handle->store = store; | ||||
|  | @ -115,16 +96,11 @@ lsm_error lsm_store_insert(lsm_entry_handle **out, lsm_store *store, | |||
|   if (lsm_trie_search((void **)&wrapper, store->trie, key) == | ||||
|       lsm_error_not_found) { | ||||
|     LSM_RES(lsm_entry_wrapper_init(&wrapper)); | ||||
| 
 | ||||
|     pthread_rwlock_wrlock(&wrapper->lock); | ||||
| 
 | ||||
|     lsm_error res = lsm_trie_insert(store->trie, key, wrapper); | ||||
| 
 | ||||
|     // Check if entry isn't already present in advance
 | ||||
|     if (res != lsm_error_ok) { | ||||
|       lsm_entry_wrapper_free(wrapper); | ||||
| 
 | ||||
|       return res; | ||||
|     } | ||||
|     LSM_RES2(lsm_trie_insert(store->trie, key, wrapper), | ||||
|              lsm_entry_wrapper_free(wrapper)); | ||||
|   } else { | ||||
|     pthread_rwlock_wrlock(&wrapper->lock); | ||||
| 
 | ||||
|  | @ -136,13 +112,14 @@ lsm_error lsm_store_insert(lsm_entry_handle **out, lsm_store *store, | |||
|   } | ||||
| 
 | ||||
|   lsm_entry *entry; | ||||
|   LSM_RES(lsm_entry_init(&entry)); | ||||
|   LSM_RES2(lsm_entry_init(&entry), pthread_rwlock_unlock(&wrapper->lock)); | ||||
| 
 | ||||
|   entry->key = key; | ||||
|   wrapper->entry = entry; | ||||
| 
 | ||||
|   lsm_entry_handle *handle; | ||||
|   LSM_RES(lsm_entry_handle_init(&handle)); | ||||
|   LSM_RES2(lsm_entry_handle_init(&handle), | ||||
|            pthread_rwlock_unlock(&wrapper->lock)); | ||||
| 
 | ||||
|   // No need to set the handle's file, as the entry doesn't have any data yet
 | ||||
|   handle->wrapper = wrapper; | ||||
|  | @ -160,7 +137,7 @@ void lsm_entry_remove(lsm_entry_handle *handle) { | |||
|   handle->states |= lsm_entry_handle_state_removed; | ||||
| } | ||||
| 
 | ||||
| lsm_error lsm_entry_data_append(lsm_entry_handle *handle, lsm_str *data) { | ||||
| lsm_error lsm_entry_data_append(lsm_entry_handle *handle, const lsm_str *data) { | ||||
|   if (lsm_str_len(data) == 0) { | ||||
|     return lsm_error_ok; | ||||
|   } | ||||
|  |  | |||
|  | @ -110,7 +110,7 @@ void lsm_str_free(lsm_str *str) { | |||
| 
 | ||||
| uint64_t lsm_str_len(const lsm_str *str) { return str->len; } | ||||
| 
 | ||||
| const char *lsm_str_ptr(lsm_str *str) { | ||||
| const char *lsm_str_ptr(const lsm_str *str) { | ||||
|   if (str->len <= 8) { | ||||
|     return str->data.val; | ||||
|   } else { | ||||
|  | @ -118,7 +118,7 @@ const char *lsm_str_ptr(lsm_str *str) { | |||
|   } | ||||
| } | ||||
| 
 | ||||
| char lsm_str_char(lsm_str *str, uint64_t index) { | ||||
| char lsm_str_char(const lsm_str *str, uint64_t index) { | ||||
|   if (str->len <= 8) { | ||||
|     return str->data.val[index]; | ||||
|   } else { | ||||
|  | @ -126,7 +126,7 @@ char lsm_str_char(lsm_str *str, uint64_t index) { | |||
|   } | ||||
| } | ||||
| 
 | ||||
| lsm_error lsm_str_substr(lsm_str *out, lsm_str *str, uint64_t start, | ||||
| lsm_error lsm_str_substr(lsm_str *out, const lsm_str *str, uint64_t start, | ||||
|                          uint64_t end) { | ||||
|   // A substring that starts past the string's length will have length 0
 | ||||
|   uint64_t len = start < str->len ? end - start : 0; | ||||
|  | @ -153,7 +153,7 @@ lsm_error lsm_str_substr(lsm_str *out, lsm_str *str, uint64_t start, | |||
|   return lsm_error_ok; | ||||
| } | ||||
| 
 | ||||
| uint64_t lsm_str_cmp(lsm_str *s1, uint64_t s1_offset, lsm_str *s2, | ||||
| uint64_t lsm_str_cmp(const lsm_str *s1, uint64_t s1_offset, const lsm_str *s2, | ||||
|                      uint64_t s2_offset) { | ||||
|   uint64_t index = 0; | ||||
|   uint64_t max_len = MIN(s1->len - s1_offset, s2->len - s2_offset); | ||||
|  | @ -207,7 +207,7 @@ lsm_error lsm_str_split(lsm_str *s, lsm_str *s2, uint64_t index) { | |||
|   return lsm_str_truncate(s, index); | ||||
| } | ||||
| 
 | ||||
| bool lsm_str_eq(lsm_str *s1, lsm_str *s2) { | ||||
| bool lsm_str_eq(const lsm_str *s1, const lsm_str *s2) { | ||||
|   if (s1->len != s2->len) { | ||||
|     return false; | ||||
|   } | ||||
|  |  | |||
|  | @ -45,7 +45,7 @@ lsm_error lsm_trie_init(lsm_trie **ptr) { | |||
| 
 | ||||
| uint64_t lsm_trie_size(const lsm_trie *trie) { return trie->size; } | ||||
| 
 | ||||
| lsm_error lsm_trie_insert(lsm_trie *trie, lsm_str *key, void *data) { | ||||
| lsm_error lsm_trie_insert(lsm_trie *trie, const lsm_str *key, void *data) { | ||||
|   // NULL is not allowed as a data value, as it's used to indicate a lack of
 | ||||
|   // data
 | ||||
|   if (data == NULL) { | ||||
|  | @ -78,18 +78,22 @@ lsm_error lsm_trie_insert(lsm_trie *trie, lsm_str *key, void *data) { | |||
|     // here
 | ||||
|     if (res == lsm_error_not_found) { | ||||
|       lsm_trie_node *new_node; | ||||
|       res = lsm_trie_node_init(&new_node); | ||||
|       LSM_RES(lsm_trie_node_init(&new_node)); | ||||
| 
 | ||||
|       new_node->data = data; | ||||
| 
 | ||||
|       lsm_str_substr(&new_node->skip, key, index + 1, key_len); | ||||
|       res = lsm_bt_insert(&node->bt, c, new_node); | ||||
| 
 | ||||
|       if (res != lsm_error_ok) { | ||||
|         lsm_trie_node_free(new_node); | ||||
| 
 | ||||
|         return res; | ||||
|       } | ||||
| 
 | ||||
|       new_node->data = data; | ||||
|       trie->size++; | ||||
| 
 | ||||
|       lsm_str_substr(&new_node->skip, key, index + 1, key_len); | ||||
| 
 | ||||
|       return lsm_bt_insert(&node->bt, c, new_node); | ||||
|       return lsm_error_ok; | ||||
|     } | ||||
| 
 | ||||
|     index++; | ||||
|  | @ -101,11 +105,7 @@ lsm_error lsm_trie_insert(lsm_trie *trie, lsm_str *key, void *data) { | |||
| 
 | ||||
|     if (cmp < lsm_str_len(&next_node->skip)) { | ||||
|       lsm_trie_node *split_node; | ||||
|       res = lsm_trie_node_init(&split_node); | ||||
| 
 | ||||
|       if (res != lsm_error_ok) { | ||||
|         return res; | ||||
|       } | ||||
|       LSM_RES(lsm_trie_node_init(&split_node)); | ||||
| 
 | ||||
|       // split_node replaces the original node as the new child node
 | ||||
|       // bottom_node here is always the same value as next_node
 | ||||
|  | @ -118,7 +118,7 @@ lsm_error lsm_trie_insert(lsm_trie *trie, lsm_str *key, void *data) { | |||
| 
 | ||||
|       // split_node's skip has not been initialized yet, so we can simply
 | ||||
|       // overwrite it with bottom_node's skip
 | ||||
|       split_node->skip = next_node->skip; | ||||
|       split_node->skip = bottom_node->skip; | ||||
| 
 | ||||
|       // The new node splits the edge into two parts, so the new split node will
 | ||||
|       // have the first part of the skip (minus the one character) as its
 | ||||
|  | @ -148,7 +148,8 @@ lsm_error lsm_trie_insert(lsm_trie *trie, lsm_str *key, void *data) { | |||
|   return lsm_error_ok; | ||||
| } | ||||
| 
 | ||||
| lsm_error lsm_trie_search(void **out, lsm_trie *trie, lsm_str *key) { | ||||
| lsm_error lsm_trie_search(void **out, const lsm_trie *trie, | ||||
|                           const lsm_str *key) { | ||||
|   uint64_t key_len = lsm_str_len(key); | ||||
| 
 | ||||
|   if (key_len == 0) { | ||||
|  | @ -199,13 +200,13 @@ lsm_error lsm_trie_search(void **out, lsm_trie *trie, lsm_str *key) { | |||
|   return lsm_error_ok; | ||||
| } | ||||
| 
 | ||||
| lsm_error lsm_trie_remove(void **data, lsm_trie *trie, lsm_str *key) { | ||||
| lsm_error lsm_trie_remove(void **out, lsm_trie *trie, const lsm_str *key) { | ||||
|   uint64_t key_len = lsm_str_len(key); | ||||
| 
 | ||||
|   if (key_len == 0) { | ||||
|     if (trie->root->data != NULL) { | ||||
|       if (data != NULL) { | ||||
|         *data = trie->root->data; | ||||
|       if (out != NULL) { | ||||
|         *out = trie->root->data; | ||||
|       } | ||||
| 
 | ||||
|       trie->root->data = NULL; | ||||
|  | @ -250,8 +251,8 @@ lsm_error lsm_trie_remove(void **data, lsm_trie *trie, lsm_str *key) { | |||
|     return lsm_error_not_found; | ||||
|   } | ||||
| 
 | ||||
|   if (data != NULL) { | ||||
|     *data = child->data; | ||||
|   if (out != NULL) { | ||||
|     *out = child->data; | ||||
|   } | ||||
| 
 | ||||
|   child->data = NULL; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue