Monday, April 25, 2011

Don't Bother with This Post, but Do Give mod_spdy a Try!

‹prev | My Chain | next›

Update: It seems as though you should bother with mod_spdy nowadays (2011-12-22). Per the comments below, mod_spdy is again being actively maintained again. Yay!

Tonight, I am going to see how far along I can get with mod_spdy, the SPDY module for Apache. I expect that most of my work with SPDY will be in the form of node.js or Ruby implementations, but Apache affords me a nice level of comfort with respect to simply serving up files.

I get myself off to an auspicious start:
➜  spdy  sudo apt-get install subversion
[sudo] password for cstrom:
Reading package lists... Done
Building dependency tree
Reading state information... Done
Suggested packages:
subversion-tools db4.8-util
The following NEW packages will be installed:
subversion
0 upgraded, 1 newly installed, 0 to remove and 8 not upgraded.
Need to get 298 kB of archives.
After this operation, 1,257 kB of additional disk space will be used.
Get:1 http://us.archive.ubuntu.com/ubuntu/ natty/main subversion amd64 1.6.12dfsg-4ubuntu2 [298 kB]
Fetched 298 kB in 3s (85.5 kB/s)
Selecting previously deselected package subversion.
(Reading database ... 242860 files and directories currently installed.)
Unpacking subversion (from .../subversion_1.6.12dfsg-4ubuntu2_amd64.deb) ...
Processing triggers for man-db ...
Setting up subversion (1.6.12dfsg-4ubuntu2) ...
With that out of the way, I can download the "depot tools" source code, which I install into ~/repos/spdy:
➜  spdy  svn co http://src.chromium.org/svn/trunk/tools/depot_tools
A    depot_tools/git-cl
A    depot_tools/README.gclient
A    depot_tools/WATCHLISTS
A    depot_tools/README.codereview
A    depot_tools/git_cl.py
...
A    depot_tools/wtf
...
A    depot_tools/zsh-goodies
A    depot_tools/zsh-goodies/_gclient
A    depot_tools/zsh-goodies/README
...
A    depot_tools/cpplint.bat
A    depot_tools/hammer.bat
U   depot_tools
Checked out revision 82936.
(gotta love a codebase with an wtf file)

Again in ~repos/spdy, I install :
➜  spdy  mkdir mod_spdy
➜  spdy  cd mod_spdy
➜  mod_spdy  ../depot_tools/gclient config http://mod-spdy.googlecode.com/svn/trunk/src
➜  mod_spdy  ls
➜  mod_spdy  ls -a
.  ..  .gclient
Strange. This is my first experience with gclient, but I expected more to happen than just creating a .gclient file:
➜  mod_spdy  cat .gclient 
solutions = [
{ "name"        : "src",
"url"         : "http://mod-spdy.googlecode.com/svn/trunk/src",
"custom_deps" : {
},
"safesync_url": "",
},
]
It seems the real magic is in the update sub-command, which installs a lot of stuff:
➜  mod_spdy  ../depot_tools/gclient update --force

________ running 'svn checkout http://mod-spdy.googlecode.com/svn/trunk/src /home/cstrom/repos/spdy/mod_spdy/src --force --ignore-externals' in '/home/cstrom/repos/spdy/mod_spdy'
A    /home/cstrom/repos/spdy/mod_spdy/src/build
A    /home/cstrom/repos/spdy/mod_spdy/src/build/common.gypi
A    /home/cstrom/repos/spdy/mod_spdy/src/build/gyp_chromium
...
U   /home/cstrom/repos/spdy/mod_spdy/src
Checked out revision 143.
Syncing projects:   5% ( 1/18)
________ running 'svn checkout http://src.chromium.org/svn/trunk/src/net/tools/flip_server@46690 /home/cstrom/repos/spdy/mod_spdy/src/third_party/chromium/src/net/tools/flip_server --revision 46690 --force --ignore-externals' in '/home/cstrom/repos/spdy/mod_spdy'
A    /home/cstrom/repos/spdy/mod_spdy/src/third_party/chromium/src/net/tools/flip_server/split.cc
A    /home/cstrom/repos/spdy/mod_spdy/src/third_party/chromium/src/net/tools/flip_server/balsa_enums.h
...
A    /home/cstrom/repos/spdy/mod_spdy/src/third_party/chromium/src/net/tools/flip_server/ring_buffer.h
Checked out revision 46690.
Syncing projects:  11% ( 2/18)
________ running 'svn checkout http://src.chromium.org/svn/trunk/src/base@46690 /home/cstrom/repos/spdy/mod_spdy/src/third_party/chromium/src/base --revision 46690 --force --ignore-externals' in '/home/cstrom/repos/spdy/mod_spdy'
A    /home/cstrom/repos/spdy/mod_spdy/src/third_party/chromium/src/base/windows_message_list.h
...
A    /home/cstrom/repos/spdy/mod_spdy/src/third_party/chromium/src/base/debug_message.cc
U   /home/cstrom/repos/spdy/mod_spdy/src/third_party/chromium/src/base
Checked out revision 46690.
Syncing projects:  16% ( 3/18)

________ running 'svn checkout http://svn.apache.org/repos/asf/apr/apr/tags/1.4.2@head /home/cstrom/repos/spdy/mod_spdy/src/third_party/apache/apr/src --revision head --force --ignore-externals' in '/home/cstrom/repos/spdy/mod_spdy'
A    /home/cstrom/repos/spdy/mod_spdy/src/third_party/apache/apr/src/config.layout
A    /home/cstrom/repos/spdy/mod_spdy/src/third_party/apache/apr/src/Makefile.in
...
/home/cstrom/repos/spdy/mod_spdy/src/tools/grit/grit.py
A    /home/cstrom/repos/spdy/mod_spdy/src/tools/grit/README
Checked out revision 46690.
Syncing projects:  27% ( 5/18)
________ running 'svn checkout http://src.chromium.org/svn/trunk/src/testing@46690 /home/cstrom/repos/spdy/mod_spdy/src/testing --revision 46690 --force --ignore-externals' in '/home/cstrom/repos/spdy/mod_spdy'
A    /home/cstrom/repos/spdy/mod_spdy/src/testing/README.chromium
A    /home/cstrom/repos/spdy/mod_spdy/src/testing/gmock
...
A    /home/cstrom/repos/spdy/mod_spdy/src/testing/gmock_mutant.h
U   /home/cstrom/repos/spdy/mod_spdy/src/testing
Checked out revision 46690.
Syncing projects:  33% ( 6/18)

________ running 'svn checkout http://svn.apache.org/repos/asf/httpd/httpd/tags/2.2.15/include@head /home/cstrom/repos/spdy/mod_spdy/src/third_party/apache/httpd/src/include --revision head --force --ignore-externals' in '/home/cstrom/repos/spdy/mod_spdy'
A    /home/cstrom/repos/spdy/mod_spdy/src/third_party/apache/httpd/src/include/ap_regex.h
A    /home/cstrom/repos/spdy/mod_spdy/src/third_party/apache/httpd/src/include/util_time.h
...
A    /home/cstrom/repos/spdy/mod_spdy/src/third_party/apache/httpd/src/include/http_request.h
U   /home/cstrom/repos/spdy/mod_spdy/src/third_party/apache/httpd/src/include
Checked out revision 1096629.
Syncing projects:  38% ( 7/18)
________ running 'svn checkout http://src.chromium.org/svn/trunk/src/third_party/protobuf2@46690 /home/cstrom/repos/spdy/mod_spdy/src/third_party/protobuf2 --revision 46690 --force --ignore-externals' in '/home/cstrom/repos/spdy/mod_spdy'
A    /home/cstrom/repos/spdy/mod_spdy/src/third_party/protobuf2/__init__.py
A    /home/cstrom/repos/spdy/mod_spdy/src/third_party/protobuf2/descriptor_pb2.py
A    /home/cstrom/repos/spdy/mod_spdy/src/third_party/protobuf2/config.h
A    /home/cstrom/repos/spdy/mod_spdy/src/third_party/protobuf2/protobuf.gyp
U   /home/cstrom/repos/spdy/mod_spdy/src/third_party/protobuf2
Checked out revision 46690.
Syncing projects:  44% ( 8/18)
________ running 'svn checkout http://protobuf.googlecode.com/svn/trunk@327 /home/cstrom/repos/spdy/mod_spdy/src/third_party/protobuf2/src --revision 327 --force --ignore-externals' in '/home/cstrom/repos/spdy/mod_spdy'
A    /home/cstrom/repos/spdy/mod_spdy/src/third_party/protobuf2/src/post_process_dist.sh
...
A    /home/cstrom/repos/spdy/mod_spdy/src/third_party/protobuf2/src/examples/Makefile
U   /home/cstrom/repos/spdy/mod_spdy/src/third_party/protobuf2/src
Checked out revision 327.
Syncing projects:  50% ( 9/18)
________ running 'svn checkout http://src.chromium.org/svn/trunk/src/tools/data_pack@46690 /home/cstrom/repos/spdy/mod_spdy/src/tools/data_pack --revision 46690 --force --ignore-externals' in '/home/cstrom/repos/spdy/mod_spdy'
A    /home/cstrom/repos/spdy/mod_spdy/src/tools/data_pack/repack.py
A    /home/cstrom/repos/spdy/mod_spdy/src/tools/data_pack/scons.py
A    /home/cstrom/repos/spdy/mod_spdy/src/tools/data_pack/data_pack.py
U   /home/cstrom/repos/spdy/mod_spdy/src/tools/data_pack
Checked out revision 46690.
Syncing projects:  55% (10/18)
________ running 'svn checkout http://src.chromium.org/svn/trunk/src/third_party/scons@46690 /home/cstrom/repos/spdy/mod_spdy/src/third_party/scons --revision 46690 --force --ignore-externals' in '/home/cstrom/repos/spdy/mod_spdy'
A    /home/cstrom/repos/spdy/mod_spdy/src/third_party/scons/README.chromium
A    /home/cstrom/repos/spdy/mod_spdy/src/third_party/scons/scons-README
A    /home/cstrom/repos/spdy/mod_spdy/src/third_party/scons/scons-LICENSE
...
A    /home/cstrom/repos/spdy/mod_spdy/src/third_party/scons/scons-local/SCons/Tool/cc.py
A    /home/cstrom/repos/spdy/mod_spdy/src/third_party/scons/scons-local/SCons/Tool/dvips.py
Checked out revision 46690.
Syncing projects:  61% (11/18)
________ running 'svn checkout http://gyp.googlecode.com/svn/trunk@818 /home/cstrom/repos/spdy/mod_spdy/src/tools/gyp --revision 818 --force --ignore-externals' in '/home/cstrom/repos/spdy/mod_spdy'
A    /home/cstrom/repos/spdy/mod_spdy/src/tools/gyp/test
A    /home/cstrom/repos/spdy/mod_spdy/src/tools/gyp/test/additional-targets
...
A    /home/cstrom/repos/spdy/mod_spdy/src/tools/gyp/codereview.settings
A    /home/cstrom/repos/spdy/mod_spdy/src/tools/gyp/DEPS
Checked out revision 818.
Syncing projects:  66% (12/18)


________ running 'svn checkout http://googletest.googlecode.com/svn/trunk@408 /home/cstrom/repos/spdy/mod_spdy/src/testing/gtest --revision 408 --force --ignore-externals' in '/home/cstrom/repos/spdy/mod_spdy'
A    /home/cstrom/repos/spdy/mod_spdy/src/testing/gtest/test
A    /home/cstrom/repos/spdy/mod_spdy/src/testing/gtest/test/gtest_break_on_failure_unittest_.cc
...
A    /home/cstrom/repos/spdy/mod_spdy/src/testing/gtest/CMakeLists.txt
Checked out revision 408.
Syncing projects:  72% (13/18)
________ running 'svn checkout http://svn.apache.org/repos/asf/httpd/httpd/tags/2.2.15/os@head /home/cstrom/repos/spdy/mod_spdy/src/third_party/apache/httpd/src/os --revision head --force --ignore-externals' in '/home/cstrom/repos/spdy/mod_spdy'
A    /home/cstrom/repos/spdy/mod_spdy/src/third_party/apache/httpd/src/os/Makefile.in
...
A    /home/cstrom/repos/spdy/mod_spdy/src/third_party/apache/httpd/src/os/.indent.pro
U   /home/cstrom/repos/spdy/mod_spdy/src/third_party/apache/httpd/src/os
Checked out revision 1096630.
Syncing projects:  77% (14/18)
________ running 'svn checkout http://src.chromium.org/svn/trunk/src/third_party/zlib@46690 /home/cstrom/repos/spdy/mod_spdy/src/third_party/zlib --revision 46690 --force --ignore-externals' in '/home/cstrom/repos/spdy/mod_spdy'
A    /home/cstrom/repos/spdy/mod_spdy/src/third_party/zlib/README.chromium
...
A    /home/cstrom/repos/spdy/mod_spdy/src/third_party/zlib/infback.c
U   /home/cstrom/repos/spdy/mod_spdy/src/third_party/zlib
Checked out revision 46690.
Syncing projects:  83% (15/18)
________ running 'svn checkout http://src.chromium.org/svn/trunk/src/site_scons/site_tools@46690 /home/cstrom/repos/spdy/mod_spdy/src/site_scons/site_tools --revision 46690 --force --ignore-externals' in '/home/cstrom/repos/spdy/mod_spdy'
A    /home/cstrom/repos/spdy/mod_spdy/src/site_scons/site_tools/chromium_builders.py
U   /home/cstrom/repos/spdy/mod_spdy/src/site_scons/site_tools
Checked out revision 46690.
Syncing projects:  88% (16/18)
________ running 'svn checkout http://src.chromium.org/svn/trunk/src/build@46690 /home/cstrom/repos/spdy/mod_spdy/src/third_party/chromium/src/build --revision 46690 --force --ignore-externals' in '/home/cstrom/repos/spdy/mod_spdy'
A    /home/cstrom/repos/spdy/mod_spdy/src/third_party/chromium/src/build/README.chromium
...
A    /home/cstrom/repos/spdy/mod_spdy/src/third_party/chromium/src/build/apply_locales.py
U   /home/cstrom/repos/spdy/mod_spdy/src/third_party/chromium/src/build
Checked out revision 46690.
Syncing projects:  94% (17/18)

________ running 'svn checkout http://svn.apache.org/repos/asf/apr/apr-util/tags/1.3.9@head /home/cstrom/repos/spdy/mod_spdy/src/third_party/apache/aprutil/src --revision head --force --ignore-externals' in '/home/cstrom/repos/spdy/mod_spdy'
A    /home/cstrom/repos/spdy/mod_spdy/src/third_party/apache/aprutil/src/ldap
...
A    /home/cstrom/repos/spdy/mod_spdy/src/third_party/apache/aprutil/src/libaprutil.rc
U   /home/cstrom/repos/spdy/mod_spdy/src/third_party/apache/aprutil/src
Checked out revision 1096632.
Syncing projects: 100% (18/18), done.

________ running '/usr/bin/python src/build/gyp_chromium' in '/home/cstrom/repos/spdy/mod_spdy'
Updating projects from gyp files...
Generating /home/cstrom/repos/spdy/mod_spdy/src/third_party/apache/aprutil/include.target.mk
Generating /home/cstrom/repos/spdy/mod_spdy/src/third_party/protobuf2/py_proto.target.mk
Generating /home/cstrom/repos/spdy/mod_spdy/src/third_party/protobuf2/protobuf_lite.host.mk
Generating /home/cstrom/repos/spdy/mod_spdy/src/third_party/apache/apr/include.target.mk
Generating /home/cstrom/repos/spdy/mod_spdy/src/third_party/zlib/zlib.target.mk
Generating /home/cstrom/repos/spdy/mod_spdy/src/base/base.target.mk
Generating /home/cstrom/repos/spdy/mod_spdy/src/testing/gtest.target.mk
Generating /home/cstrom/repos/spdy/mod_spdy/src/third_party/protobuf2/protobuf_lite.target.mk
Generating /home/cstrom/repos/spdy/mod_spdy/src/third_party/protobuf2/protobuf.host.mk
Generating /home/cstrom/repos/spdy/mod_spdy/src/third_party/apache/apr/apr.target.mk
Generating /home/cstrom/repos/spdy/mod_spdy/src/third_party/apache/httpd/include.target.mk
Generating /home/cstrom/repos/spdy/mod_spdy/src/net/spdy.target.mk
Generating /home/cstrom/repos/spdy/mod_spdy/src/testing/gtestmain.target.mk
Generating /home/cstrom/repos/spdy/mod_spdy/src/testing/gmock.target.mk
Generating /home/cstrom/repos/spdy/mod_spdy/src/third_party/protobuf2/protoc.host.mk
Generating /home/cstrom/repos/spdy/mod_spdy/src/third_party/apache/aprutil/aprutil.target.mk
Generating /home/cstrom/repos/spdy/mod_spdy/src/third_party/mod_diagnostics/mod_diagnostics.target.mk
Generating /home/cstrom/repos/spdy/mod_spdy/src/mod_spdy/spdy_common.target.mk
Generating /home/cstrom/repos/spdy/mod_spdy/src/testing/gmockmain.target.mk
Generating /home/cstrom/repos/spdy/mod_spdy/src/base/base_unittests.target.mk
Generating /home/cstrom/repos/spdy/mod_spdy/src/net/spdy_test.target.mk
Generating /home/cstrom/repos/spdy/mod_spdy/src/mod_static/http_response_proto.target.mk
Generating /home/cstrom/repos/spdy/mod_spdy/src/mod_spdy/spdy_common_test.target.mk
Generating /home/cstrom/repos/spdy/mod_spdy/src/mod_spdy/spdy_apache.target.mk
Generating /home/cstrom/repos/spdy/mod_spdy/src/mod_static/mod_static.target.mk
Generating /home/cstrom/repos/spdy/mod_spdy/src/mod_spdy/mod_spdy.target.mk
Generating /home/cstrom/repos/spdy/mod_spdy/src/build/All.target.mk
Generating /home/cstrom/repos/spdy/mod_spdy/src/third_party/protobuf2/protobuf.Makefile
Generating /home/cstrom/repos/spdy/mod_spdy/src/third_party/apache/apr/apr.Makefile
Generating /home/cstrom/repos/spdy/mod_spdy/src/mod_static/mod_static.Makefile
Generating /home/cstrom/repos/spdy/mod_spdy/src/third_party/apache/httpd/httpd.Makefile
Generating /home/cstrom/repos/spdy/mod_spdy/src/third_party/apache/aprutil/aprutil.Makefile
Generating /home/cstrom/repos/spdy/mod_spdy/src/net/net.Makefile
Generating /home/cstrom/repos/spdy/mod_spdy/src/third_party/zlib/zlib.Makefile
Generating /home/cstrom/repos/spdy/mod_spdy/src/testing/gtest.Makefile
Generating /home/cstrom/repos/spdy/mod_spdy/src/third_party/mod_diagnostics/mod_diagnostics.Makefile
Generating /home/cstrom/repos/spdy/mod_spdy/src/base/base.Makefile
Generating /home/cstrom/repos/spdy/mod_spdy/src/build/all.Makefile
Generating /home/cstrom/repos/spdy/mod_spdy/src/mod_spdy/mod_spdy.Makefile
Generating /home/cstrom/repos/spdy/mod_spdy/src/testing/gmock.Makefile
Whoa. So gclient is apparently some kind of subversion wrapper with extensions for managing svn:external. Hopefully I won't need to learn too much more about it.

Next, I attempt to compile the code:
➜  mod_spdy  cd src
➜  src  make
CC(target) out/Debug/obj.target/base/third_party/chromium/src/base/setproctitle_linux.o
CXX(target) out/Debug/obj.target/base/base/string16.o
CXX(target) out/Debug/obj.target/base/third_party/chromium/src/base/third_party/dmg_fp/dtoa.o
CXX(target) out/Debug/obj.target/base/third_party/chromium/src/base/third_party/dmg_fp/g_fmt.o
CXX(target) out/Debug/obj.target/base/third_party/chromium/src/base/at_exit.o
CXX(target) out/Debug/obj.target/base/third_party/chromium/src/base/debug_util.o
CXX(target) out/Debug/obj.target/base/third_party/chromium/src/base/debug_util_posix.o
CXX(target) out/Debug/obj.target/base/third_party/chromium/src/base/lock.o
CXX(target) out/Debug/obj.target/base/third_party/chromium/src/base/lock_impl_posix.o
CXX(target) out/Debug/obj.target/base/base/logging.o
...
CXX(target) out/Debug/obj.target/protobuf_lite/third_party/protobuf2/src/src/google/protobuf/stubs/hash.o
In file included from /usr/include/c++/4.5/ext/hash_map:60:0,
from third_party/protobuf2/src/src/google/protobuf/stubs/hash.h:43,
from third_party/protobuf2/src/src/google/protobuf/stubs/hash.cc:33:
/usr/include/c++/4.5/backward/backward_warning.h:28:2: warning: #warning This file includes at least one deprecated or antiquated header which may be removed without further notice at a future date. Please use a non-deprecated interface with equivalent functionality instead. For a listing of replacement headers and interfaces, consult the file backward_warning.h. To disable this warning use -Wno-deprecated.
CXX(target) out/Debug/obj.target/protobuf_lite/third_party/protobuf2/src/src/google/protobuf/extension_set.o
In file included from /usr/include/c++/4.5/ext/hash_map:60:0,
from third_party/protobuf2/src/src/google/protobuf/stubs/hash.h:43,
from third_party/protobuf2/src/src/google/protobuf/extension_set.cc:35:
/usr/include/c++/4.5/backward/backward_warning.h:28:2: warning: #warning This file includes at least one deprecated or antiquated header which may be removed without further notice at a future date. Please use a non-deprecated interface with equivalent functionality instead. For a listing of replacement headers and interfaces, consult the file backward_warning.h. To disable this warning use -Wno-deprecated.
CXX(target) out/Debug/obj.target/protobuf_lite/third_party/protobuf2/src/src/google/protobuf/generated_message_util.o
...
RULE http_response_proto_genproto_0 out/Debug/obj/gen/protoc_out/mod_static/http_response.pb.h
TOUCH out/Debug/obj.target/mod_static/http_response_proto.stamp
CXX(target) out/Debug/obj.target/mod_static/mod_static/mod_static.o
CXX(target) out/Debug/obj.target/mod_static/gen/protoc_out/mod_static/http_response.pb.o
SOLINK(target) out/Debug/obj.target/mod_static/libmod_static.so
COPY out/Debug/libmod_static.so
CXX(target) out/Debug/obj.target/spdy_test/net/spdy/spdy_protocol_test.o
cc1plus: warnings being treated as errors
net/spdy/spdy_protocol_test.cc: In member function ‘virtual void::SpdyProtocolTest_FrameStructs_Test::TestBody()’:
net/spdy/spdy_protocol_test.cc:64:3: error: converting ‘false’ to pointer type for argument 1 of ‘char testing::internal::IsNullLiteralHelper(testing::internal::Secret*)’
net/spdy/spdy_protocol_test.cc:70:3: error: converting ‘false’ to pointer type for argument 1 of ‘char testing::internal::IsNullLiteralHelper(testing::internal::Secret*)’
net/spdy/spdy_protocol_test.cc: At global scope:
net/spdy/spdy_protocol_test.cc:40:1: error: ‘<unnamed>::SpdyProtocolTest_ProtocolConstants_Test::test_info_’ defined but not used
net/spdy/spdy_protocol_test.cc:58:1: error: ‘<unnamed>::SpdyProtocolTest_FrameStructs_Test::test_info_’ defined but not used
net/spdy/spdy_protocol_test.cc:73:1: error: ‘::SpdyProtocolTest_DataFrameStructs_Test::test_info_’ defined but not used
net/spdy/spdy_protocol_test.cc:79:1: error: ‘::SpdyProtocolTest_ControlFrameStructs_Test::test_info_’ defined but not used
net/spdy/spdy_protocol_test.cc:125:1: error: ‘<unnamed>::SpdyProtocolTest_TestDataFrame_Test::test_info_’ defined but not used
net/spdy/spdy_protocol_test.cc:168:1: error: ‘::SpdyProtocolTest_TestSpdySettingsFrame_Test::test_info_’ defined but not used
net/spdy/spdy_protocol_test.cc:217:1: error: ‘::SpdyProtocolDeathTest_TestDataFrame_Test::test_info_’ defined but not used
net/spdy/spdy_protocol_test.cc:234:1: error: ‘::SpdyProtocolDeathTest_TestSpdyControlFrameStreamId_Test::test_info_’ defined but not used
net/spdy/spdy_protocol_test.cc:249:1: error: ‘::SpdyProtocolDeathTest_TestSpdyControlFrameVersion_Test::test_info_’ defined but not used
net/spdy/spdy_protocol_test.cc:270:1: error: ‘::SpdyProtocolDeathTest_TestSpdyControlFrameType_Test::test_info_’ defined but not used
make: *** [out/Debug/obj.target/spdy_test/net/spdy/spdy_protocol_test.o] Error 1
Gah!

It seems I have run afowl of life on the bleeding edge: Issue 16: Build failure using GCC 4.5.2 on Gentoo.

I started out with mod_spdy to retain some comfort level. Given that, I am not going to try to investigate C++ errors (at least not tonight). Instead... to the VM!

Specifically, I retrace my steps on an Ubuntu 10.10 VM:
chris@chris-VirtualBox:~/spdy/mod_spdy/src$ make
...
CXX(target) out/Debug/obj.target/spdy_test/net/spdy/spdy_framer_test.o
LINK(target) out/Debug/spdy_test
CC(target) out/Debug/obj.target/mod_diagnostics/third_party/mod_diagnostics/mod_diagnostics.o
third_party/mod_diagnostics/mod_diagnostics.c: In function ‘diagnostic_ofilter’:
third_party/mod_diagnostics/mod_diagnostics.c:73: warning: format not a string literal and no format arguments
third_party/mod_diagnostics/mod_diagnostics.c: In function ‘diagnostic_ifilter’:
third_party/mod_diagnostics/mod_diagnostics.c:102: warning: format ‘%d’ expects type ‘int’, but argument 10 has type ‘apr_off_t’
SOLINK(target) out/Debug/obj.target/third_party/mod_diagnostics/libmod_diagnostics.so
COPY out/Debug/libmod_diagnostics.so
TOUCH out/Debug/obj.target/build/All.stamp
I guess that qualifies as success. At least it didn't exit with an error code.

Lacking any documentation, I locate what looks to be an Apache module in mod_spdy/src/out/Debug:
chris@chris-VirtualBox:~/spdy/mod_spdy/src/out/Debug$ ls *so
libmod_diagnostics.so  libmod_spdy.so  libmod_static.so
So I copy libmod_spdy.so to /usr/lib/apache2/modules/:
chris@chris-VirtualBox:~/spdy/mod_spdy/src/out/Debug$ sudo cp libmod_spdy.so /usr/lib/apache2/modules/
I then create a load file, spdy.load:
chris@chris-VirtualBox:/etc/apache2/mods-available$ cat spdy.load 
LoadModule spdy_module /usr/lib/apache2/modules/libmod_spdy.so
And, finally enable that module:
chris@chris-VirtualBox:/etc/apache2/mods-enabled$ cd /etc/apache2/mods-enabled/
chris@chris-VirtualBox:/etc/apache2/mods-enabled$ sudo ln -s ../mods-available/spdy.load 
With that, I get a nice little warning about an experimental module when I restart apache:
chris@chris-VirtualBox:/etc/apache2/mods-enabled$ sudo /etc/init.d/apache2 restart
* Restarting web server apache2
[Mon Apr 25 23:50:52 2011] [warn] [0425/235052:WARNING:mod_spdy/mod_spdy.cc(203)] mod_spdy is currently an experimental Apache module. It is not yet suitable for production environments and may have stability issues.
... waiting [Mon Apr 25 23:50:53 2011] [warn] [0425/235053:WARNING:mod_spdy/mod_spdy.cc(203)] mod_spdy is currently an experimental Apache module. It is not yet suitable for production environments and may have stability issues.
...done.
Nice. But does it work?

The answer to that, unfortunately is a resounding no. Attempting to access the web server—either via Chrome or curl proves fruitless. In the apache error log, I find:
[Mon Apr 25 23:35:06 2011] [warn] [0425/233506:WARNING:net/spdy/spdy_framer.cc(243)] Unexpectedly large frame.  Spdy session is likely corrupt.
[0425/233506:FATAL:mod_spdy/common/spdy_stream_distributor.cc(62)] Check failed: false. 
Backtrace:
/usr/lib/apache2/modules/libmod_spdy.so(StackTrace::StackTrace()+0x2c) [0x6062fe]
/usr/lib/apache2/modules/libmod_spdy.so(+0x272b2) [0x5ff2b2]
/usr/lib/apache2/modules/libmod_spdy.so(logging::LogMessage::~LogMessage()+0x7d) [0x608137]
/usr/lib/apache2/modules/libmod_spdy.so(mod_spdy::SpdyStreamDistributor::OnError(spdy::SpdyFramer*)+0x88) [0x6287b2]
/usr/lib/apache2/modules/libmod_spdy.so(spdy::SpdyFramer::set_error(spdy::SpdyFramer::SpdyError)+0xd5) [0x621617]
/usr/lib/apache2/modules/libmod_spdy.so(spdy::SpdyFramer::ProcessDataFramePayload(char const*, unsigned int)+0x173) [0x622343]
/usr/lib/apache2/modules/libmod_spdy.so(spdy::SpdyFramer::ProcessInput(char const*, unsigned int)+0x1e6) [0x62186e]
/usr/lib/apache2/modules/libmod_spdy.so(mod_spdy::SpdyFramePump::PumpAtMost(unsigned int)+0x139) [0x627987]
/usr/lib/apache2/modules/libmod_spdy.so(mod_spdy::SpdyFramePump::PumpMoreBytes()+0x18e) [0x627740]
/usr/lib/apache2/modules/libmod_spdy.so(mod_spdy::SpdyFramePump::PumpOneFrame()+0x33) [0x62754b]
/usr/lib/apache2/modules/libmod_spdy.so(mod_spdy::SpdyInputFilter::Read(ap_filter_t*, apr_bucket_brigade*, ap_input_mode_t, apr_read_type_e, long long)+0x100) [0x600152]
/usr/lib/apache2/modules/libmod_spdy.so(+0x26968) [0x5fe968]
/usr/sbin/apache2(ap_get_brigade+0x43) [0x79cf13]
/usr/sbin/apache2(ap_rgetline_core+0xa1) [0x7837b1]
/usr/sbin/apache2(ap_read_request+0x261) [0x784191]
/usr/sbin/apache2(+0x43fde) [0x7a0fde]
/usr/sbin/apache2(ap_run_process_connection+0x61) [0x7999c1]
/usr/sbin/apache2(+0x4db4b) [0x7aab4b]
/usr/lib/libapr-1.so.0(+0x25bc5) [0x286bc5]
/lib/libpthread.so.0(+0x5cc9) [0xb4ecc9]
/lib/libc.so.6(clone+0x5e) [0x35e6ae]
[Mon Apr 25 23:35:06 2011] [notice] child pid 1697 exit signal Trace/breakpoint trap (5)
Bah! This looks to be due to mod_spdy being dead code. The SPDY specification has progressed to draft 2, while mod_spdy has been stuck on the original draft since it was abandoned.

Bummer. Looks like I will get to code implementations sooner than expected. Tomorrow.

Day #1

4 comments:

  1. Hi Chris,

    Sorry the module did not work for you. We had put it on hold for a period but have picked up development again. You can try out mod_spdy here: http://code.google.com/p/mod-spdy/wiki/GettingStarted

    ReplyDelete
  2. @Bryan Yay! Good news :)

    I put an update at the top of the post encouraging folks to give it a try.

    ReplyDelete
  3. Thanks Chris!

    Any chance you are able to change the title of the post? When I Google "mod_spdy" the current post title "Don't bother with mod_spdy" comes up. I don't want people to get discouraged from trying the module based on the title (though if they do click through to the post they will see your update which is great). I can't remember if you're able to change blogger post titles or not. If not, no big deal. If so, would be much appreciated.

    Either way, thanks for updating!

    ReplyDelete
    Replies
    1. Done. I can't change the URL, but can change the title.

      Crazy that this useless post has Google juice :P

      Delete