mirror of
				https://github.com/cldellow/sqlite-parquet-vtable.git
				synced 2025-11-04 02:39:56 +00:00 
			
		
		
		
	Add harness for low memory testing
This commit is contained in:
		
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -48,3 +48,6 @@
 | 
				
			|||||||
tests/queries
 | 
					tests/queries
 | 
				
			||||||
/testcase-bootstrap.sql
 | 
					/testcase-bootstrap.sql
 | 
				
			||||||
/test.db
 | 
					/test.db
 | 
				
			||||||
 | 
					/tests/test.db
 | 
				
			||||||
 | 
					/tests/results.bad_alloc
 | 
				
			||||||
 | 
					/tests/libfailmalloc
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										41
									
								
								tests/test-failmalloc
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										41
									
								
								tests/test-failmalloc
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,41 @@
 | 
				
			|||||||
 | 
					#!/bin/bash
 | 
				
			||||||
 | 
					set -euo pipefail
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# A harness that runs SQLite with the parquet extension in an environment where malloc randomly
 | 
				
			||||||
 | 
					# fails. "Success" is if the logs don't have any C++ exceptions that talk about std::bad_alloc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ensure_failmalloc() {
 | 
				
			||||||
 | 
					  if [ ! -d libfailmalloc ]; then
 | 
				
			||||||
 | 
					    git clone https://github.com/cldellow/libfailmalloc.git
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if [ ! -e libfailmalloc/.libs/libfailmalloc.so ]; then
 | 
				
			||||||
 | 
					    cd libfailmalloc
 | 
				
			||||||
 | 
					    ./configure
 | 
				
			||||||
 | 
					    make
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					run_under_low_memory() {
 | 
				
			||||||
 | 
					  start=$(date +%s%3N)
 | 
				
			||||||
 | 
					  set +e
 | 
				
			||||||
 | 
					  env LD_PRELOAD="$here"/libfailmalloc/.libs/libfailmalloc.so FAILMALLOC_PROBABILITY=0.00001 ./test-random &> results.bad_alloc
 | 
				
			||||||
 | 
					  set -e
 | 
				
			||||||
 | 
					  now=$(date +%s%3N)
 | 
				
			||||||
 | 
					  echo "Bailed after $((now-start)) ms"
 | 
				
			||||||
 | 
					  ! grep std::bad_alloc results.bad_alloc
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main() {
 | 
				
			||||||
 | 
					  here=$(dirname "${BASH_SOURCE[0]}")
 | 
				
			||||||
 | 
					  here=$(readlink -f "$here")
 | 
				
			||||||
 | 
					  cd "$here"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ensure_failmalloc
 | 
				
			||||||
 | 
					  # Sometimes we'll exit due to a Python memory issue, so try a few times.
 | 
				
			||||||
 | 
					  for i in {0..10}; do
 | 
				
			||||||
 | 
					    run_under_low_memory
 | 
				
			||||||
 | 
					  done
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main "$@"
 | 
				
			||||||
@@ -87,14 +87,15 @@ def test_table(conn, table):
 | 
				
			|||||||
    for i in range(1000):
 | 
					    for i in range(1000):
 | 
				
			||||||
        test_statement(conn, table, column_values, all_values)
 | 
					        test_statement(conn, table, column_values, all_values)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def test_db(db_file, tables):
 | 
					def test_db(db_file, extension_file, tables):
 | 
				
			||||||
    conn = sqlite3.connect(db_file)
 | 
					    conn = sqlite3.connect(db_file)
 | 
				
			||||||
    conn.enable_load_extension(True)
 | 
					    conn.enable_load_extension(True)
 | 
				
			||||||
    conn.load_extension('parquet/libparquet.so')
 | 
					    conn.load_extension(extension_file)
 | 
				
			||||||
    conn.enable_load_extension(False)
 | 
					    conn.enable_load_extension(False)
 | 
				
			||||||
    for table in tables:
 | 
					    for table in tables:
 | 
				
			||||||
        test_table(conn, table)
 | 
					        test_table(conn, table)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if __name__ == '__main__':
 | 
					if __name__ == '__main__':
 | 
				
			||||||
    db_file = os.path.abspath(os.path.join(__file__, '..', '..', 'test.db'))
 | 
					    db_file = os.path.abspath(os.path.join(__file__, '..', '..', 'test.db'))
 | 
				
			||||||
    test_db(db_file, ['nulls', 'no_nulls'])
 | 
					    extension_file = os.path.abspath(os.path.join(__file__, '..', '..', 'parquet', 'libparquet.so'))
 | 
				
			||||||
 | 
					    test_db(db_file, extension_file, ['nulls', 'no_nulls'])
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user