@@ -11,6 +11,7 @@ use crate::utils::{copy_doc_dir, parse_rustc_version, CargoMetadata, GithubUpdat
11
11
use crate :: { db:: blacklist:: is_blacklisted, utils:: MetadataPackage } ;
12
12
use crate :: { Config , Context , Index , Metrics , Storage } ;
13
13
use docsrs_metadata:: { Metadata , DEFAULT_TARGETS , HOST_TARGET } ;
14
+ use failure:: bail;
14
15
use failure:: ResultExt ;
15
16
use log:: { debug, info, warn, LevelFilter } ;
16
17
use postgres:: Client ;
@@ -309,6 +310,24 @@ impl RustwideBuilder {
309
310
}
310
311
311
312
let limits = Limits :: for_crate ( & mut conn, name) ?;
313
+ #[ cfg( target_os = "linux" ) ]
314
+ if !self . config . disable_memory_limit {
315
+ let mem_info = procfs:: Meminfo :: new ( ) . context ( "failed to read /proc/meminfo" ) ?;
316
+ let available = mem_info
317
+ . mem_available
318
+ . expect ( "kernel version too old for determining memory limit" ) ;
319
+ if limits. memory ( ) as u64 > available {
320
+ bail ! ( "not enough memory to build {} {}: needed {} MiB, have {} MiB\n help: set DOCSRS_DISABLE_MEMORY_LIMIT=true to force a build" ,
321
+ name, version, limits. memory( ) / 1024 / 1024 , available / 1024 / 1024
322
+ ) ;
323
+ } else {
324
+ debug ! (
325
+ "had enough memory: {} MiB > {} MiB" ,
326
+ limits. memory( ) / 1024 / 1024 ,
327
+ available / 1024 / 1024
328
+ ) ;
329
+ }
330
+ }
312
331
313
332
let mut build_dir = self . workspace . build_dir ( & format ! ( "{}-{}" , name, version) ) ;
314
333
build_dir. purge ( ) ?;
0 commit comments