-
Notifications
You must be signed in to change notification settings - Fork 50
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Build a conda-forge package for flux-core #5079
Comments
Thanks! Which compiler and version? |
Hmmm, it seems the Edit: oh @garlick responded like 1 minute earlier, that's another approach :P Edit: Sorry, I got it backwards, you define NDEBUG to disable assert ... but you seemed to realize my mistake. |
I try to build a conda-forge package in conda-forge/staged-recipes#22502 - the logs are available via the azure CI. |
In the logs I found the following definitions:
But I thought as it is a |
|
CPPFLAGS stands for C pre-processor, so it does seem that you're defining it in some way within your build, thus asserts not built, thus the warning. I think @garlick's technique (temporarily for you) would be to disable that specific warning in the
Edit: oops, I didn't initially add it in the above, hopefully didn't typo that, didn't try it |
I slowly make progress, the next error I get is:
|
uh oh, perhaps the system you're building on doesn't support SEEK_DATA and SEEK_HOLE. On my ubuntu box in the lseek manpage ...
Perhaps Edit: I suppose a quick workaround is to remove most of the code in |
It would help to get the compiler version and OS distro. My guess is that these errors are not from a Linux system? You will probably encounter more errors in the build if this is the case. Unfortunately Flux supports Linux only for now... |
As explained above, I try to build a conda package for flux. conda-forge/staged-recipes#22502 for this purpose, I build it in a restricted environment on the Azure CI. The environment is restricted in the way that it is only linking to libraries which are provided by other conda packages. The raw log is available as: |
Ah, I apologize that I missed your earlier comment! 🤦♂️ I will check out the log later, because it looks like the build is running on Ubuntu 22.04 which should be working... |
Ah, I wonder if somehow |
It seems the |
I tried adding
|
Thank you for trying that, now that I can take a look, I see that flux-core defines /* Define _GNU_SOURCE so that we get all necessary prototypes */
#define _GNU_SOURCE 1 and /* Define _GNU_SOURCE so that we get all necessary prototypes */
#define _GNU_SOURCE 1 This should be enough to get the definition of
So I'm unfortunately baffled as to what the problem is here. From the conda issue you reference above, it seems like conda may be replacing or patching glibc, perhaps that has something to do with it? Perhaps I will try a build with conda to see what is going on, but I have zero prior experience with this tool. Can you apply a patch during the conda build? We can try to provide a patch for |
Yes, we can patch during build time. |
Well from your conda logs it looks like the build is occurring on a centos 7 host with glibc 2.17.:
we test centos 7 in CI, so I'm still confused why this is failing in conda! Can you try this patch to workaround missing diff --git a/src/common/libutil/fileref.c b/src/common/libutil/fileref.c
index 69213b0f0..22a4d3359 100644
--- a/src/common/libutil/fileref.c
+++ b/src/common/libutil/fileref.c
@@ -57,8 +57,10 @@ static int blobvec_append (json_t *blobvec,
static bool file_has_no_data (int fd)
{
+#if defined(SEEK_DATA)
if (lseek (fd, 0, SEEK_DATA) == (off_t)-1 && errno == ENXIO)
return true;
+#endif
return false;
}
@@ -83,19 +85,25 @@ static json_t *blobvec_create (int fd,
goto error;
}
while (offset < size) {
+#if defined(SEEK_DATA)
// N.B. fails with ENXIO if there is no more data
if ((offset = lseek (fd, offset, SEEK_DATA)) == (off_t)-1) {
if (errno == ENXIO)
break;
goto error;
}
+#endif
if (offset < size) {
off_t notdata;
int blobsize;
+#if defined(SEEK_HOLE)
// N.B. returns size if there are no more holes
if ((notdata = lseek (fd, offset, SEEK_HOLE)) == (off_t)-1)
goto error;
+#else
+ notdata = size;
+#endif
blobsize = notdata - offset;
if (blobsize > chunksize)
blobsize = chunksize;
diff --git a/src/common/libutil/test/fileref.c b/src/common/libutil/test/fileref.c
index 61cb0bdfe..6fbd84d9b 100644
--- a/src/common/libutil/test/fileref.c
+++ b/src/common/libutil/test/fileref.c
@@ -87,9 +87,11 @@ void rmfile (const char *name)
*/
bool test_sparse (void)
{
+ bool result = false;
+
+#if defined(SEEK_DATA)
int fd;
struct stat sb;
- bool result = false;
fd = open (mkpath ("testhole"), O_WRONLY | O_CREAT | O_TRUNC, 0600);
if (fd < 0)
@@ -104,6 +106,7 @@ bool test_sparse (void)
result = true;
close (fd);
rmfile ("testhole");
+#endif
return result;
}
@@ -709,7 +712,8 @@ int main (int argc, char *argv[])
test_dir ();
test_link ();
test_small ();
- test_empty ();
+ if (have_sparse)
+ test_empty ();
test_expfail ();
test_pretty_print ();
|
Reading about conda forge I see that it uses a sysroot that is currently based on CentOS 6 (!?). I think that might be the issue, though I could be misunderstanding since it seems surprising that conda would be based on CentOS 6 since I think that distro was EOL in 2020. However, can you try to force the sysroot to centos 7 with these instructions? https://conda-forge.org/docs/maintainer/knowledge_base.html#using-centos-7 |
FYI - I was able to build flux-core on CentOS 6 (with a newer compiler, zeromq, czmq, libhwloc, libsodium, etc) with the following changes: (in case you are unable to change to a CentOS 7 sysroot) diff --git a/src/broker/state_machine.c b/src/broker/state_machine.c
index 57e727fea..b02a3b144 100644
--- a/src/broker/state_machine.c
+++ b/src/broker/state_machine.c
@@ -11,6 +11,8 @@
#if HAVE_CONFIG_H
#include "config.h"
#endif
+#include <signal.h>
+
#include <flux/core.h>
#include "src/common/libczmqcontainers/czmq_containers.h"
diff --git a/src/cmd/builtin/proxy.c b/src/cmd/builtin/proxy.c
index feff795b9..655df262a 100644
--- a/src/cmd/builtin/proxy.c
+++ b/src/cmd/builtin/proxy.c
@@ -18,6 +18,7 @@
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
+#include <signal.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
diff --git a/src/common/libsubprocess/server.c b/src/common/libsubprocess/server.c
index 2c164646c..275aa3443 100644
--- a/src/common/libsubprocess/server.c
+++ b/src/common/libsubprocess/server.c
@@ -13,6 +13,7 @@
#endif
#include <unistd.h> // defines environ
+#include <signal.h>
#include <errno.h>
#include <flux/core.h>
diff --git a/src/common/libterminus/pty.c b/src/common/libterminus/pty.c
index a1dbf6788..a3c6f4c7b 100644
--- a/src/common/libterminus/pty.c
+++ b/src/common/libterminus/pty.c
@@ -208,8 +208,10 @@ int flux_pty_kill (struct flux_pty *pty, int sig)
pty->wait_for_client = false;
pty->wait_on_close = false;
}
+#if defined(TIOCSIG)
if (ioctl (pty->leader, TIOCSIG, sig) >= 0)
return 0;
+#endif
llog_debug (pty, "ioctl (TIOCSIG): %s", strerror (errno));
if (ioctl (pty->leader, TIOCGPGRP, &pgrp) >= 0
&& pgrp > 0
diff --git a/src/common/libutil/fileref.c b/src/common/libutil/fileref.c
index 69213b0f0..22a4d3359 100644
--- a/src/common/libutil/fileref.c
+++ b/src/common/libutil/fileref.c
@@ -57,8 +57,10 @@ static int blobvec_append (json_t *blobvec,
static bool file_has_no_data (int fd)
{
+#if defined(SEEK_DATA)
if (lseek (fd, 0, SEEK_DATA) == (off_t)-1 && errno == ENXIO)
return true;
+#endif
return false;
}
@@ -83,19 +85,25 @@ static json_t *blobvec_create (int fd,
goto error;
}
while (offset < size) {
+#if defined(SEEK_DATA)
// N.B. fails with ENXIO if there is no more data
if ((offset = lseek (fd, offset, SEEK_DATA)) == (off_t)-1) {
if (errno == ENXIO)
break;
goto error;
}
+#endif
if (offset < size) {
off_t notdata;
int blobsize;
+#if defined(SEEK_HOLE)
// N.B. returns size if there are no more holes
if ((notdata = lseek (fd, offset, SEEK_HOLE)) == (off_t)-1)
goto error;
+#else
+ notdata = size;
+#endif
blobsize = notdata - offset;
if (blobsize > chunksize)
blobsize = chunksize;
diff --git a/src/common/libutil/test/fileref.c b/src/common/libutil/test/fileref.c
index 61cb0bdfe..6fbd84d9b 100644
--- a/src/common/libutil/test/fileref.c
+++ b/src/common/libutil/test/fileref.c
@@ -87,9 +87,11 @@ void rmfile (const char *name)
*/
bool test_sparse (void)
{
+ bool result = false;
+
+#if defined(SEEK_DATA)
int fd;
struct stat sb;
- bool result = false;
fd = open (mkpath ("testhole"), O_WRONLY | O_CREAT | O_TRUNC, 0600);
if (fd < 0)
@@ -104,6 +106,7 @@ bool test_sparse (void)
result = true;
close (fd);
rmfile ("testhole");
+#endif
return result;
}
@@ -709,7 +712,8 @@ int main (int argc, char *argv[])
test_dir ();
test_link ();
test_small ();
- test_empty ();
+ if (have_sparse)
+ test_empty ();
test_expfail ();
test_pretty_print ();
diff --git a/src/modules/job-exec/job-exec.c b/src/modules/job-exec/job-exec.c
index d29aba68a..c6b76fb92 100644
--- a/src/modules/job-exec/job-exec.c
+++ b/src/modules/job-exec/job-exec.c
@@ -89,6 +89,7 @@
#endif
#include <assert.h>
#include <unistd.h>
+#include <signal.h>
#include <flux/core.h>
#include "src/common/libczmqcontainers/czmq_containers.h"
diff --git a/src/shell/rlimit.c b/src/shell/rlimit.c
index 25a19d936..f83904525 100644
--- a/src/shell/rlimit.c
+++ b/src/shell/rlimit.c
@@ -60,8 +60,10 @@ static int rlimit_name_to_string (const char *name)
return RLIMIT_NICE;
if (streq (name, "rtprio"))
return RLIMIT_RTPRIO;
+#ifdef RLIMIT_RTTTIME
if (streq (name, "rttime"))
return RLIMIT_RTTIME;
+#endif
if (streq (name, "sigpending"))
return RLIMIT_SIGPENDING;
return -1; |
@grondo thank you so much, the patch definitely helped. I am now able to progress further. Unfortunately, I am still not able to complete the compilation as I get the following error:
|
Ah, it looks like conda forge is using GCC 11.3. The latest we test with is 11.2. For that particular issue you could try the following diff --git a/src/common/libsubprocess/subprocess.c b/src/common/libsubprocess/su
bprocess.c
index da068b3d3..e2f41922f 100644
--- a/src/common/libsubprocess/subprocess.c
+++ b/src/common/libsubprocess/subprocess.c
@@ -263,7 +263,7 @@ void flux_standard_output (flux_subprocess_t *p, const char
*stream)
}
if (lenp)
- fwrite (ptr, lenp, 1, fstream);
+ (void) fwrite (ptr, lenp, 1, fstream);
}
/* Let me see if I can test with GCC 11.3 and uncover any other issues with that compiler. |
FYI - I was able to build with GCC 11.3 with no changes from current master, so I wonder if conda forge is adding some other warnings. I'll try to see if those are captured in the logs. |
I applied your patch but the error remains:
|
Interesting. I think this is another one that is due to older glibc provided by centos 6. try this instead as workaround diff --git a/src/common/libsubprocess/subprocess.c b/src/common/libsubprocess/subprocess.c
index da068b3d3..5134b3a47 100644
--- a/src/common/libsubprocess/subprocess.c
+++ b/src/common/libsubprocess/subprocess.c
@@ -262,8 +262,10 @@ void flux_standard_output (flux_subprocess_t *p, const char *stream)
}
}
- if (lenp)
- fwrite (ptr, lenp, 1, fstream);
+ if (lenp) {
+ if (fwrite (ptr, lenp, 1, fstream) < 0)
+ log_err ("fwrite");
+ }
}
/* |
BTW, the reason |
Unfortunately also the
|
Ok, that doesn't make sense to me because the result is used, but I modified my system to add the diff --git a/src/common/libsubprocess/subprocess.c b/src/common/libsubprocess/subprocess.c
index da068b3d3..72cb6cca6 100644
--- a/src/common/libsubprocess/subprocess.c
+++ b/src/common/libsubprocess/subprocess.c
@@ -262,8 +262,11 @@ void flux_standard_output (flux_subprocess_t *p, const char *stream)
}
}
- if (lenp)
- fwrite (ptr, lenp, 1, fstream);
+ if (lenp) {
+ int rc = fwrite (ptr, lenp, 1, fstream);
+ if (rc < 0)
+ log_err ("fwrite");
+ }
}
/* |
This trick seems to work, it just seems to be missing at other parts as well:
|
Ah, sorry I guess I didn't test the whole build, try this: diff --git a/src/cmd/flux-exec.c b/src/cmd/flux-exec.c
index eeeb2c581..404f86b87 100644
--- a/src/cmd/flux-exec.c
+++ b/src/cmd/flux-exec.c
@@ -192,7 +192,8 @@ void output_cb (flux_subprocess_t *p, const char *stream)
if (lenp) {
if (optparse_getopt (opts, "label-io", NULL) > 0)
fprintf (fstream, "%d: ", flux_subprocess_rank (p));
- fwrite (ptr, lenp, 1, fstream);
+ if (fwrite (ptr, lenp, 1, fstream) != lenp)
+ log_err ("fwrite");
}
}
diff --git a/src/cmd/flux-job.c b/src/cmd/flux-job.c
index 979c7fbf7..ea8ed86da 100644
--- a/src/cmd/flux-job.c
+++ b/src/cmd/flux-job.c
@@ -1674,7 +1674,8 @@ static void handle_output_data (struct attach_ctx *ctx, json_t *context)
if (len > 0) {
if (optparse_hasopt (ctx->p, "label-io"))
fprintf (fp, "%s: ", rank);
- fwrite (data, len, 1, fp);
+ if (fwrite (data, len, 1, fp) != len)
+ log_err ("fwrite");
fflush (fp);
}
free (data);
@@ -2205,7 +2206,8 @@ void handle_exec_log_msg (struct attach_ctx *ctx, double ts, json_t *context)
rank,
stream);
}
- fwrite (data, len, 1, stderr);
+ if (fwrite (data, len, 1, stderr) != len)
+ log_err ("fwrite");
}
static struct idset *all_taskids (const struct taskmap *map)
diff --git a/src/common/libsubprocess/subprocess.c b/src/common/libsubprocess/subprocess.c
index da068b3d3..a63765b8e 100644
--- a/src/common/libsubprocess/subprocess.c
+++ b/src/common/libsubprocess/subprocess.c
@@ -262,8 +262,10 @@ void flux_standard_output (flux_subprocess_t *p, const char *stream)
}
}
- if (lenp)
- fwrite (ptr, lenp, 1, fstream);
+ if (lenp) {
+ if (fwrite (ptr, lenp, 1, fstream) != lenp)
+ log_err ("fwrite");
+ }
}
/*
diff --git a/src/shell/output.c b/src/shell/output.c
index 8ebf07365..e9eb3b964 100644
--- a/src/shell/output.c
+++ b/src/shell/output.c
@@ -174,7 +174,8 @@ static int shell_output_term (struct shell_output *out)
}
if ((output_type == FLUX_OUTPUT_TYPE_TERM) && len > 0) {
fprintf (f, "%s: ", rank);
- fwrite (data, len, 1, f);
+ if (fwrite (data, len, 1, f) != len)
+ return -1;
}
free (data);
} This got me all the way through Note that we probably don't want to apply these patches to flux-core, so I'd still suggest looking into updating the sysroot to centos 7 as a long(er) term fix. |
Thanks a lot, with the latest patch I am able to compile all the modules and it only fails at the linking step. There I get the following error:
|
I might have to try building in conda myself in order to debug that one. Also I realized my patch above is incorrect. Edit: FYI - I've corrected the |
I've made some progress here. We can get through diff -Nur flux-core-0.49.0/src/common/libeventlog/Makefile.in flux-core-0.49.0.new/src/common/libeventlog/Makefile.in
--- flux-core-0.49.0/src/common/libeventlog/Makefile.in 2023-04-05 16:24:09.982692163 +0000
+++ flux-core-0.49.0.new/src/common/libeventlog/Makefile.in 2023-04-12 03:49:02.262611471 +0000
@@ -691,7 +691,7 @@
$(top_builddir)/src/common/libtap/libtap.la \
$(top_builddir)/src/common/libeventlog/libeventlog.la \
$(top_builddir)/src/common/libutil/libutil.la \
- $(JANSSON_LIBS)
+ $(JANSSON_LIBS) -lrt
all: all-am diff --git a/t/rexec/rexec_count_stdout.c b/t/rexec/rexec_count_stdout.c
index 8cb9ff932..f5e1985f8 100644
--- a/t/rexec/rexec_count_stdout.c
+++ b/t/rexec/rexec_count_stdout.c
@@ -69,8 +69,10 @@ void output_cb (flux_subprocess_t *p, const char *stream)
}
}
- if (lenp)
- fwrite (ptr, lenp, 1, fstream);
+ if (lenp) {
+ if (fwrite (ptr, lenp, 1, fstream) != lenp)
+ log_err ("fwrite");
+ }
if (!strcasecmp (stream, "stdout"))
stdout_count++;
diff --git a/t/rexec/rexec_getline.c b/t/rexec/rexec_getline.c
index b4a17c3ea..55fd57ffd 100644
--- a/t/rexec/rexec_getline.c
+++ b/t/rexec/rexec_getline.c
@@ -76,8 +76,10 @@ void output_cb (flux_subprocess_t *p, const char *stream)
if (!(ptr = flux_subprocess_getline (p, stream, &lenp)))
log_err_exit ("flux_subprocess_getline");
- if (lenp)
- fwrite (ptr, lenp, 1, fstream);
+ if (lenp) {
+ if (fwrite (ptr, lenp, 1, fstream) != lenp)
+ log_err ("fwrite");
+ }
else
fprintf (fstream, "EOF\n");
} diff -Nur flux-core-0.49.0/src/shell/Makefile.in flux-core-0.49.0.new/src/shell/Makefile.in
--- flux-core-0.49.0/src/shell/Makefile.in 2023-04-05 16:24:12.798689648 +0000
+++ flux-core-0.49.0.new/src/shell/Makefile.in 2023-04-12 02:50:11.579942667 +0000
@@ -872,13 +872,14 @@
$(top_builddir)/src/bindings/lua/libfluxlua.la \
$(top_builddir)/src/common/libflux-core.la \
$(top_builddir)/src/common/libflux-taskmap.la \
+ $(top_builddir)/src/common/libflux-idset.la \
$(top_builddir)/src/common/libpmi/libpmi_server.la \
$(top_builddir)/src/common/libpmi/libpmi_common.la \
$(top_builddir)/src/common/libczmqcontainers/libczmqcontainers.la \
- $(top_builddir)/src/common/libflux-internal.la \
$(top_builddir)/src/common/libflux-optparse.la \
$(top_builddir)/src/common/libterminus/libterminus.la \
$(top_builddir)/src/common/libutil/libutil.la \
+ $(top_builddir)/src/common/libflux-internal.la \
$(LUA_LIB) \
$(HWLOC_LIBS) \
$(JANSSON_LIBS) \ Also, some build and runtime requirements were missing: However, even with all that,
But cffi is installed, so I'm stumped at the moment. |
I added the patches and |
Yeah one of the tests is hanging. Note that many tests also fail. I'm unsure if it is related to any of the patches, though I don't find that likely, or is because of the errors in the conda environment (see above) |
@jan-janssen it took a day longer than I thought, but I think I have a conda build working. I'll add the updated I also found that some packages were missing - please add
Also, flux does not require MPI to build (It can run MPI jobs, so it needs them only for optional testing), so I removed I also changed the Here's the combined diff for all my current changes: diff --git a/src/broker/state_machine.c b/src/broker/state_machine.c
index 57e727fea..b02a3b144 100644
--- a/src/broker/state_machine.c
+++ b/src/broker/state_machine.c
@@ -11,6 +11,8 @@
#if HAVE_CONFIG_H
#include "config.h"
#endif
+#include <signal.h>
+
#include <flux/core.h>
#include "src/common/libczmqcontainers/czmq_containers.h"
diff --git a/src/cmd/builtin/proxy.c b/src/cmd/builtin/proxy.c
index feff795b9..655df262a 100644
--- a/src/cmd/builtin/proxy.c
+++ b/src/cmd/builtin/proxy.c
@@ -18,6 +18,7 @@
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
+#include <signal.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
diff --git a/src/common/libsubprocess/server.c b/src/common/libsubprocess/server.c
index 2c164646c..275aa3443 100644
--- a/src/common/libsubprocess/server.c
+++ b/src/common/libsubprocess/server.c
@@ -13,6 +13,7 @@
#endif
#include <unistd.h> // defines environ
+#include <signal.h>
#include <errno.h>
#include <flux/core.h>
diff --git a/src/common/libterminus/pty.c b/src/common/libterminus/pty.c
index a1dbf6788..a3c6f4c7b 100644
--- a/src/common/libterminus/pty.c
+++ b/src/common/libterminus/pty.c
@@ -208,8 +208,10 @@ int flux_pty_kill (struct flux_pty *pty, int sig)
pty->wait_for_client = false;
pty->wait_on_close = false;
}
+#if defined(TIOCSIG)
if (ioctl (pty->leader, TIOCSIG, sig) >= 0)
return 0;
+#endif
llog_debug (pty, "ioctl (TIOCSIG): %s", strerror (errno));
if (ioctl (pty->leader, TIOCGPGRP, &pgrp) >= 0
&& pgrp > 0
diff --git a/src/common/libutil/fileref.c b/src/common/libutil/fileref.c
index 69213b0f0..22a4d3359 100644
--- a/src/common/libutil/fileref.c
+++ b/src/common/libutil/fileref.c
@@ -57,8 +57,10 @@ static int blobvec_append (json_t *blobvec,
static bool file_has_no_data (int fd)
{
+#if defined(SEEK_DATA)
if (lseek (fd, 0, SEEK_DATA) == (off_t)-1 && errno == ENXIO)
return true;
+#endif
return false;
}
@@ -83,19 +85,25 @@ static json_t *blobvec_create (int fd,
goto error;
}
while (offset < size) {
+#if defined(SEEK_DATA)
// N.B. fails with ENXIO if there is no more data
if ((offset = lseek (fd, offset, SEEK_DATA)) == (off_t)-1) {
if (errno == ENXIO)
break;
goto error;
}
+#endif
if (offset < size) {
off_t notdata;
int blobsize;
+#if defined(SEEK_HOLE)
// N.B. returns size if there are no more holes
if ((notdata = lseek (fd, offset, SEEK_HOLE)) == (off_t)-1)
goto error;
+#else
+ notdata = size;
+#endif
blobsize = notdata - offset;
if (blobsize > chunksize)
blobsize = chunksize;
diff --git a/src/common/libutil/test/fileref.c b/src/common/libutil/test/fileref.c
index 61cb0bdfe..6fbd84d9b 100644
--- a/src/common/libutil/test/fileref.c
+++ b/src/common/libutil/test/fileref.c
@@ -87,9 +87,11 @@ void rmfile (const char *name)
*/
bool test_sparse (void)
{
+ bool result = false;
+
+#if defined(SEEK_DATA)
int fd;
struct stat sb;
- bool result = false;
fd = open (mkpath ("testhole"), O_WRONLY | O_CREAT | O_TRUNC, 0600);
if (fd < 0)
@@ -104,6 +106,7 @@ bool test_sparse (void)
result = true;
close (fd);
rmfile ("testhole");
+#endif
return result;
}
@@ -709,7 +712,8 @@ int main (int argc, char *argv[])
test_dir ();
test_link ();
test_small ();
- test_empty ();
+ if (have_sparse)
+ test_empty ();
test_expfail ();
test_pretty_print ();
diff --git a/src/modules/job-exec/job-exec.c b/src/modules/job-exec/job-exec.c
index d29aba68a..c6b76fb92 100644
--- a/src/modules/job-exec/job-exec.c
+++ b/src/modules/job-exec/job-exec.c
@@ -89,6 +89,7 @@
#endif
#include <assert.h>
#include <unistd.h>
+#include <signal.h>
#include <flux/core.h>
#include "src/common/libczmqcontainers/czmq_containers.h"
diff --git a/src/shell/rlimit.c b/src/shell/rlimit.c
index 25a19d936..f83904525 100644
--- a/src/shell/rlimit.c
+++ b/src/shell/rlimit.c
@@ -60,8 +60,10 @@ static int rlimit_name_to_string (const char *name)
return RLIMIT_NICE;
if (streq (name, "rtprio"))
return RLIMIT_RTPRIO;
+#ifdef RLIMIT_RTTTIME
if (streq (name, "rttime"))
return RLIMIT_RTTIME;
+#endif
if (streq (name, "sigpending"))
return RLIMIT_SIGPENDING;
return -1;
diff --git a/src/cmd/flux-exec.c b/src/cmd/flux-exec.c
index eeeb2c581..79747091d 100644
--- a/src/cmd/flux-exec.c
+++ b/src/cmd/flux-exec.c
@@ -190,9 +190,12 @@ void output_cb (flux_subprocess_t *p, const char *stream)
log_err_exit ("flux_subprocess_getline");
if (lenp) {
+ int rc;
if (optparse_getopt (opts, "label-io", NULL) > 0)
fprintf (fstream, "%d: ", flux_subprocess_rank (p));
- fwrite (ptr, lenp, 1, fstream);
+ rc = fwrite (ptr, lenp, 1, fstream);
+ if (rc != lenp)
+ log_err ("fwrite");
}
}
diff --git a/src/cmd/flux-job.c b/src/cmd/flux-job.c
index 979c7fbf7..2eb7c7a8b 100644
--- a/src/cmd/flux-job.c
+++ b/src/cmd/flux-job.c
@@ -1672,9 +1672,12 @@ static void handle_output_data (struct attach_ctx *ctx, json_t *context)
else
fp = stderr;
if (len > 0) {
+ int rc;
if (optparse_hasopt (ctx->p, "label-io"))
fprintf (fp, "%s: ", rank);
- fwrite (data, len, 1, fp);
+ rc = fwrite (data, len, 1, fp);
+ if (rc != len)
+ log_err ("fwrite");
fflush (fp);
}
free (data);
@@ -2205,7 +2208,9 @@ void handle_exec_log_msg (struct attach_ctx *ctx, double ts, json_t *context)
rank,
stream);
}
- fwrite (data, len, 1, stderr);
+ int rc = fwrite (data, len, 1, stderr);
+ if (rc != len)
+ log_err ("fwrite");
}
static struct idset *all_taskids (const struct taskmap *map)
diff --git a/src/common/libsubprocess/subprocess.c b/src/common/libsubprocess/subprocess.c
index da068b3d3..72cb6cca6 100644
--- a/src/common/libsubprocess/subprocess.c
+++ b/src/common/libsubprocess/subprocess.c
@@ -262,8 +262,11 @@ void flux_standard_output (flux_subprocess_t *p, const char *stream)
}
}
- if (lenp)
- fwrite (ptr, lenp, 1, fstream);
+ if (lenp) {
+ int rc = fwrite (ptr, lenp, 1, fstream);
+ if (rc != lenp)
+ log_err ("fwrite");
+ }
}
/*
diff --git a/src/shell/output.c b/src/shell/output.c
index 8ebf07365..6e3422605 100644
--- a/src/shell/output.c
+++ b/src/shell/output.c
@@ -173,8 +173,11 @@ static int shell_output_term (struct shell_output *out)
f = stderr;
}
if ((output_type == FLUX_OUTPUT_TYPE_TERM) && len > 0) {
+ int rc;
fprintf (f, "%s: ", rank);
- fwrite (data, len, 1, f);
+ rc = fwrite (data, len, 1, f);
+ if (rc != len)
+ return -1;
}
free (data);
}
diff --git a/t/rexec/rexec_count_stdout.c b/t/rexec/rexec_count_stdout.c
index 8cb9ff932..f5e1985f8 100644
--- a/t/rexec/rexec_count_stdout.c
+++ b/t/rexec/rexec_count_stdout.c
@@ -69,8 +69,10 @@ void output_cb (flux_subprocess_t *p, const char *stream)
}
}
- if (lenp)
- fwrite (ptr, lenp, 1, fstream);
+ if (lenp) {
+ if (fwrite (ptr, lenp, 1, fstream) != lenp)
+ log_err ("fwrite");
+ }
if (!strcasecmp (stream, "stdout"))
stdout_count++;
diff --git a/t/rexec/rexec_getline.c b/t/rexec/rexec_getline.c
index b4a17c3ea..55fd57ffd 100644
--- a/t/rexec/rexec_getline.c
+++ b/t/rexec/rexec_getline.c
@@ -76,8 +76,10 @@ void output_cb (flux_subprocess_t *p, const char *stream)
if (!(ptr = flux_subprocess_getline (p, stream, &lenp)))
log_err_exit ("flux_subprocess_getline");
- if (lenp)
- fwrite (ptr, lenp, 1, fstream);
+ if (lenp) {
+ int rc = fwrite (ptr, lenp, 1, fstream);
+ (void) (rc);
+ }
else
fprintf (fstream, "EOF\n");
}
diff -Nur flux-core-0.49.0/src/common/libeventlog/Makefile.in flux-core-0.49.0.new/src/common/libeventlog/Makefile.in
--- flux-core-0.49.0/src/common/libeventlog/Makefile.in 2023-04-05 16:24:09.982692163 +0000
+++ flux-core-0.49.0.new/src/common/libeventlog/Makefile.in 2023-04-12 03:49:02.262611471 +0000
@@ -691,7 +691,7 @@
$(top_builddir)/src/common/libtap/libtap.la \
$(top_builddir)/src/common/libeventlog/libeventlog.la \
$(top_builddir)/src/common/libutil/libutil.la \
- $(JANSSON_LIBS)
+ $(JANSSON_LIBS) -lrt
all: all-am
diff -Nur flux-core-0.49.0/src/shell/Makefile.in flux-core-0.49.0.new/src/shell/Makefile.in
--- flux-core-0.49.0/src/shell/Makefile.in 2023-04-05 16:24:12.798689648 +0000
+++ flux-core-0.49.0.new/src/shell/Makefile.in 2023-04-12 02:50:11.579942667 +0000
@@ -872,13 +872,14 @@
$(top_builddir)/src/bindings/lua/libfluxlua.la \
$(top_builddir)/src/common/libflux-core.la \
$(top_builddir)/src/common/libflux-taskmap.la \
+ $(top_builddir)/src/common/libflux-idset.la \
$(top_builddir)/src/common/libpmi/libpmi_server.la \
$(top_builddir)/src/common/libpmi/libpmi_common.la \
$(top_builddir)/src/common/libczmqcontainers/libczmqcontainers.la \
- $(top_builddir)/src/common/libflux-internal.la \
$(top_builddir)/src/common/libflux-optparse.la \
$(top_builddir)/src/common/libterminus/libterminus.la \
$(top_builddir)/src/common/libutil/libutil.la \
+ $(top_builddir)/src/common/libflux-internal.la \
$(LUA_LIB) \
$(HWLOC_LIBS) \
$(JANSSON_LIBS) \
--- a/t/t0001-basic.t 2023-04-05 16:22:48.910745814 +0000
+++ b/t/t0001-basic.t 2023-04-13 13:45:26.201487673 +0000
@@ -613,7 +613,8 @@
grep "^test two commands" help2.out &&
grep "a test two" help2.out
'
-test_expect_success 'flux-help command can display manpages for subcommands' '
+command -v man >/dev/null && test_set_prereq HAVE_MAN
+test_expect_success HAVE_MAN 'flux-help command can display manpages for subcommands' '
PWD=$(pwd) &&
mkdir -p man/man1 &&
cat <<-EOF > man/man1/flux-foo.1 &&
@@ -623,7 +624,7 @@
EOF
MANPATH=${PWD}/man FLUX_IGNORE_NO_DOCS=y flux help foo | grep "^FOO(1)"
'
-test_expect_success 'flux-help command can display manpages for api calls' '
+test_expect_success HAVE_MAN 'flux-help command can display manpages for api calls' '
PWD=$(pwd) &&
mkdir -p man/man3 &&
cat <<-EOF > man/man3/flux_foo.3 &&
@@ -638,7 +639,7 @@
man notacommand >/dev/null 2>&1
echo $?
}
-test_expect_success 'flux-help returns nonzero exit code from man(1)' '
+test_expect_success HAVE_MAN 'flux-help returns nonzero exit code from man(1)' '
test_expect_code $(missing_man_code) \
eval FLUX_IGNORE_NO_DOCS=y flux help notacommand
'
diff --git a/t/sharness.d/01-setup.sh b/t/sharness.d/01-setup.sh
index 84b02f97f..fd9387ed5 100644
--- a/t/sharness.d/01-setup.sh
+++ b/t/sharness.d/01-setup.sh
@@ -57,6 +57,7 @@ else # normal case, use ${top_builddir}/src/cmd/flux
#
export LD_LIBRARY_PATH="${FLUX_BUILD_DIR}/src/common/.libs:$LD_LIBRARY_PATH"
fi
+PATH=$(flux python -c 'import os,sys; print(os.path.dirname(sys.executable))'):$PATH
export PATH
if ! test -x ${fluxbin}; then
|
FYI: This is what I ended up with at the end of the build:
|
I've included some of these fixes in a PR #5093, so the patch for conda-forge can be reduced at the next release. |
Hold on, I think when combining patches I may have made a mistake in the patch above. I'll paste a corrected version here once I've verified it is fully working. |
Ok, here's a corrected patch (verified working this time). I was finding that tests were failing sometimes due to some Also, I forgot to mention that I couldn't find a package containing diff --git a/src/broker/state_machine.c b/src/broker/state_machine.c
index 57e727fea..b02a3b144 100644
--- a/src/broker/state_machine.c
+++ b/src/broker/state_machine.c
@@ -11,6 +11,8 @@
#if HAVE_CONFIG_H
#include "config.h"
#endif
+#include <signal.h>
+
#include <flux/core.h>
#include "src/common/libczmqcontainers/czmq_containers.h"
diff --git a/src/cmd/builtin/proxy.c b/src/cmd/builtin/proxy.c
index feff795b9..655df262a 100644
--- a/src/cmd/builtin/proxy.c
+++ b/src/cmd/builtin/proxy.c
@@ -18,6 +18,7 @@
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
+#include <signal.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
diff --git a/src/common/libsubprocess/server.c b/src/common/libsubprocess/server.c
index 2c164646c..275aa3443 100644
--- a/src/common/libsubprocess/server.c
+++ b/src/common/libsubprocess/server.c
@@ -13,6 +13,7 @@
#endif
#include <unistd.h> // defines environ
+#include <signal.h>
#include <errno.h>
#include <flux/core.h>
diff --git a/src/common/libterminus/pty.c b/src/common/libterminus/pty.c
index a1dbf6788..a3c6f4c7b 100644
--- a/src/common/libterminus/pty.c
+++ b/src/common/libterminus/pty.c
@@ -208,8 +208,10 @@ int flux_pty_kill (struct flux_pty *pty, int sig)
pty->wait_for_client = false;
pty->wait_on_close = false;
}
+#if defined(TIOCSIG)
if (ioctl (pty->leader, TIOCSIG, sig) >= 0)
return 0;
+#endif
llog_debug (pty, "ioctl (TIOCSIG): %s", strerror (errno));
if (ioctl (pty->leader, TIOCGPGRP, &pgrp) >= 0
&& pgrp > 0
diff --git a/src/common/libutil/fileref.c b/src/common/libutil/fileref.c
index 69213b0f0..22a4d3359 100644
--- a/src/common/libutil/fileref.c
+++ b/src/common/libutil/fileref.c
@@ -57,8 +57,10 @@ static int blobvec_append (json_t *blobvec,
static bool file_has_no_data (int fd)
{
+#if defined(SEEK_DATA)
if (lseek (fd, 0, SEEK_DATA) == (off_t)-1 && errno == ENXIO)
return true;
+#endif
return false;
}
@@ -83,19 +85,25 @@ static json_t *blobvec_create (int fd,
goto error;
}
while (offset < size) {
+#if defined(SEEK_DATA)
// N.B. fails with ENXIO if there is no more data
if ((offset = lseek (fd, offset, SEEK_DATA)) == (off_t)-1) {
if (errno == ENXIO)
break;
goto error;
}
+#endif
if (offset < size) {
off_t notdata;
int blobsize;
+#if defined(SEEK_HOLE)
// N.B. returns size if there are no more holes
if ((notdata = lseek (fd, offset, SEEK_HOLE)) == (off_t)-1)
goto error;
+#else
+ notdata = size;
+#endif
blobsize = notdata - offset;
if (blobsize > chunksize)
blobsize = chunksize;
diff --git a/src/common/libutil/test/fileref.c b/src/common/libutil/test/fileref.c
index 61cb0bdfe..6fbd84d9b 100644
--- a/src/common/libutil/test/fileref.c
+++ b/src/common/libutil/test/fileref.c
@@ -87,9 +87,11 @@ void rmfile (const char *name)
*/
bool test_sparse (void)
{
+ bool result = false;
+
+#if defined(SEEK_DATA)
int fd;
struct stat sb;
- bool result = false;
fd = open (mkpath ("testhole"), O_WRONLY | O_CREAT | O_TRUNC, 0600);
if (fd < 0)
@@ -104,6 +106,7 @@ bool test_sparse (void)
result = true;
close (fd);
rmfile ("testhole");
+#endif
return result;
}
@@ -709,7 +712,8 @@ int main (int argc, char *argv[])
test_dir ();
test_link ();
test_small ();
- test_empty ();
+ if (have_sparse)
+ test_empty ();
test_expfail ();
test_pretty_print ();
diff --git a/src/modules/job-exec/job-exec.c b/src/modules/job-exec/job-exec.c
index d29aba68a..c6b76fb92 100644
--- a/src/modules/job-exec/job-exec.c
+++ b/src/modules/job-exec/job-exec.c
@@ -89,6 +89,7 @@
#endif
#include <assert.h>
#include <unistd.h>
+#include <signal.h>
#include <flux/core.h>
#include "src/common/libczmqcontainers/czmq_containers.h"
diff --git a/src/shell/rlimit.c b/src/shell/rlimit.c
index 25a19d936..f83904525 100644
--- a/src/shell/rlimit.c
+++ b/src/shell/rlimit.c
@@ -60,8 +60,10 @@ static int rlimit_name_to_string (const char *name)
return RLIMIT_NICE;
if (streq (name, "rtprio"))
return RLIMIT_RTPRIO;
+#ifdef RLIMIT_RTTTIME
if (streq (name, "rttime"))
return RLIMIT_RTTIME;
+#endif
if (streq (name, "sigpending"))
return RLIMIT_SIGPENDING;
return -1;
diff --git a/src/cmd/flux-exec.c b/src/cmd/flux-exec.c
index eeeb2c581..79747091d 100644
--- a/src/cmd/flux-exec.c
+++ b/src/cmd/flux-exec.c
@@ -190,9 +190,12 @@ void output_cb (flux_subprocess_t *p, const char *stream)
log_err_exit ("flux_subprocess_getline");
if (lenp) {
+ int rc;
if (optparse_getopt (opts, "label-io", NULL) > 0)
fprintf (fstream, "%d: ", flux_subprocess_rank (p));
- fwrite (ptr, lenp, 1, fstream);
+ rc = fwrite (ptr, lenp, 1, fstream);
+ (void) rc;
+
}
}
diff --git a/src/cmd/flux-job.c b/src/cmd/flux-job.c
index 979c7fbf7..2eb7c7a8b 100644
--- a/src/cmd/flux-job.c
+++ b/src/cmd/flux-job.c
@@ -1672,9 +1672,12 @@ static void handle_output_data (struct attach_ctx *ctx, json_t *context)
else
fp = stderr;
if (len > 0) {
+ int rc;
if (optparse_hasopt (ctx->p, "label-io"))
fprintf (fp, "%s: ", rank);
- fwrite (data, len, 1, fp);
+ rc = fwrite (data, len, 1, fp);
+ (void) rc;
+
fflush (fp);
}
free (data);
@@ -2205,7 +2208,9 @@ void handle_exec_log_msg (struct attach_ctx *ctx, double ts, json_t *context)
rank,
stream);
}
- fwrite (data, len, 1, stderr);
+ int rc = fwrite (data, len, 1, stderr);
+ (void) rc;
+
}
static struct idset *all_taskids (const struct taskmap *map)
diff --git a/src/common/libsubprocess/subprocess.c b/src/common/libsubprocess/subprocess.c
index da068b3d3..72cb6cca6 100644
--- a/src/common/libsubprocess/subprocess.c
+++ b/src/common/libsubprocess/subprocess.c
@@ -262,8 +262,11 @@ void flux_standard_output (flux_subprocess_t *p, const char *stream)
}
}
- if (lenp)
- fwrite (ptr, lenp, 1, fstream);
+ if (lenp) {
+ int rc = fwrite (ptr, lenp, 1, fstream);
+ (void) rc;
+
+ }
}
/*
diff --git a/src/shell/output.c b/src/shell/output.c
index 8ebf07365..6e3422605 100644
--- a/src/shell/output.c
+++ b/src/shell/output.c
@@ -173,8 +173,11 @@ static int shell_output_term (struct shell_output *out)
f = stderr;
}
if ((output_type == FLUX_OUTPUT_TYPE_TERM) && len > 0) {
+ int rc;
fprintf (f, "%s: ", rank);
- fwrite (data, len, 1, f);
+ rc = fwrite (data, len, 1, f);
+ (void) rc;
+
}
free (data);
}
diff --git a/t/rexec/rexec_count_stdout.c b/t/rexec/rexec_count_stdout.c
index 8cb9ff932..f5e1985f8 100644
--- a/t/rexec/rexec_count_stdout.c
+++ b/t/rexec/rexec_count_stdout.c
@@ -69,8 +69,10 @@ void output_cb (flux_subprocess_t *p, const char *stream)
}
}
- if (lenp)
- fwrite (ptr, lenp, 1, fstream);
+ if (lenp) {
+ int rc = fwrite (ptr, lenp, 1, fstream);
+ (void) rc;
+ }
if (!strcasecmp (stream, "stdout"))
stdout_count++;
diff --git a/t/rexec/rexec_getline.c b/t/rexec/rexec_getline.c
index b4a17c3ea..55fd57ffd 100644
--- a/t/rexec/rexec_getline.c
+++ b/t/rexec/rexec_getline.c
@@ -76,8 +76,10 @@ void output_cb (flux_subprocess_t *p, const char *stream)
if (!(ptr = flux_subprocess_getline (p, stream, &lenp)))
log_err_exit ("flux_subprocess_getline");
- if (lenp)
- fwrite (ptr, lenp, 1, fstream);
+ if (lenp) {
+ int rc = fwrite (ptr, lenp, 1, fstream);
+ (void) (rc);
+ }
else
fprintf (fstream, "EOF\n");
}
diff -Nur flux-core-0.49.0/src/common/libeventlog/Makefile.in flux-core-0.49.0.new/src/common/libeventlog/Makefile.in
--- flux-core-0.49.0/src/common/libeventlog/Makefile.in 2023-04-05 16:24:09.982692163 +0000
+++ flux-core-0.49.0.new/src/common/libeventlog/Makefile.in 2023-04-12 03:49:02.262611471 +0000
@@ -691,7 +691,7 @@
$(top_builddir)/src/common/libtap/libtap.la \
$(top_builddir)/src/common/libeventlog/libeventlog.la \
$(top_builddir)/src/common/libutil/libutil.la \
- $(JANSSON_LIBS)
+ $(JANSSON_LIBS) -lrt
all: all-am
diff -Nur flux-core-0.49.0/src/shell/Makefile.in flux-core-0.49.0.new/src/shell/Makefile.in
--- flux-core-0.49.0/src/shell/Makefile.in 2023-04-05 16:24:12.798689648 +0000
+++ flux-core-0.49.0.new/src/shell/Makefile.in 2023-04-12 02:50:11.579942667 +0000
@@ -872,13 +872,14 @@
$(top_builddir)/src/bindings/lua/libfluxlua.la \
$(top_builddir)/src/common/libflux-core.la \
$(top_builddir)/src/common/libflux-taskmap.la \
+ $(top_builddir)/src/common/libflux-idset.la \
$(top_builddir)/src/common/libpmi/libpmi_server.la \
$(top_builddir)/src/common/libpmi/libpmi_common.la \
$(top_builddir)/src/common/libczmqcontainers/libczmqcontainers.la \
- $(top_builddir)/src/common/libflux-internal.la \
$(top_builddir)/src/common/libflux-optparse.la \
$(top_builddir)/src/common/libterminus/libterminus.la \
$(top_builddir)/src/common/libutil/libutil.la \
+ $(top_builddir)/src/common/libflux-internal.la \
$(LUA_LIB) \
$(HWLOC_LIBS) \
$(JANSSON_LIBS) \
--- a/t/t0001-basic.t 2023-04-05 16:22:48.910745814 +0000
+++ b/t/t0001-basic.t 2023-04-13 13:45:26.201487673 +0000
@@ -613,7 +613,8 @@
grep "^test two commands" help2.out &&
grep "a test two" help2.out
'
-test_expect_success 'flux-help command can display manpages for subcommands' '
+command -v man >/dev/null && test_set_prereq HAVE_MAN
+test_expect_success HAVE_MAN 'flux-help command can display manpages for subcommands' '
PWD=$(pwd) &&
mkdir -p man/man1 &&
cat <<-EOF > man/man1/flux-foo.1 &&
@@ -623,7 +624,7 @@
EOF
MANPATH=${PWD}/man FLUX_IGNORE_NO_DOCS=y flux help foo | grep "^FOO(1)"
'
-test_expect_success 'flux-help command can display manpages for api calls' '
+test_expect_success HAVE_MAN 'flux-help command can display manpages for api calls' '
PWD=$(pwd) &&
mkdir -p man/man3 &&
cat <<-EOF > man/man3/flux_foo.3 &&
@@ -638,7 +639,7 @@
man notacommand >/dev/null 2>&1
echo $?
}
-test_expect_success 'flux-help returns nonzero exit code from man(1)' '
+test_expect_success HAVE_MAN 'flux-help returns nonzero exit code from man(1)' '
test_expect_code $(missing_man_code) \
eval FLUX_IGNORE_NO_DOCS=y flux help notacommand
'
diff --git a/t/sharness.d/01-setup.sh b/t/sharness.d/01-setup.sh
index 84b02f97f..fd9387ed5 100644
--- a/t/sharness.d/01-setup.sh
+++ b/t/sharness.d/01-setup.sh
@@ -57,6 +57,7 @@ else # normal case, use ${top_builddir}/src/cmd/flux
#
export LD_LIBRARY_PATH="${FLUX_BUILD_DIR}/src/common/.libs:$LD_LIBRARY_PATH"
fi
+PATH=$(flux python -c 'import os,sys; print(os.path.dirname(sys.executable))'):$PATH
export PATH
if ! test -x ${fluxbin}; then
|
Oh, also, I had to add a |
@jan-janssen - I tried this build locally with MPI and for some reason in the conda-build environment running the MPI jobs as part of testing is not working. The test jobs are hanging (likely in
which I believe should work without the flux-pmix shell plugin. However, to diagnose we need some way to test interactively in the conda-build environment. Do you know how to do that? |
@jan-janssen I finally figured out how to install a package built locally from the staged-recipes
The last step allows flux-core to be configured and built under the conda environment. After those steps, I was able to reproduce the failure with the openmpi tests. The problem appears to be solved by exporting the following environment variable:
I'm currently testing this with the conda-forge |
@grondo I am sorry for the slow response, I updated the pull request now I only get one error and one failure:
This might be related to running the tests in a restricted docker container. Maybe we can just skip those tests. |
Yeah, the MPI tests seem to be brittle in the conda-forge build environment. Since Flux does not require MPI to build (it only requires it to run some MPI launch testing), my inclination would be to build the conda-forge flux-core package without all the MPI permutations, and then separately test that Flux can launch the various MPIs packaged in conda. That is, a single build of flux-core should be able to launch multiple versions of MPI, so there is no reason to require a "openmpi" or "mpich" variant of flux-core in conda. If you still want to build with |
@grondo Thanks a lot - the pull request is finally merged and I am going to start working on |
Somehow the build infrastructure between
|
Ah, that's an actual bug. Must be a different (newer?) compiler? I'll get that fixed here, in the meantime here's a patch and sorry about that! diff --git a/src/modules/resource/exclude.c b/src/modules/resource/exclude.c
index 62326abf6..ea0f46581 100644
--- a/src/modules/resource/exclude.c
+++ b/src/modules/resource/exclude.c
@@ -83,13 +83,13 @@ int exclude_update (struct exclude *exclude,
add_s) < 0) {
flux_log_error (h, "error posting exclude event");
}
- free (add_s);
/* Added exclude ranks can no longer be drained:
*/
if (undrain_ranks (exclude->ctx->drain, add) < 0)
flux_log_error (h,
"exclude: failed to undrain ranks in %s",
add_s);
+ free (add_s);
idset_destroy (add);
}
if (del) { |
Thanks a lot - it is working and the package should be pushed to the conda repositories soon. |
Beyond what I learned this week I have no experience with conda, so I'm not sure I'd be a good choice as a maintainer. Please feel free to continue to open issues here as they come up! |
Either you can watch and learn which would be the preferred solution from my side, as it gives you the option to adjust the patch yourself without waiting for me. Still it is also fine for me to open the issues here and discuss. It depends on what you prefer. |
Ah, that would be fine then in case it saves you some time shuffling patches back and forth from issues in this repo! |
I try to build flux from source but I get the following error message:
The text was updated successfully, but these errors were encountered: